矩阵按键识别程序

[复制链接]
3870|11
 楼主| neillan 发表于 2009-11-5 09:30 | 显示全部楼层 |阅读模式
很久没有动51了,回过头来看看自己写的矩阵按键识别程序还是处于初级阶段。为了提高技术,帮助那些初学的人。特开此贴,希望各位大虾把自己写好的程序(一定要在板子上跑过的程序)贴到这个帖子上。首先代表各位小虾米向大虾致敬。谢谢。
 楼主| neillan 发表于 2009-11-5 09:32 | 显示全部楼层
我先来吧,我写的程序采用分支判断结构(P1接按键,P0接数码管,P2控制数码管显示),程序如下:
#include "reg51.h"
#include "intrins.h"

unsigned  char code  
LEData[4][4]={        0x28,0x34,0x28,0x34,
                                0xa9,0x60,0x20,0x7a,
                                0x20,0x21,0x61,0x74,
                                0x30,0x62,0xa2,0x7e
                                                                        }; //定义的显示数据


void delayms(unsigned int ms);                   //预定义延时函数

void main()
{
        unsigned char row,line;            //定义函数的行和列

        P0=0xff;P1=0xff;P2=0xef;                   //对系统进行初始化
        while(1)
        {                                                                   //将行线置为低位,将列线置为高位
                 P1=0x0f;                                           //判断是否有按键按下
                if(P1!=0x0f)
                {
                        delayms (100);                           //延时,对按键进行防抖处理
                        if(P1!=0x0f)                           //确认按键是否按下
                         {                                                   //判断P1口的状态,确定按键的下标
                            switch(P1)
                                {
                                        case 0x07 : row=0;
                                        break;
                                        case 0x0B : row=1;
                                        break;
                                        case 0x0D : row=2;
                                        break;
                                        case 0x0E : row=3;
                                        break;
                                }
                         }
                 }
                        delayms (20);                           //延时一段时间
                 P1=0xf0;                                           //反置列线和行线的状态
                if(P1!=0xf0)                                   //判断是否有按键按下
                {
                        delayms (100);                           //延时,对按键进行防抖处理
                        if(P1!=0xf0)                           //确认按键是否按下
                         {
                            switch(P1)                           //判断P1口的状态,确定按键的下标
                                {
                                        case 0x70 : line=0;
                                        break;
                                        case 0xB0 : line=1;
                                        break;
                                        case 0xD0 : line=2;
                                        break;
                                        case 0xE0 : line=3;
                                        break;
                                }
                         }
                           P0=LEData[row][line];   //确定按键位置后将具体值传给P0

                 }

                 else P0=0xff;                                   //在无按键输入的情况下数码管无输出
                 delayms (20);                                   //松开按键时的防抖处理



        }
               
}


void delayms(unsigned int ms)                   //延时n毫秒的处理函数
{
   char k;
   while(ms--)
   {
             for(k=0;k<120;k++);                           //延时1毫秒的处理函数
       
        }
}
taoyubai 发表于 2009-11-5 09:49 | 显示全部楼层
路过,赞一个
IC_99 发表于 2009-11-5 22:50 | 显示全部楼层
好东西
dong2007 发表于 2009-11-6 06:48 | 显示全部楼层
摆渡一搜,多的是!
bondid 发表于 2010-1-21 11:38 | 显示全部楼层
本帖最后由 bondid 于 2010-1-21 11:40 编辑

