nimeinuma

    1. 1个16按键 的程序问题。 4/3047 嵌入式系统 2009-12-10
      看你的程序麻烦 你可以先取得按键的值 0----F 这样如果没错的话  就说明你的矩阵键盘的程序没有问题  然后再去做键值平方的问题 给你一个4*4矩阵键盘的程序参考 /**************************************************************************** * 文件名:KeyArray.C * 功能:有按键矩阵控制数码管显示0~F * 硬件说明: * 用1根8位连接线。将数码管部份的数据口 接到CPU部份的P0口 * 用1根8位连接线。将数码管部份的数据口 接到CPU部份的P2口 * 用1根8位连接线。将按键矩阵部份的数据口 接到CPU部份的P1口 ****************************************************************************/ #include #define LedBit P2_1                //选择第二个7段数码管(为0有效) #define PortSegLed P0                //数据输出显示七段数据 #define PortKeyCtrl P1                //键盘控制端(列线P1.0-1.3)                                 //(行线P1.4-1.7) #define KeyCtrlColm1 P1_4        #define KeyCtrlColm2 P1_5   #define KeyCtrlColm3 P1_6 #define KeyCtrlColm4 P1_7 unsigned char temp; unsigned char key; unsigned char i,j; //定义轮流显示的键盘值,因为无法表达*# 就用H表示,B用8表示 unsigned table[]=        {        0x28,0x34,0x28,0x34,        //0h0h                                 0xa9,0x60,0x20,0x7a,        //c987                                 0x20,0x21,0x61,0x74,        //8654                                 0x30,0x62,0xa2,0x7e        //a321                         }; //*********************************************************** //函数名称:Delay1s() //函数功能:延时k ms函数 //入口参数:k(1-128) //出口参数:无 //*********************************************************** void Delaykms(unsigned char k) {   unsigned char n,s;   for(n=2*k;n>0;n--)   for(s=248;s>0;s--); } void main(void) {           while(1)           {               PortKeyCtrl=0xff;                         //矩阵按键控制端输出全1               KeyCtrlColm1=0;                         //选择扫描第一列                              temp=PortKeyCtrl;                         //读按键控制端               temp=temp & 0x0f;                         //读取键值               if (temp!=0x0f)                         //如果键值不为0x0f         {                   Delaykms(25);                         //延时25ms                   temp=PortKeyCtrl;                 //读按键控制端                   temp=temp & 0x0f;                 //读取键值                   if (temp!=0x0f)                 //如果键值仍不为0x0f             {                      switch(temp)                         //对读取的键值分配对应键码                 {                           case 0x0e:                             key=0;                             break;                           case 0x0d:                             key=4;                             break;                           case 0x0b:                             key=8;                             break;                           case 0x07:                             key=12;                             break;                 }                       LedBit=0;                   //开显示位                       PortSegLed=table[key];    //显示键值                       temp=PortKeyCtrl;          //读按键控制端                       temp=temp & 0x0f;         //读取键值                             while(temp!=0x0f)           //如果键值不为0x0f                 {                           temp=PortKeyCtrl; //读按键控制端                           temp=temp & 0x0f; //读取键值                             }             }         }                  PortKeyCtrl=0xff;               KeyCtrlColm2=0;               temp=PortKeyCtrl;               temp=temp & 0x0f;               if (temp!=0x0f)         {                   Delaykms(25);                   temp=PortKeyCtrl;                   temp=temp & 0x0f;                   if (temp!=0x0f)             {                       switch(temp)                 {                           case 0x0e:                             key=1;                             break;                           case 0x0d:                             key=5;                             break;                           case 0x0b:                             key=9;                             break;                           case 0x07:                             key=13;                             break;                 }                       LedBit=0;                                                       PortSegLed=table[key];                               temp=PortKeyCtrl;                       temp=temp & 0x0f;                             while(temp!=0x0f)                 {                           temp=PortKeyCtrl;                           temp=temp & 0x0f;                               }             }         }                  PortKeyCtrl=0xff;               KeyCtrlColm3=0;               temp=PortKeyCtrl;               temp=temp & 0x0f;               if (temp!=0x0f)         {                   Delaykms(25);                     temp=PortKeyCtrl;                   temp=temp & 0x0f;                   if (temp!=0x0f)             {                       switch(temp)                 {                           case 0x0e:                             key=2;                             break;                           case 0x0d:                             key=6;                             break;                           case 0x0b:                             key=10;                             break;                           case 0x07:                             key=14;                             break;                 }                        LedBit=0;                 //开显示位                       PortSegLed=table[key];         //显示键值                       temp=PortKeyCtrl;                       temp=temp & 0x0f;                                   while(temp!=0x0f)                 {                           temp=PortKeyCtrl;                           temp=temp & 0x0f;                               }             }         }                  PortKeyCtrl=0xff;               KeyCtrlColm4=0;               temp=PortKeyCtrl;               temp=temp & 0x0f;               if (temp!=0x0f)         {                   Delaykms(25);                   temp=PortKeyCtrl;                   temp=temp & 0x0f;                   if (temp!=0x0f)             {                       switch(temp)                 {                           case 0x0e:                             key=3;                             break;                           case 0x0d:                             key=7;                             break;                          case 0x0b:                             key=11;                             break;                          case 0x07:                             key=15;                             break;                 }                        LedBit=0;                 //开显示位                       PortSegLed=table[key];         //显示键值                       temp=PortKeyCtrl;                       temp=temp & 0x0f;                          while(temp!=0x0f)                 {                           temp=PortKeyCtrl;                           temp=temp & 0x0f;                               }             }         }     } }

最近访客

< 1/1 >

统计信息

已有40人来访过

  • 芯积分:--
  • 好友:--
  • 主题:--
  • 回复:1

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言