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

📄 key_disp.lst

📁 MCU51-JZ01单片机开发板实验例程
💻 LST
字号:
C51 COMPILER V7.50   KEY_DISP                                                              11/28/2006 14:00:31 PAGE 1   


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

line level    source

   1          
   2          /*******************************************************************************
   3          *  标题:  MCU51-JZ01单片机开发系统演示程序            
   4          *  文件:  key_disp.C                                                              
   5          *  日期:  2005-7-4                                                             
   6          *  版本:  1.0                                                                                             
             -                 
   7          *  网站: http://www.electronstudy.com 
   8          ********************************************************************************
   9          *  描述:                                                                       *
  10          *        P2端口的P2.4定义为CLK;P2.3定义为DATA;P2.2定义为key。用I/O口模拟SPI通讯,
  11          *        完成测试HD7279A的键盘接口测试。首先,两位数码管清零,然后显示数字从1增
  12          *        加到90;当按下按键S5、S6、S13或S14时,显示其键码。                     *
  13          *                                                                              *
  14          *******************************************************************************/
  15          #include "reg51.h"  
  16          
  17          //**************************** 函数声明 ******************************
  18          void long_delay(void);                       // 延时50us
  19          void short_delay(void);                      // 延时8us
  20          void delay1ms(unsigned int);                 // 延时10MS
  21          void write7279(unsigned char, unsigned char);// 写入到HD7279
  22          unsigned char read7279(unsigned char);       // 从HD7279读出
  23          void send_byte(unsigned char);               // 发送一个字节
  24          unsigned char receive_byte(void);            // 接受一个字节
  25          unsigned char key_read();                    // 读键码
  26          void  key_serve(void);                       // 键盘服务程序
  27          
  28          //************************* 变量及I/O口定义 **************************
  29          sbit clk = P2^4;                             // clk连接于P2.4
  30          sbit dat = P2^3;                             // dat连接于P2.3
  31          sbit key = P2^2;                             // key连接于P2.2
  32          
  33          unsigned char digit[2];
  34          unsigned char key_number;
  35          
  36          //**************************  HD7279A指令  ****************************
  37          #define CMD_RESET 0xa4                       // 复位指令
  38          #define CMD_TEST 0xbf                        // 测试指令
  39          #define DECODE0 0x80                         // 下载数据且按方式0译码
  40          #define DECODE1 0xc8                         // 下载数据且按方式1译码
  41          #define CMD_READ 0x15                        // 读键盘数据指令
  42          #define UNDECODE 0x90                        // 下载数据但不译码
  43          #define RTL_CYCLE 0xa3                       // 循环左移指令
  44          #define RTR_CYCLE 0xa2                       // 循环右移指令
  45          #define RTL_UNCYL 0xa1                       // 左移指令
  46          #define RTR_UNCYL 0xa0                       // 右移指令
  47          #define ACTCTL 0x98                          // 消隐控制
  48          #define SEGON 0xe0                           // 段点亮指令
  49          #define SEGOFF 0xc0                          // 段关闭指令
  50          #define BLINKCTL 0x88                        // 闪烁控制
  51          
  52          void main(void)
  53          {
  54   1          unsigned char j;
C51 COMPILER V7.50   KEY_DISP                                                              11/28/2006 14:00:31 PAGE 2   

  55   1          P0 = 0;
  56   1          delay1ms(20);                            //上电延时20ms
  57   1          send_byte(CMD_RESET);                    // 复位HD7279A
  58   1          for (j=0;j<2;j++)                        // 计数初始值0000
  59   1          {
  60   2              digit[j]=0;
  61   2              write7279(DECODE0+j,digit[j]);
  62   2          } 
  63   1          while (digit[1]<9)                       // 如果计数达到90就停止
  64   1          {
  65   2              digit[0]++;
  66   2              if (digit[0]>9)
  67   2              {
  68   3                     digit[0]=0;
  69   3                     digit[1]++;
  70   3                     if (digit[1]>9)
  71   3                     {
  72   4                          digit[1]=0;                        
  73   4                     }
  74   3               }
  75   2               write7279(DECODE0,digit[0]);
  76   2               delay1ms(100);
  77   2               if (digit[0]==0)
  78   2               {
  79   3                    write7279(DECODE0+1,digit[1]);
  80   3                    delay1ms(100);       
  81   3                    
  82   3               }
  83   2           }
  84   1          delay1ms(1500);
  85   1          send_byte(CMD_RESET);                  //清除显示    
  86   1          while (1)                     
  87   1          {
  88   2             
  89   2             if(!key) 
  90   2             {
  91   3                  key_read();
  92   3                  key_serve(); 
  93   3             }                 
  94   2          }
  95   1          
  96   1      
  97   1      }
  98          
  99          void write7279(unsigned char cmd, unsigned char dta)
 100          {
 101   1           send_byte (cmd);
 102   1           send_byte (dta);
 103   1      }
 104          unsigned char read7279(unsigned char command)
 105          {
 106   1           send_byte(command);
 107   1           return(receive_byte());
 108   1      }
 109          //========================= 单字节发送程序 ============================
 110          void send_byte( unsigned char out_byte)
 111          {
 112   1           unsigned int i;
 113   1           long_delay();                             // 延时50us
 114   1           for (i=0;i<8;i++)
 115   1           {
 116   2                if (out_byte&0x80)
C51 COMPILER V7.50   KEY_DISP                                                              11/28/2006 14:00:31 PAGE 3   

 117   2                {
 118   3                    dat = 1;                         // dat输出置"1"
 119   3                }
 120   2                else
 121   2                {
 122   3                    dat = 0;                         // dat输出置"0"
 123   3                }    
 124   2                clk = 1;                             // clk输出置"1"
 125   2                short_delay();
 126   2                clk = 0;                             // clk输出置"0"
 127   2                short_delay();
 128   2                out_byte<<=1;                        // 逻辑左移1位,右侧补0
 129   2           }
 130   1           dat = 0;                                  // dat输出置"0"
 131   1      }
 132          
 133          //========================== 单字节接收程序 ===========================
 134          unsigned char receive_byte(void)
 135          {
 136   1           unsigned char in_byte;
 137   1           unsigned char i;
 138   1           dat = 1;                                  // 设为输入状态
 139   1           long_delay();
 140   1           for (i=0;i<8;i++)
 141   1           {
 142   2                clk = 1;                             // clk输出置"1"
 143   2                short_delay();
 144   2                in_byte<<=1;                         // 逻辑左移1位,右侧补0
 145   2                
 146   2                
 147   2                if (dat)                             // 读dat输入,若为"1"
 148   2                {
 149   3                     in_byte=in_byte|0x01;
 150   3                }
 151   2                
 152   2                clk = 0;                             // clk输出置"0"
 153   2                short_delay();
 154   2           }
 155   1           dat = 0;                                  // 设置dat输出"0";
 156   1           return (in_byte);
 157   1      }
 158          
 159          //============================ 延时94us ===============================
 160          void long_delay(void)          
 161          {
 162   1           unsigned char i;
 163   1           for (i=0;i<0x0A;i++);
 164   1      }
 165          
 166          //============================ 延时25us ================================
 167          void short_delay(void)
 168          {
 169   1           unsigned char i;      
 170   1           for (i=0;i<2;i++); 
 171   1      }              
 172          
 173          // **************************** n*1ms *********************************
 174          void delay1ms(unsigned int time)
 175          {
 176   1           unsigned int i;
 177   1           unsigned int j;
 178   1      
C51 COMPILER V7.50   KEY_DISP                                                              11/28/2006 14:00:31 PAGE 4   

 179   1           for (i=0;i<time;i++)
 180   1           {
 181   2                for(j=0;j<0x80;j++);       
 182   2           }
 183   1      }
 184              
 185          unsigned char key_read()                       //读键码子程序
 186          {
 187   1            
 188   1            if (!key)                                // 如果有健按下,则为"0"
 189   1            {
 190   2                 key_number=read7279(CMD_READ);      // 读键码            
 191   2                 while (!key);                       // 等待按键松开           
 192   2            }           
 193   1            return(key_number);                      //返回键码值
 194   1      }
 195          
 196          void  key_serve(void)                          //键盘服务子程序
 197          {           
 198   1          switch (key_number)
 199   1          {
 200   2             case 6:            
 201   2                  write7279(DECODE1+1,key_number/10);// 在第2位显示键码高8位
 202   2                  write7279(DECODE1,key_number%10);  // 在第1位显示键码低8位
 203   2                  break;                       
 204   2                  
 205   2             case 14:                      
 206   2                  write7279(DECODE1+1,key_number/10);// 在第2位显示键码高8位
 207   2                  write7279(DECODE1,key_number%10);  // 在第1位显示键码低8位  
 208   2                  break;                      
 209   2                  
 210   2             case 5:
 211   2                  write7279(DECODE1+1,key_number/10);// 在第2位显示键码高8位
 212   2                  write7279(DECODE1,key_number%10);  // 在第1位显示键码低8位  
 213   2                  break;
 214   2                  
 215   2             case 13:  
 216   2                  write7279(DECODE1+1,key_number/10);// 在第2位显示键码高8位
 217   2                  write7279(DECODE1,key_number%10);  // 在第1位显示键码低8位
 218   2                  break;   
 219   2             //若出错,则显示"FF"
 220   2             default :
 221   2                  write7279(DECODE1+1,0x0F);         // 在第2位显示键码高8位
 222   2                  write7279(DECODE1,0x0F);           // 在第1位显示键码低8位
 223   2      
 224   2                  break;
 225   2      
 226   2              
 227   2          }
 228   1       
 229   1      }
 230          
 231          /*===========================================================================
 232                                    End of files
 233          ===========================================================================*/


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    371    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
C51 COMPILER V7.50   KEY_DISP                                                              11/28/2006 14:00:31 PAGE 5   

   DATA SIZE        =      3       7
   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 + -