:) ;p :p ;P
liyinchao 发表于 2010-1-23 07:44 | 显示全部楼层
2# neillan
这程序,效率低呀
兄弟还有进步的余地啊
liyinchao 发表于 2010-1-23 08:02 | 显示全部楼层
本帖最后由 liyinchao 于 2010-1-23 08:12 编辑

  1. //-----LED&KEY.c-------
  2. #include"HardWare.h"
  3. #define        MaxBit        7  //最大显示位数7位
  4. #define Timer0_Tmp        60000  //调节刷新频率
  5. #define Timer1_Tmp        60000
  6. #define Max_Key_Time 30
  7. uchar code WordTAB[]={0xed,0x09,0x7c,0x5d,0x99,0xd5,0xf5,0x49,0xfd,0xdd,0x10};
  8. uchar code DigTAB[]={0x1f,0x3f,0x5f,0x7f,0x9f,0xbf,0xdf,0xff};
  9. uchar DisplayBuf[7];                //显示缓冲区
  10. uchar WordBit;
  11. uchar Key_Press;
  12. uchar Key_Time;
  13. uchar Key;
  14. void Display_Init(void)
  15. {
  16.     //TMOD=0x15;                    //16位数方式(设方式)
  17.         TMOD=0x51;                    //16位数方式(设方式)
  18.     TH0=Timer0_Tmp/256;
  19.     TL0=Timer0_Tmp%256;
  20.     TH1=Timer1_Tmp/256;
  21.     TL1=Timer1_Tmp%256;//(赋初值)

  22.     ET0=1;   
  23.     ET1=1;   //开中断

  24.     TR0=1;
  25.     TR1=1; //启动之

  26.     EA=1;
  27.     WordBit=0;
  28.     DisplayBuf[0]=WordTAB[1];
  29.     DisplayBuf[1]=WordTAB[2];
  30.     DisplayBuf[2]=WordTAB[3];
  31.     DisplayBuf[3]=WordTAB[4];
  32.         DisplayBuf[4]=WordTAB[5];
  33.         DisplayBuf[5]=0;
  34.         DisplayBuf[6]=0;
  35. }
  36. void DisPlay(void)
  37. {
  38.     WordBit++;
  39.     if(WordBit>=MaxBit)   
  40.     WordBit=0;
  41.     Dig_Port=DigTAB[WordBit];                        //选择位
  42.     Word_Port=DisplayBuf[WordBit];                //输出显示内容
  43.         Key_Press=0;
  44.     if((Key_Port&0x0f)!=0x0f)
  45.                 {
  46.                         Key_Press=1;
  47.                 }  

  48. }
  49. void Timer0_ISR(void) interrupt 1 using 1
  50. {
  51.     TH0=Timer0_Tmp/256;
  52.     TL0=Timer0_Tmp%256;
  53.         DisPlay();
  54.         if(Key_Press)
  55.         Key_Time++;
  56.         if(Key_Time>=Max_Key_Time)
  57.         {
  58.                 Key_Time=0;
  59.                 Key=Key_Port;
  60.         }            
  61. }
  62. void Timer1_ISR(void) interrupt 3 using 3
  63. {   
  64.     TH1=Timer1_Tmp/256;
  65.     TL1=Timer1_Tmp%256;
  66. }

  1. //-----Test.c---------------------------
  2. #include"hardware.h"

  3. extern void Display_Init(void);
  4. extern uchar Key_Press;
  5. extern uchar Key_Time;
  6. extern uchar code WordTAB[];
  7. extern uchar code DigTAB[];
  8. extern uchar DisplayBuf[];
  9. extern uchar Key;
  10. uchar MotoState;
  11. long CoilsCount;


  12. void Num_Display(long Num);
  13. void main(void)
  14. {
  15.         Display_Init();

  16.         while(1)
  17.         {
  18.                
  19.                 switch(Key)
  20.                 {
  21.                         case KEY_0:
  22.                         CoilsCount*=10;
  23.                         Num_Display(CoilsCount);        
  24.                         Key=0;               
  25.                         break;
  26.                         case KEY_1:
  27.                         CoilsCount=CoilsCount*10+1;
  28.                         Num_Display(CoilsCount);
  29.                         Key=0;
  30.                         break;
  31.                         case KEY_2:
  32.                         CoilsCount=CoilsCount*10+2;
  33.                         Num_Display(CoilsCount);
  34.                         Key=0;
  35.                         break;
  36.                         case KEY_3:
  37.                         CoilsCount=CoilsCount*10+3;
  38.                         Num_Display(CoilsCount);
  39.                         Key=0;
  40.                         break;
  41.                         case KEY_4:
  42.                         CoilsCount=CoilsCount*10+4;
  43.                         Num_Display(CoilsCount);
  44.                         Key=0;
  45.                         break;
  46.                         case KEY_5:
  47.                         CoilsCount=CoilsCount*10+5;
  48.                         Num_Display(CoilsCount);
  49.                         Key=0;
  50.                         break;
  51.                         case KEY_6:
  52.                         CoilsCount=CoilsCount*10+6;
  53.                         Num_Display(CoilsCount);
  54.                         Key=0;
  55.                         break;
  56.                         case KEY_7:
  57.                         CoilsCount=CoilsCount*10+7;
  58.                         Num_Display(CoilsCount);
  59.                         Key=0;
  60.                         break;
  61.                         case KEY_8:
  62.                         CoilsCount=CoilsCount*10+8;
  63.                         Num_Display(CoilsCount);
  64.                         Key=0;
  65.                         break;
  66.                         case KEY_9:
  67.                         CoilsCount=CoilsCount*10+9;
  68.                         Num_Display(CoilsCount);
  69.                         Key=0;
  70.                         break;
  71.                         
  72.                         case KEY_Star:
  73.                         CoilsCount=0;
  74.                         Num_Display(CoilsCount);
  75.                         Key=0;
  76.                         break;
  77.                         
  78.                         case KEY_Sharp:
  79.                         
  80.                         break;
  81.                
  82.                         case KEY_Run_Stop:
  83.                         if(MotoState==Run)
  84.                         MotoState=Stop;
  85.                         else
  86.                         MotoState=Run;
  87.                         break;
  88.                
  89.                         default:
  90.                         break;
  91.                 }
  92.         
  93.                  
  94.         }
  95. }

  96. void Num_Display(ulong Num)
  97. {
  98.         uchar N;
  99.         ulong Temp;
  100.         Temp=Num;        
  101.         for(N=0;N<5;N++)
  102.         {
  103.                 DisplayBuf[N]=WordTAB[Temp%10];
  104.                 Temp/=10;
  105.         }
  106.         if(Num<10000)
  107.         DisplayBuf[4]=0;
  108.         if(Num<1000)
  109.         DisplayBuf[3]=0;
  110.         if(Num<100)
  111.         DisplayBuf[2]=0;
  112.         if(Num<10)
  113.         DisplayBuf[1]=0;

  114. }

  1. //-------hardware.h---------
  2. #include"Reg52.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define ulong unsigned long
  6. #define Word_Port  P2
  7. #define Dig_Port P0
  8. #define Key_Port  P0
  9. #define SPI_Port P1
  10. sbit MISO=P1^0;
  11. sbit MOSI=P1^1;
  12. sbit SCLK=P1^2;
  13. sbit CS  =P1^3;

  14. #define KEY_1 0x1b   //1
  15. #define KEY_2 0x1d
  16. #define KEY_3 0x1e
  17. #define KEY_4 0x3b
  18. #define KEY_5 0x3d
  19. #define KEY_6 0x3e
  20. #define KEY_7 0x5b
  21. #define KEY_8 0x5d
  22. #define KEY_9 0x5e
  23. #define KEY_Star  0x7b   //*
  24. #define KEY_0  0x7d  //0
  25. #define KEY_Sharp  0x7e //#
  26. #define KEY_Run_Stop 0x9e//启动/停止
  27. #define Run 1
  28. #define Stop 0

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
liyinchao 发表于 2010-1-23 08:14 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
liyinchao 发表于 2010-1-23 08:15 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
funcye 发表于 2010-1-24 14:01 | 显示全部楼层
做个标记,不错耶
display8989 发表于 2011-7-24 15:56 | 显示全部楼层
这种调用延时不是很耗资源?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

14

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部