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

📄 key.lst

📁 CH451专用键盘扫描
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.07   KEY                                                                   04/06/2006 10:20:44 PAGE 1   


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

stmt level    source

   1          #include <intrins.h>
   2          #include <absacc.h>
   3          #include "main.h"
   4          #include "mcs51.h"
   5          #include "io_define.h"
   6          #include "ch451.h"
   7          
   8          void deal_menu(uchar type,uchar num2);
   9          void deal_device_num(void);
  10          void write_menu_word(uchar n);
  11          void display_main_menu(void);
  12          void deal_enable(uchar num);
  13          void display_second_menu(uchar type);
  14          void init_CPU();
  15          void putchar(unsigned char ch);
  16          void putchar1(unsigned char ch);
  17          
  18          bit rcv_bit=0;
  19          bit key_bit=0;
  20          bit led_time_over_bit=0;
  21          bit dat_changed_bit=0;
  22          uchar key_buff[3];
  23          uchar key_times=0;
  24          uchar bdata keyset_enable;
  25          uchar key;
  26          uchar rcv_byte=0x00;
  27          
  28          uchar idata t50ms=0,t50ms1=0;
  29          uchar idata t1s1=0,t1s2=0,t1s3=0;
  30          uchar idata t1m1=0,t1m2=0,t1m3=0,t1h1=0,times;
  31          
  32          uchar xdata ppout[2]={33,44};
  33          uchar xdata att[2]={15,16};
  34          uchar xdata gate[6]={55,55,66,66,66,66};
  35          uchar xdata     device_num[4]={9,5,1,9};
  36          
  37          uchar code      led_num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  38          uchar code      num_bit[9]={0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
  39          
  40          
  41          void main(void)
  42          {
  43   1              uchar temp=0xff;
  44   1              uchar hh=0;
  45   1              
  46   1              init_CPU();
  47   1              init_ch451();
  48   1              AUXR=0X00;
  49   1              
  50   1              display_led(2,0x11);
  51   1              
  52   1              display_led(7,0xff);
  53   1              display_led(6,0xff);
  54   1              display_led(5,0xff);
  55   1              display_led(4,0xff);
C51 COMPILER V7.07   KEY                                                                   04/06/2006 10:20:44 PAGE 2   

  56   1              display_led(3,0xff);
  57   1      
  58   1              putchar('f');
  59   1              
  60   1              while(t1s3<2);
  61   1              clear_led();
  62   1              
  63   1              putchar('B');
  64   1              
  65   1              while(1)
  66   1              {       
  67   2                      //putchar('c');
  68   2                      
  69   2                      temp=get_key();
  70   2                      if(temp>=0x40)
  71   2                      {       key=temp;
  72   3                              key_bit=1;
  73   3                      }
  74   2                      else key_bit=0;
  75   2                              
  76   2                      if(key_bit)     // 按键处理.added.06-03-18
  77   2                      {
  78   3                              putchar(0x59);
  79   3                              putchar(key);
  80   3                              key_bit=0;
  81   3                              do{temp= get_key();}while((temp&0x40)!=0x00);   // 等待按键松开.
  82   3                              putchar('w');
  83   3                              
  84   3                              if(key==KEY_ENTER)
  85   3                              {
  86   4                                      display_main_menu();    //进入菜单处理.
  87   4                                      clear_led();    // 数码管清 0 .
  88   4                                      putchar('x');
  89   4                              }
  90   3                              key_bit=0;      // added by gao.06-03-22
  91   3                              led_time_over_bit=0;
  92   3                              putchar(0x88);
  93   3                      }
  94   2              }
  95   1      }
  96          
  97          void T0_INT() interrupt 1  // using 2
  98          {
  99   1              TR0=0;
 100   1              TH0=TH0+0x4c; //TL0=0xe0; // T0=5ms
 101   1              t50ms++;
 102   1              t50ms1++;
 103   1      
 104   1              if(t50ms>=20)
 105   1              {       t50ms=0;
 106   2                      t1s1++;
 107   2                      t1s2++;
 108   2                      t1s3++;
 109   2                      
 110   2                      /*putchar(0x22);
 111   2                      putchar(0x33);
 112   2                      putchar(t1s1);*/
 113   2              }
 114   1      
 115   1              if(t1s2>=60)
 116   1              {       t1m1++;
 117   2                      t1m2++;
C51 COMPILER V7.07   KEY                                                                   04/06/2006 10:20:44 PAGE 3   

 118   2                      t1m3++;
 119   2                      t1s2=0;
 120   2              }
 121   1      
 122   1              if(t1m2>=60)
 123   1              {       t1m2=0;
 124   2                      t1h1++;
 125   2              }
 126   1              TR0=1;
 127   1      }
 128          
 129          void init_CPU()
 130          {
 131   1              //WDTC=100;     // 需要针对 STC89C58RD+ 作修改.
 132   1      
 133   1              SCON=0x50;
 134   1              TMOD=0x21; // T1:baut,T0:Time 16bit
 135   1              TCON=0x50; // TR0,TR1=1
 136   1              TH1=0xfd;TL1=0xfd;PCON=0; // Uart Baut=9600
 137   1          TH0=0x4c;TL0=0x00;  // T0=50ms
 138   1              IE=0x92; //开全局中断,定时器0。串口中断。
 139   1              IP=0x10; // UART高
 140   1              AUXR=0x02;//内部XRAM,ALE为1/6FOSC,AUXR=0x02外部XRAM
 141   1      }
 142          
 143          void deal_device_num(void)
 144          {
 145   1              uchar i;
 146   1              uchar check_key;
 147   1              uchar right_key=0;      // 选择位,初始为第一位.
 148   1              uchar num[4];
 149   1      
 150   1              display_led(7,LED_N|0x80);
 151   1      
 152   1              // 读出本机编号显示.
 153   1              
 154   1              for(i=0;i<4;i++)
 155   1              {
 156   2                      num[i]=device_num[i];
 157   2                      display_led(6-i,led_num[num[i]]);
 158   2              }
 159   1              
 160   1              display_led(6,led_num[num[0]]|0x80);    // 默认进入时选择最高位,显示小数点.
 161   1              
 162   1              ////EX0=1;
 163   1              t1s1=0; // 显示以后再开始计时.
 164   1              //while((key_bit==0)&&(t1s1<=30));
 165   1              while(1)
 166   1              {
 167   2                      if(t1s1>=30)    // 超时退出.
 168   2                      {       t1s1=0;
 169   3                              led_time_over_bit=1;
 170   3                              break;
 171   3                      }
 172   2                      
 173   2                      check_key=get_key();
 174   2                      if(check_key>=0x40)
 175   2                      {
 176   3                              key=check_key;
 177   3                              key_bit=1;
 178   3                      }
 179   2                      else key_bit=0;
C51 COMPILER V7.07   KEY                                                                   04/06/2006 10:20:44 PAGE 4   

 180   2                      
 181   2              if(key_bit)     // 对按键处理.
 182   2              {
 183   3                      do{check_key=get_key();}while((check_key&0X40)!=0X00);  // 等待按键松开.
 184   3                      key_bit=0;
 185   3                      t1s1=0;
 186   3      
 187   3                      if(key==KEY_UP)
 188   3                      {
 189   4                              if(num[right_key]>0)
 190   4                                      num[right_key]--;
 191   4                              display_led(6-right_key,0x80|led_num[num[right_key]]);
 192   4                      }
 193   3      
 194   3                      else if(key==KEY_DOWN)
 195   3                      {
 196   4                              if(num[right_key]<9)
 197   4                                      num[right_key]++;
 198   4                              display_led(6-right_key,0x80|led_num[num[right_key]]);
 199   4      
 200   4                      }
 201   3      
 202   3                      else if(key==KEY_RIGHT)
 203   3                      {       display_led(6-right_key,led_num[num[right_key]]);       // 去掉原来表示选择该位的点显示.
 204   4                              right_key++;
 205   4                                      if(right_key>=4)
 206   4                                              right_key=0;
 207   4                                      display_led(6-right_key,0x80|led_num[num[right_key]]);
 208   4                      }
 209   3      
 210   3                      else if(key==KEY_ENTER) // 本机编号显示,修改单独处理.
 211   3                      {
 212   4                              for(i=0;i<4;i++)
 213   4                              {
 214   5                                      device_num[i]=num[i];
 215   5                                              putchar(num[i]);
 216   5                                      }
 217   4                                      ////EX0=1;
 218   4                              break;
 219   4                      }
 220   3      
 221   3                      else if(key==KEY_ESC)
 222   3                      {       ////EX0=1;
 223   4                              break;
 224   4                      }
 225   3                      
 226   3                      ////EX0=1;              // 本次按键处理完毕开中断.
 227   3              }
 228   2          }
 229   1      }
 230          
 231          
 232          void write_menu_word(uchar n)   // 写菜单固定内容.
 233          {
 234   1              switch(n)
 235   1              {
 236   2                      case 1:display_led(7,LED_T);display_led(6,LED_T);break;
 237   2                      case 2:display_led(7,LED_E);display_led(6,LED_A);break;
 238   2                      case 3:display_led(7,LED_G);display_led(6,LED_A);break;
 239   2                      case 4:display_led(7,LED_S);display_led(6,LED_P);break;
 240   2                      case 5:display_led(7,LED_P);display_led(6,LED_A);break;
 241   2                      case 6:display_led(7,LED_N);display_led(6,LED_b);break;
C51 COMPILER V7.07   KEY                                                                   04/06/2006 10:20:44 PAGE 5   

 242   2                      default:break;
 243   2              }
 244   1      }
 245          
 246          void display_main_menu(void)    // 显示一级菜单.
 247          {
 248   1              uchar temp=1;
 249   1              uchar check_key;
 250   1      
 251   1              write_menu_word(temp);
 252   1      
 253   1              t1s1=0;
 254   1      
 255   1              while(1)
 256   1              {
 257   2                      putchar(0x55);
 258   2                      putchar(IE);
 259   2                      putchar(TCON);
 260   2                      putchar(t1s1);
 261   2                      
 262   2                      if(t1s1>=30)    // 超时退出.
 263   2                      {       t1s1=0;
 264   3                              led_time_over_bit=1;
 265   3                              break;
 266   3                      }
 267   2                      
 268   2                      check_key=get_key();
 269   2                      if(check_key>=0x40)
 270   2                      {
 271   3                              key=check_key;
 272   3                              key_bit=1;
 273   3                      }
 274   2                      else key_bit=0;
 275   2                      
 276   2              if(key_bit)     // 对按键处理.
 277   2              {
 278   3                      do{check_key=get_key();}while((check_key&0X40)!=0X00);  // 等待按键松开.
 279   3                      key_bit=0;
 280   3                      t1s1=0;
 281   3      
 282   3                      if(key==KEY_UP)
 283   3                      {       if(temp>1)
 284   4                                      temp--;
 285   4                              write_menu_word(temp);
 286   4                      }
 287   3      
 288   3                      else if(key==KEY_DOWN)
 289   3                      {       if(temp<6)
 290   4                                      temp++;
 291   4                              write_menu_word(temp);
 292   4                      }
 293   3      
 294   3                      else if(key==KEY_ENTER)
 295   3                      {
 296   4                              if(temp==6)             // 本机编号显示,修改单独处理.

⌨️ 快捷键说明

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