⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key.lst

📁 4个键盘测试程序 4个键盘测试程序
💻 LST
字号:
C51 COMPILER V8.08   KEY                                                                   07/28/2008 20:51:10 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE KEY
OBJECT MODULE PLACED IN KEY.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE KEY.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*硬件连接:段选码P0.0~P0.7(a,b,c,d,e,f,g,h,dp),位选码P2.4~P2.7(低到高)
   2            K1--P3.5;K2--P3.4;K3--P3.3;K4--P3.2*/
   3          
   4          #include "reg52.h"
   5          #include "intrins.h"
   6          #define uchar unsigned char
   7          #define uint  unsigned int 
   8          
   9          #define Hidden 0x10;    //消隐字符在字形码中的位置
  10          uchar code BitTab[]={0xef,0xdf,0xbf,0x7f,0xef,0xdf};
  11          uchar code DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF
             -};
  12          uchar DispBuf[6];       //6字节的显示缓冲区
  13          bit     Sec;                    //1s到的标记
  14          bit Minute;                     //1m到的标记
  15          bit Hour;                       //1h到的标记
  16          bit H_up;
  17          bit H_down;
  18          bit M_up;
  19          bit M_down;
  20          sbit P30=P3^0;          //周期测试位
  21          sbit buzz=P2^3;
  22          sbit P10=P1^0;
  23          sbit P12=P1^2;
  24          sbit P14=P1^4;
  25          sbit P15=P1^5;
  26          sbit P16=P1^6;
  27          sbit P17=P1^7;
  28          uchar SecValue;         //秒计数
  29          uchar MinuteValue;      //分计数
  30          uchar HourValue;        //时计数
  31          
  32          uchar code TH0Val=63075/256;
  33          uchar code TL0Val=63075%256;//晶振为12M,定时2.5ms定时器初值(计算值为63036,校准值为63075)
  34          
  35          
  36          void Timer0() interrupt 1
  37          {       uchar tmp;
  38   1              static uchar dCount;    //计数器,显示程序通过它得知现在显示那个数码管
  39   1              static uint Count;              //秒计数器
  40   1              const uint CountNum=400;        //预置值(400*2.5ms=1minute)
  41   1              P10=~P10;                                  //外部测试位,用于调整定时器初值
  42   1              TH0=TH0Val;
  43   1              TL0=TL0Val;     
  44   1              tmp=BitTab[dCount];             //根据当前的计数值取位值
  45   1              P2=P2|0xf0;                             //P2与11110000相或,将位置1
  46   1              P2=P2&tmp;                              //P2与取出的值相与,将某一位清0
  47   1              tmp=DispBuf[dCount];    //根据当前的计数值,取显示缓冲区的待显示值
  48   1              tmp=DispTab[tmp];               //取字形码
  49   1              P0=tmp;                                 //送出字形码
  50   1              dCount++;                               //计数值加1
  51   1              if(dCount==6)                   //如果计数值为6,归0
  52   1                      dCount=0;       
  53   1      //以下为秒计数
  54   1              Count++;                                //计数值加1
C51 COMPILER V8.08   KEY                                                                   07/28/2008 20:51:10 PAGE 2   

  55   1              if(Count>=CountNum)             //到达预置计数值
  56   1              {       Count=0;                        //清零
  57   2                      Sec=1;
  58   2                      buzz=~buzz;                             //置1秒到标志位
  59   2                      P12=~P12;
  60   2                      SecValue++;                             //秒值加1
  61   2                      if(SecValue>=60)
  62   2                      {       SecValue=0;                     
  63   3                              Minute=1;                //置1分到标志位
  64   3                              MinuteValue++;   //分值加1
  65   3                      }
  66   2                      if(MinuteValue>=60)
  67   2                 {    Hour=1;                   //置1小时到标志位
  68   3                              MinuteValue=0;
  69   3                              HourValue++;      //小时值加1
  70   3                 }
  71   2               }
  72   1               
  73   1      }
  74          
  75          void Init()
  76          {       TMOD=0x01;
  77   1              TH0=TH0Val;
  78   1              TL0=TL0Val;     
  79   1              ET0=1;                          //开T0中断
  80   1              EA=1;                           //开总中断
  81   1              TR0=1;                          //T0开始运行
  82   1      }
  83          
  84          void mDelay(unsigned int Delay)  //延时程序,用于键盘消抖
  85          {       unsigned int i;
  86   1              for(;Delay>0;Delay--)
  87   1              {       for(i=0;i<124;i++)
  88   2                      {;}
  89   2              }
  90   1      }
  91          
  92          uchar Key()                        //键盘程序,获得键值
  93          {       uchar KValue;
  94   1              uchar tmp;
  95   1              P3|=0x3c;                  //将P3口接键盘的4位置1
  96   1              KValue=P3;
  97   1              KValue|=0xc3;           //将未接的四位置1
  98   1              if(KValue==0xff)        //中间4位均为1,无键按下
  99   1                      return(0);              //返回
 100   1              mDelay(10);                     //延时10mS消抖
 101   1              KValue=P3;
 102   1              KValue|=0xc3;            //再次读键盘
 103   1              if(KValue==0xff)
 104   1              return(0);
 105   1              for(;;)
 106   1              {       tmp=P3;
 107   2                      if((tmp|0xc3)==0xff)      //等待按键释放
 108   2                      break;
 109   2              }
 110   1              return(KValue);
 111   1      }
 112          
 113          void KProce(uchar KValue)                 //键值处理程序
 114          {       if((KValue&0x20)==0)              //K1          第5        P3.5
 115   1              H_up=1;
 116   1              P17=~P17;
C51 COMPILER V8.08   KEY                                                                   07/28/2008 20:51:10 PAGE 3   

 117   1              if((KValue&0x10)==0)              //K2          第4             P3.4
 118   1              H_down=1;
 119   1              P16=~P16;
 120   1              if((KValue&0x08)==0)              //K3          第3个   P3.3
 121   1              M_up=1;
 122   1              P15=~P15;
 123   1              if((KValue&0x04)==0)              //K4          第2个    P3.2
 124   1              M_down=1;
 125   1              P14=~P14;
 126   1      }
 127          
 128          
 129          void main()
 130          {       uchar KValue;                   //存放键值
 131   1              Init();                                 //初始化
 132   1              DispBuf[4]=SecValue/10;
 133   1              DispBuf[5]=SecValue%10;
 134   1              
 135   1              for(;;)
 136   1              {
 137   2                   DispBuf[2]=MinuteValue/10;
 138   2               DispBuf[3]=MinuteValue%10;
 139   2                       DispBuf[0]=HourValue/10;
 140   2                   DispBuf[1]=HourValue%10;
 141   2      
 142   2                      if(Sec)                         //1s时间到
 143   2                      {       DispBuf[4]=SecValue/10;
 144   3                              DispBuf[5]=SecValue%10;
 145   3                              
 146   3                              if(DispBuf[4]==0)
 147   3                                      DispBuf[4]=Hidden;              //高位0消隐
 148   3                              Sec=0;                  //清除1s到标志位
 149   3                      }
 150   2      
 151   2                      if(Minute)
 152   2                      {       if(DispBuf[2]==0)
 153   3                                      DispBuf[2]=Hidden;              //高位0消隐
 154   3                              Minute=0;                                       //清除1m到标志位
 155   3                       }
 156   2      
 157   2                       if(Hour)
 158   2                       {      if(DispBuf[0]==0)
 159   3                                      DispBuf[0]=Hidden;              //高位0消隐
 160   3                              Hour=0;                                         //清除1h到标志位
 161   3                       }
 162   2      
 163   2                       KValue=Key();           //调键盘程序获得键值
 164   2                       if(KValue)                      //该值不等于0
 165   2                       {      KProce(KValue);  //调键盘处理程序
 166   3                       }
 167   2                       if(H_up)                          //小时值调整
 168   2                       {      HourValue++;
 169   3                              if(HourValue>=24)
 170   3                              {       HourValue=0;
 171   4                              }
 172   3                              H_up=0; 
 173   3                       }
 174   2                       if(H_down)
 175   2                       {      HourValue--;
 176   3                              H_down=0;
 177   3                       }
 178   2                       if(M_up)                                  //分值调整
C51 COMPILER V8.08   KEY                                                                   07/28/2008 20:51:10 PAGE 4   

 179   2                       {      MinuteValue++;
 180   3                              if(MinuteValue>=60)
 181   3                              {MinuteValue=0;
 182   4                              }
 183   3                              M_up=0; 
 184   3                       }
 185   2                       if(M_down)
 186   2                       {      MinuteValue--;
 187   3                              M_down=0;
 188   3                       }
 189   2              }
 190   1      }
 191                                  
 192          
 193          
 194                              


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    441    ----
   CONSTANT SIZE    =     25    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     12    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      7    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -