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

📄 kb.lst

📁 4*4键盘检测程序
💻 LST
字号:
C51 COMPILER V7.09   KB                                                                    07/10/2008 01:17:34 PAGE 1   


C51 COMPILER V7.09, COMPILATION OF MODULE KB
OBJECT MODULE PLACED IN kb.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE kb.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2          
   3          
   4          #include <reg52.h>
   5          
   6          #define uchar unsigned char
   7          
   8          sbit P10=P1^0;
   9          
  10          unsigned char BUFF[8];
  11          
  12          uchar key;
  13          
  14          
  15          
  16          unsigned int C,D,E,F;
  17          
  18          unsigned char i,j,k,Temp,PD,TX,TXL,ALS,ALSL;
  19          
  20          //向串口输出一个字符(非中断方式) 
  21          void ComOutChar(unsigned char OutData) 
  22          { 
  23   1      SBUF = OutData; //输出字符 
  24   1      while(!TI); //空语句判断字符是否发完 
  25   1      TI = 0; //清TI 
  26   1      } 
  27          
  28          
  29          //串口初始化
  30          void init_serialcomm(void)
  31          {
  32   1          SCON= 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr 
  33   1          TMOD= 0x21;       //TMOD: timer 1, mode 2, 8-bit reload 
  34   1          PCON= 0x80;       //SMOD=1; 
  35   1          TH1=0xfa;
  36   1          TL1=0xfa;           //Baud:9600   fosc=11.0592MHz
  37   1          ES=1;
  38   1          TR1= 1;          //timer 1 run 
  39   1      }
  40          
  41          //10ms定时器初始化
  42          void init_timer(void)
  43          {
  44   1          TMOD=0x21;           //timer0:16bit unreload  timer1:16bit unreload
  45   1          TH0=-(9216/256);     //load timer0 (10ms per interrupt 11.0592MHz)
  46   1          TL0=-(9216%256); 
  47   1          ET0=1;               //T/C0开中断  
  48   1          TR0=1;               //启动定时器
  49   1      }
  50          //利用定时器0的方式1编程,采用中断方式
  51          void timer0 (void) interrupt 1 
  52          {
  53   1          TH0=-(9216/256);  //load timer0 (10ms per interrupt 11.0593MHz)
  54   1          TL0=-(9216%256);
  55   1      
C51 COMPILER V7.09   KB                                                                    07/10/2008 01:17:34 PAGE 2   

  56   1          F=F+1;
  57   1          
  58   1      
  59   1                  if(F==100)   //0.20秒时间到,检测是否有报警
  60   1              
  61   1                      {
  62   2              
  63   2                       F=0; 
  64   2              
  65   2                   P10=!P10; 
  66   2              
  67   2                   C=1;
  68   2      
  69   2               
  70   2              
  71   2                      }
  72   1      
  73   1      
  74   1      
  75   1      }
  76          
  77          //串行中断程序
  78          void serial () interrupt 4 using 3 
  79          {
  80   1      
  81   1         if(RI)//当接受完一个字节后
  82   1          {
  83   2                 
  84   2                
  85   2                 Temp=SBUF;
  86   2             
  87   2             if (Temp!=0x80)
  88   2      
  89   2                 {
  90   3      
  91   3                   BUFF[j]=Temp;
  92   3      
  93   3                   j=j+1;
  94   3      
  95   3                 }
  96   2      
  97   2             
  98   2      
  99   2             if (Temp==0x80)  //命令接收完成,置位PD
 100   2                 {
 101   3      
 102   3                   j=0;
 103   3      
 104   3                   PD=0x01;  
 105   3      
 106   3                 }
 107   2      
 108   2             RI=0;
 109   2      
 110   2          }
 111   1      
 112   1       
 113   1      
 114   1      
 115   1      
 116   1      }
 117          
C51 COMPILER V7.09   KB                                                                    07/10/2008 01:17:34 PAGE 3   

 118          void delay10ms(void)   //10毫秒延时程序
 119          
 120          {
 121   1              unsigned char i,j,k;
 122   1               for(i=5;i>0;i--)
 123   1               for(j=4;j>0;j--)
 124   1               for(k=248;k>0;k--);  //248
 125   1      }
 126          
 127          
 128          
 129          uchar kbscan(void)    // 键盘扫描程序
 130          {
 131   1      
 132   1      uchar sccode,recode;
 133   1      
 134   1      P0=0xf0;             //置所有行为低电平,行扫描,列线输入(此时)
 135   1      
 136   1      if((P0&0xf0)!=0xf0) //判断是否有有键按下(读取列的真实状态,若第4列有键按下则P1的值会变成0111             
             -          0000),有往下执行
 137   1      {
 138   2         delay10ms();                   //延时去抖动(10ms)
 139   2         if((P0&0xf0)!=0xf0)         //再次判断列中是否是干扰信号,不是则向下执行
 140   2         {
 141   3          sccode=0xFE;           //逐行扫描初值(即先扫描第1行) 
 142   3          while((sccode&0x10)!=0)//行扫描完成时(即4行已经全部扫描完成)sccode为1110 1111 停止while程序     
 143   3          {
 144   4           P0=sccode;                 //输出行扫描码
 145   4      if ((P0&0xf0)!=0xf0)           //本行有键按下(即P1(真实的状态)的高四位不全为1)
 146   4           {
 147   5            recode=(P0&0xf0)|0x0f; //列
 148   5            return(sccode&recode); //返回行和列
 149   5           }
 150   4                else //所扫描的行没有键按下,则扫描下一行,直到4行都扫描
 151   4               {
 152   5                 sccode=(sccode<<1)|0x01;//行扫描码左移一位
 153   5                }
 154   4               }
 155   3              }
 156   2      }
 157   1                else
 158   1      {
 159   2                 return 0;        //无键按下,返回0
 160   2      }
 161   1      }
 162          
 163          
 164          
 165          
 166          //主函数入口
 167          void main(void)
 168          {   
 169   1          
 170   1      
 171   1        
 172   1          init_timer();
 173   1          init_serialcomm();
 174   1          EA=1;
 175   1          TR0=1;
 176   1          ES=1;
 177   1          while(1)
 178   1      
C51 COMPILER V7.09   KB                                                                    07/10/2008 01:17:34 PAGE 4   

 179   1          {
 180   2      
 181   2            if (C==1) 
 182   2      
 183   2            {
 184   3      
 185   3              C=0;
 186   3      
 187   3              key=kbscan();
 188   3      
 189   3      
 190   3                      if (key!=0x00)
 191   3                      
 192   3                      {
 193   4                         ComOutChar(key);
 194   4      
 195   4                 
 196   4              }
 197   3      
 198   3             
 199   3      
 200   3            }
 201   2      
 202   2              }
 203   1              
 204   1      }
 205           


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    233    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     26    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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