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

📄 key.lst

📁 在单片机控制的液晶屏上显示汉字
💻 LST
字号:
C51 COMPILER V7.02b   KEY                                                                  04/27/2007 09:49:01 PAGE 1   


C51 COMPILER V7.02b, COMPILATION OF MODULE KEY
OBJECT MODULE PLACED IN .\output\key.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE key.c LARGE BROWSE DEBUG OBJECTEXTEND OBJECT(.\output\key.obj)

stmt level    source

   1          /************************************************************************************
   2          *  Copyright (c) 2004,西安铭朗电子科技有限责任公司
   3          *            All rights reserved.
   4          *
   5          * 文件名称: key.C
   6          * 文件标识: none
   7          * 适用器件: C8051F120
   8          * 
   9          * 摘 要: 本文件是键盘子程序;使用外部22.1184MHz晶振.
  10          * 
  11          * 当前版本:1.2
  12          * 作 者:李林利
  13          * 完成日期:2005年6月19日
  14          * 
  15          * 当前版本:1.0
  16          * 作 者:卢 阳
  17          * 完成日期:2004年11月14日
  18          *
  19          * 历史版本:0.9 
  20          * 原作者 : 李林利
  21          * 完成日期:2004年1月1日
  22          *************************************************************************************/
  23          
  24          /************************************************************************************/
  25          // 引用外部头文件
  26          
  27          #include "c8051F120.h"
  28          #include <INTRINS.H>
  29          #include "key.h"
  30          #include "Delay.h"
  31          
  32          
  33          /************************************************************************************/
  34          
  35          /************************************************************************************
  36          // 常量及全局变量定义
  37          *************************************************************************************/
  38          
  39          unsigned char code Key_Value_Table[16]=
  40                   {0xff,0x00,0x01,0xff,0x02,0xff,0xff,0xff,
  41                            0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff
  42                           };
  43          bit  bKeyUp_Flag;
  44          sbit LED=P3^5;
  45          
  46          /************************************************************************************
  47          *  key功能子程序
  48          *************************************************************************************/
  49          
  50          /***********************************************************************************
  51          * 函数名称:Key_Init;
  52          *
  53          * 函数功能描述:键盘初始化,将标志位置1;
  54          *              
  55          * 输入参数:none;
C51 COMPILER V7.02b   KEY                                                                  04/27/2007 09:49:01 PAGE 2   

  56          *
  57          * 返回数据:none;
  58          *
  59          * 注意:    none;
  60          ************************************************************************************/
  61          
  62          void Key_Init(void)
  63          {          
  64   1              bKeyUp_Flag=1;//标志位置1
  65   1      }
  66          
  67          /***********************************************************************************
  68          * 函数名称:GetScanKey;
  69          *
  70          * 函数功能描述:键盘扫描函数,得到键的行列位置;
  71          *              
  72          * 输入参数:none;
  73          *
  74          * 返回数据:none;
  75          *
  76          * 注意:    none;
  77          ************************************************************************************/
  78          
  79          unsigned char GetScanKey(void)
  80          {
  81   1              unsigned char key, i, temp;
  82   1         char data SFRPAGE_SAVE = SFRPAGE;    // Save Current SFR page   
  83   1         SFRPAGE = SFR_PAGE_F;                        // set SFR page F
  84   1      
  85   1              key=0xff;
  86   1      
  87   1              for (i=1; i<0x10; i<<=1)//i的低4位为行数位
  88   1              {
  89   2              Key_Scan |= 0x0f;//保留高4位,低4位置1
  90   2                      Delay_us(1);
  91   2                      Key_Scan &= ~i;  //取行数位
  92   2                      Delay_us(1);
  93   2              
  94   2                      temp = Key_Scan; //取高4位列数位
  95   2                      temp = ~temp;    //取反
  96   2                      temp>>=4;                //右移4位
  97   2      
  98   2                      if (temp!=0x00)  //有键值
  99   2                      {                
 100   3                  key = i<<4;  //左移4位
 101   3                              key|=temp;   //取键值
 102   3                              break;
 103   3                      }
 104   2              }
 105   1              SFRPAGE = SFRPAGE_SAVE;          // Restore SFR page
 106   1              return key;          //返回行位(高四)和列位(低四)
 107   1      }
 108          
 109          /***********************************************************************************
 110          * 函数名称:GetKey;
 111          *
 112          * 函数功能描述:取键值,长按无效;
 113          *              
 114          * 输入参数:none;
 115          *
 116          * 返回数据:none;
 117          *
C51 COMPILER V7.02b   KEY                                                                  04/27/2007 09:49:01 PAGE 3   

 118          * 注意:    none;
 119          ************************************************************************************/
 120          
 121          unsigned char GetKey(void)
 122          {
 123   1              unsigned char key, temp;
 124   1      
 125   1              if (!bKeyUp_Flag)               //判断标志,是1执行
 126   1              {
 127   2                      key=GetScanKey();
 128   2                      if (key==0xff)          //没有按键,置标志位
 129   2                              bKeyUp_Flag=1;
 130   2                      else                            //保持按键
 131   2                              return 0xff;    
 132   2              }
 133   1                      
 134   1              key=GetScanKey();
 135   1              if (key==0xff)          //没有按键
 136   1                      return key;
 137   1              else
 138   1                      temp=key;               //取键值
 139   1              
 140   1              Delay_ms(20);           //延时20ms
 141   1      
 142   1              key=GetScanKey();       //键盘扫描
 143   1              
 144   1              if(key!=temp)           //判断两次键值是否相同
 145   1              {
 146   2                  key=0xff;
 147   2                      return key;
 148   2              }
 149   1              else                            //取键值
 150   1              {
 151   2                        temp=Key_Value_Table[key>>4];
 152   2                        if (temp==0xff)
 153   2                        {
 154   3                      key=0xff;
 155   3                              return key;
 156   3                        }
 157   2                        
 158   2                        temp=Key_Value_Table[key&0x0f];
 159   2                        if (temp==0xff)
 160   2                        {
 161   3                      key=0xff;
 162   3                              return key;
 163   3                        }
 164   2                        
 165   2                        key=Key_Value_Table[key>>4]*4+Key_Value_Table[key&0x0f];
 166   2                        if (key>15)
 167   2                        {
 168   3                      key=0xff;
 169   3                              return key;
 170   3                        }
 171   2      
 172   2                        bKeyUp_Flag=0;
 173   2                        return key;
 174   2              } 
 175   1      }
 176          
 177          /***********************************************************************************
 178          * 函数名称:Key_SPI;
 179          *
C51 COMPILER V7.02b   KEY                                                                  04/27/2007 09:49:01 PAGE 4   

 180          * 函数功能描述:键值到LED显示码转换;
 181          *              
 182          * 输入参数:none;
 183          *
 184          * 返回数据:none;
 185          *
 186          * 注意:    none;
 187          ************************************************************************************/
 188          
 189          unsigned char Key_SPI(unsigned char key)
 190          {
 191   1              switch(key)
 192   1              {
 193   2                      case 0x00:              return 0x3f;//0
 194   2                      case 0x01:              return 0x06;//1
 195   2                      case 0x02:              return 0x5b;//2
 196   2                      case 0x03:              return 0x4f;//3
 197   2                      case 0x04:              return 0x66;//4
 198   2                      case 0x05:              return 0x6d;//5
 199   2                      case 0x06:              return 0x7d;//6 
 200   2                      case 0x07:              return 0x07;//7
 201   2                      case 0x08:              return 0x7f;//8
 202   2                      case 0x09:              return 0x6f;//9
 203   2                      case 0x0a:              return 0x77;//a
 204   2                      case 0x0b:              return 0x7c;//b
 205   2                      case 0x0c:              return 0x39;//c
 206   2                      case 0x0d:              return 0x5e;//d
 207   2                      case 0x0e:              return 0x79;//e
 208   2                      case 0x0f:              return 0x71;//f
 209   2                      default:                return 0x00;
 210   2              }
 211   1      }
 212          
 213          /***********************************************************************************
 214          * 函数名称:Alarm;
 215          *
 216          * 函数功能描述:蜂鸣器开关控制  0:关闭,其他:开启;
 217          *              
 218          * 输入参数:0:关闭,其他:开启;
 219          *
 220          * 返回数据:none;
 221          *
 222          * 注意:    none;
 223          ************************************************************************************/
 224          
 225          void Alarm(unsigned char flag)
 226          {
 227   1              char data SFRPAGE_SAVE = SFRPAGE;    // Save Current SFR page   
 228   1          SFRPAGE = SFR_PAGE_F;                       // set SFR page F
 229   1      
 230   1              if(flag)
 231   1                      P4|=0x10;
 232   1              else
 233   1                      P4&=0xef;
 234   1              
 235   1              SFRPAGE = SFRPAGE_SAVE;          // Restore SFR page
 236   1      }
 237          
 238          /***********************************************************************************
 239          * 函数名称:LED_state;
 240          *
 241          * 函数功能描述:LED开关控制  0:关闭,其他:开启;
C51 COMPILER V7.02b   KEY                                                                  04/27/2007 09:49:01 PAGE 5   

 242          *              
 243          * 输入参数:0:关闭,其他:开启;
 244          *
 245          * 返回数据:none;
 246          *
 247          * 注意:    none;
 248          ************************************************************************************/
 249          
 250          void LED_state(unsigned char flag)
 251          {
 252   1              if(flag)
 253   1                      LED=1;
 254   1              else
 255   1                      LED=0;
 256   1      }
 257          
 258          /*
 259          SPI0DAT=0x3f;   //显示0
 260          SPI0DAT=0x06;   //显示1
 261          SPI0DAT=0x5b;   //显示2
 262          SPI0DAT=0x4f;   //显示3
 263          SPI0DAT=0x66;   //显示4
 264          SPI0DAT=0x6d;   //显示5
 265          SPI0DAT=0x7d;   //显示6
 266          SPI0DAT=0x07;   //显示7
 267          SPI0DAT=0x7f;   //显示8
 268          SPI0DAT=0x6f;   //显示9
 269          SPI0DAT=0x77;   //显示a
 270          SPI0DAT=0x7c;   //显示b
 271          SPI0DAT=0x39;   //显示c
 272          SPI0DAT=0x5e;   //显示d
 273          SPI0DAT=0x79;   //显示e
 274          SPI0DAT=0x71;   //显示f
 275          SPI0DAT=0x80;   //显示. 
 276          */      
 277                                                            
 278          /***********************************************************************************/
 279          // 文件结束
 280          /***********************************************************************************/


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    366    ----
   CONSTANT SIZE    =     16    ----
   XDATA SIZE       =   ----       4
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----       2
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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