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

📄 key_disp_int1.lst

📁 MCU51-JZ01单片机开发板实验例程
💻 LST
字号:
C51 COMPILER V7.50   KEY_DISP_INT1                                                         09/13/2006 13:47:04 PAGE 1   


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

line level    source

   1          
   2          /*******************************************************************************
   3          *  标题:  MCU51-JZ01单片机开发系统演示程序            
   4          *  文件:  key_disp_int1.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           
  16          #include <AT89X52.H>
  17          
  18          #define uchar unsigned char 
  19          #define uint unsigned int 
  20          
  21          
  22          //外部中断函数 
  23          void int1() interrupt 2 using 3  // INT1中断函数
  24          {
  25   1          
  26   1          uint i;     
  27   1              P0 = 0x0f;                   // LED0~LED3灯亮
  28   1              for(i=0;i <0x500;i++);
  29   1          P0 = 0xf0;                   // LED0~LED3灯灭
  30   1      }
  31          
  32          
  33          //**************************** 函数声明 ******************************
  34          void long_delay(void);                       // 延时50us
  35          void short_delay(void);                      // 延时8us
  36          void delay1ms(unsigned int);                 // 延时10MS
  37          void write7279(unsigned char, unsigned char);// 写入到HD7279
  38          unsigned char read7279(unsigned char);       // 从HD7279读出
  39          void send_byte(unsigned char);               // 发送一个字节
  40          unsigned char receive_byte(void);            // 接受一个字节
  41          unsigned char key_read();                    // 读键码
  42          void  key_serve(void);                       // 键盘服务程序
  43          
  44          //************************* 变量及I/O口定义 **************************
  45          sbit clk = P2^4;                             // clk连接于P2.4
  46          sbit dat = P2^3;                             // dat连接于P2.3
  47          sbit key = P2^2;                             // key连接于P2.2
  48          
  49          unsigned char digit[2];
  50          unsigned char key_number;
  51          
  52          //**************************  HD7279A指令  ****************************
  53          #define CMD_RESET 0xa4                       // 复位指令
  54          #define CMD_TEST 0xbf                        // 测试指令
C51 COMPILER V7.50   KEY_DISP_INT1                                                         09/13/2006 13:47:04 PAGE 2   

  55          #define DECODE0 0x80                         // 下载数据且按方式0译码
  56          #define DECODE1 0xc8                         // 下载数据且按方式1译码
  57          #define CMD_READ 0x15                        // 读键盘数据指令
  58          #define UNDECODE 0x90                        // 下载数据但不译码
  59          #define RTL_CYCLE 0xa3                       // 循环左移指令
  60          #define RTR_CYCLE 0xa2                       // 循环右移指令
  61          #define RTL_UNCYL 0xa1                       // 左移指令
  62          #define RTR_UNCYL 0xa0                       // 右移指令
  63          #define ACTCTL 0x98                          // 消隐控制
  64          #define SEGON 0xe0                           // 段点亮指令
  65          #define SEGOFF 0xc0                          // 段关闭指令
  66          #define BLINKCTL 0x88                        // 闪烁控制
  67          
  68          void main(void)
  69          {
  70   1          unsigned char j;
  71   1          P0 = 0xf0;
  72   1          EX1 = 1;                                 // 允许int1中断
  73   1              IT0 = 1;                                 // 下降沿产生中断
  74   1              EA = 1;                                  // 开总中断 
  75   1          
  76   1          P0 = 0;
  77   1          delay1ms(20);                            //上电延时20ms
  78   1          send_byte(CMD_RESET);                    // 复位HD7279A
  79   1          for (j=0;j<2;j++)                        // 计数初始值0000
  80   1          {
  81   2              digit[j]=0;
  82   2              write7279(DECODE0+j,digit[j]);
  83   2          } 
  84   1          while (digit[1]<9)                       // 如果计数达到90就停止
  85   1          {
  86   2              digit[0]++;
  87   2              if (digit[0]>9)
  88   2              {
  89   3                     digit[0]=0;
  90   3                     digit[1]++;
  91   3                     if (digit[1]>9)
  92   3                     {
  93   4                          digit[1]=0;                        
  94   4                     }
  95   3               }
  96   2               write7279(DECODE0,digit[0]);
  97   2               delay1ms(100);
  98   2               if (digit[0]==0)
  99   2               {
 100   3                    write7279(DECODE0+1,digit[1]);
 101   3                    delay1ms(100);       
 102   3                    
 103   3               }
 104   2           }
 105   1          delay1ms(1500);
 106   1          send_byte(CMD_RESET);                  //清除显示    
 107   1          while (1)                     
 108   1          {
 109   2             
 110   2             if(!key) 
 111   2             {
 112   3                  key_read();
 113   3                  key_serve(); 
 114   3             }                 
 115   2          }
 116   1          
C51 COMPILER V7.50   KEY_DISP_INT1                                                         09/13/2006 13:47:04 PAGE 3   

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

 179          
 180          //============================ 延时94us ===============================
 181          void long_delay(void)          
 182          {
 183   1           unsigned char i;
 184   1           for (i=0;i<0x0A;i++);
 185   1      }
 186          
 187          //============================ 延时25us ================================
 188          void short_delay(void)
 189          {
 190   1           unsigned char i;      
 191   1           for (i=0;i<2;i++); 
 192   1      }              
 193          
 194          // **************************** n*1ms *********************************
 195          void delay1ms(unsigned int time)
 196          {
 197   1           unsigned int i;
 198   1           unsigned int j;
 199   1      
 200   1           for (i=0;i<time;i++)
 201   1           {
 202   2                for(j=0;j<0xA0;j++);       
 203   2           }
 204   1      }
 205              
 206          unsigned char key_read()                       //读键码子程序
 207          {
 208   1            
 209   1            if (!key)                                // 如果有健按下,则为"0"
 210   1            {
 211   2                 key_number=read7279(CMD_READ);      // 读键码            
 212   2                 while (!key);                       // 等待按键松开           
 213   2            }           
 214   1            return(key_number);                      //返回键码值
 215   1      }
 216          
 217          void  key_serve(void)                          //键盘服务子程序
 218          {           
 219   1          switch (key_number)
 220   1          {
 221   2             case 6:            
 222   2                  write7279(DECODE1+1,key_number/10);// 在第2位显示键码高8位
 223   2                  write7279(DECODE1,key_number%10);  // 在第1位显示键码低8位
 224   2                  break;                       
 225   2                  
 226   2             case 14:                      
 227   2                  write7279(DECODE1+1,key_number/10);// 在第2位显示键码高8位
 228   2                  write7279(DECODE1,key_number%10);  // 在第1位显示键码低8位  
 229   2                  break;                      
 230   2                  
 231   2             case 5:
 232   2                  write7279(DECODE1+1,key_number/10);// 在第2位显示键码高8位
 233   2                  write7279(DECODE1,key_number%10);  // 在第1位显示键码低8位  
 234   2                  break;
 235   2                  
 236   2             case 13:  
 237   2                  write7279(DECODE1+1,key_number/10);// 在第2位显示键码高8位
 238   2                  write7279(DECODE1,key_number%10);  // 在第1位显示键码低8位
 239   2                  break;   
 240   2             //若出错,则显示"FF"
C51 COMPILER V7.50   KEY_DISP_INT1                                                         09/13/2006 13:47:04 PAGE 5   

 241   2             default :
 242   2                  write7279(DECODE1+1,0x0F);         // 在第2位显示键码高8位
 243   2                  write7279(DECODE1,0x0F);           // 在第1位显示键码低8位
 244   2      
 245   2                  break;
 246   2      
 247   2              
 248   2          }
 249   1       
 250   1      }
 251          
 252          /*===========================================================================
 253                                    End of files
 254          ===========================================================================*/


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    414    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   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 + -