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

📄 led_key.lst

📁 单片机实现消息队列的例子
💻 LST
字号:
C51 COMPILER V7.10   LED_KEY                                                               12/14/2004 10:51:16 PAGE 1   


C51 COMPILER V7.10, COMPILATION OF MODULE LED_KEY
OBJECT MODULE PLACED IN .\Led_key.obj
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE ..\SourceFile\Led_key.c LARGE BROWSE DEBUG OBJECTEXTEND PRINT
                    -(.\Led_key.lst) OBJECT(.\Led_key.obj)

line level    source

   1          /*************************************************/
   2          
   3          /********************显示与键盘接口********/
   4          
   5          /*************2002年12月13日*******************/
   6          
   7          /************WROTE BY WANGSW********************/
   8          #include "reg52x2.h"  
   9          #include <intrins.h>
  10          
  11          #include "define.h"
  12          
  13          #include "led_key.h"
  14          
  15          #define KEY_SHORT_INTERVAL              2
  16          #define KEY_LONG_INTERVAL               40
  17          
  18          sbit SDA = P1^0;                        /*模拟串行转并行口,下降沿有效,输出为低电平可控点亮*/
  19          sbit SCL = P1^1;                        /*模拟串并行转换的时钟信号线*/
  20          
  21          sbit KEY = P1^2;                        /*键盘,低电平有效,检测位*/
  22          
  23          sbit DISPLAY0 = P1^3;           /*EBIT4, 低电平有效*/
  24          sbit DISPLAY1 = P1^4;           /*EBIT3*/
  25          sbit DISPLAY2 = P1^5;           /*EBIT2*/
  26          sbit DISPLAY3 = P1^6;           /*EBIT1*/
  27          
  28          sbit LED = P1^7;                        /*EBIT0,低电平有效*/
  29          
  30          bool  LED_KEY_SIGN = FALSE;
  31          
  32          byte data KeyCounter = 0;
  33          
  34          byte data KeyIntervalSafeguard = 0;             /*用于连续两个按键速度过快导致按键混乱*/
  35          
  36          byte data g_KeyStore = 0x00;
  37          
  38          static byte code KeyMap[8] =                            /*键盘转换*/
  39          {
  40                  KEY1, KEY2, KEY3, KEY4, KEY5, KEY6, KEY7, KEY8
  41          };
  42          
  43          static byte code LedDisplayMap[2][16] =
  44          {
  45                  {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E},
  46                  {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10, 0x08, 0x03, 0x46, 0x21, 0x06, 0x0E}
  47          };
  48          
  49          static void SendData(byte value);
  50          
  51          static byte KeyCheck(void);                                                     /*键值检测*/
  52                                          
  53          
  54          /******************************************************************************************
C51 COMPILER V7.10   LED_KEY                                                               12/14/2004 10:51:16 PAGE 2   

  55          *函数名:                SendData
  56          *参数:                  value                   需要进行串并转换的数据,是一字节8位数据
  57          *返回值:                无
  58          *描述:                  把数据value按照从高位到低位串行发送到串并转换电路输
  59                                          入端,主要可以用来协助完成底层LED显示
  60          *编写:                  王绍伟
  61          *版本信息:              V1.0                    2003年8月15日
  62          ******************************************************************************************/
  63          static void SendData(byte value)
  64          {
  65   1              byte data counter;
  66   1              SCL = 1;
  67   1              for(counter = 0; counter < 8; counter++)
  68   1              {
  69   2                      if(value & 0x80)        /*判断数据*/
  70   2                      {
  71   3                              SDA = 1;
  72   3                      }
  73   2                      else
  74   2                      {
  75   3                              SDA = 0;
  76   3                      }
  77   2                      SCL = 0;                                        /*产生时钟动作*/
  78   2                      SCL = 1;
  79   2                      value = value << 1;
  80   2              }
  81   1      }
  82          
  83          
  84          /******************************************************************************************
  85          *函数名:                KeyCheck
  86          *参数:                  无
  87          *返回值:                counter                 返回键值
  88                                          ERROR                   返回出错信息
  89          *描述:                  通过扫描键盘返回按下的按键号
  90          *编写:                  王绍伟
  91          *版本信息:              V1.0                    2003年8月15日
  92          ******************************************************************************************/
  93          static byte KeyCheck(void)
  94          {
  95   1              byte counter;
  96   1              SDA = 1;                        /*注意,原来数据为0,现在为1*/
  97   1              for(counter = 0; counter < 8; counter++)                        /*r先将扫描线上都置为高电平*/
  98   1              {
  99   2                      SCL = 0;                                        
 100   2                      SCL = 1;
 101   2              }
 102   1              SDA = 0;                                                                                /*r然后逐行置为低电平,侦测P1.2(KEY反馈线)*/
 103   1              
 104   1              for(counter = 0; counter < 8; counter++)                        /*需要修改计数值*/
 105   1              {
 106   2                      SCL = 0;                                        
 107   2                      SCL = 1;
 108   2                      delay(1);                                                               /*必须的延迟,否则数据出错*/
 109   2                      if(!KEY)
 110   2                      {
 111   3                              return(counter);                                        /*r扫描出按下键就返回按下的键值并退出函数*/
 112   3                      }
 113   2              }
 114   1              return(ERROR);                          /*r若没有扫描到按下键就返回ERROR*/
 115   1      }
 116          
C51 COMPILER V7.10   LED_KEY                                                               12/14/2004 10:51:16 PAGE 3   

 117          
 118          
 119          
 120          /******************************************************************************************
 121          *函数名:                led_key_led_control
 122          *参数:                  LedIndex                点亮的LED发光管号,其取值从1~8有效
 123          *返回值:                无
 124          *描述:                  根据LedIndex的值决定选择点亮哪一只LED管
 125          *编写:                  王绍伟
 126          *版本信息:              V1.0                    2003年8月15日
 127          ******************************************************************************************/
 128          
 129          extern void led_key_led_control(byte LedIndex)
 130          {
 131   1              P1 = 0xFF;
 132   1              if(LedIndex)
 133   1              {
 134   2                      LedIndex = 1 << (LedIndex - 1);         /*r当1左移(LedIndex-1)位后,发送到串并行转换电路*/
 135   2                      SendData(~LedIndex);
 136   2                      LED = 0;                                                        /*r开启DP-51的Q1三极管,这样就可以开启LED管点亮*/
 137   2              }
 138   1              
 139   1              
 140   1      }
 141          
 142          
 143          /******************************************************************************************
 144          *函数名:                led_key_led_display_control
 145          *参数:                  value                   LED显示数码值
 146                                          boDp                    是否显示小数点
 147                                          LedDisplayIndex 代表显示那一块LED
 148          *返回值:                无
 149          *描述:                  对选择的LED模块让其显示一个数码的程序
 150          *编写:                  王绍伟
 151          *版本信息:              V1.0                    2003年8月15日
 152          ******************************************************************************************/
 153          extern void led_key_led_display_control(byte LedDisplayIndex, bool boDp, byte value)
 154          {
 155   1              byte i;
 156   1              i = boDp;
 157   1              P1 = 0xFF;
 158   1              SendData(LedDisplayMap[i][value]);              /*r发送LED显示数据到串并转换电路*/
 159   1      
 160   1              P1 &= ~(0x04 << LedDisplayIndex);
 161   1      }
 162          
 163          
 164          /******************************************************************************************
 165          *函数名:                led_key_key_check
 166          *参数:                  无
 167          *返回值:                无
 168          *描述:                  按键扫描判定程序                
 169          *编写:                  王绍伟
 170          *版本信息:              V1.0                    2003年8月15日
 171          ******************************************************************************************/
 172          extern void led_key_key_check(void)                     /*5*5=25mS*/
 173          {
 174   1              byte i;
 175   1      
 176   1              P1 = 0xFF;                                      /*初始化原状态,以免引起错误*/
 177   1              SDA = 0;
 178   1              for(i = 0; i < 8; i++)          /*r基于DP-51硬件构造,先向扫描线上发送低电平*/
C51 COMPILER V7.10   LED_KEY                                                               12/14/2004 10:51:16 PAGE 4   

 179   1              {
 180   2                      SCL = 0;
 181   2                      SCL = 1;
 182   2              }
 183   1              
 184   1              if(KEY)                                 /*r检测反馈线,若无键按下,则KEY(P1.2)则会保持高电平,此时判定无键按下,退出键扫程序*/
 185   1              {
 186   2                      KeyCounter = 0;
 187   2                      return;
 188   2              }
 189   1                                      
 190   1              if(KeyIntervalSafeguard)        /*设置这段程序是为了让判定两次按键之间的时间间隔大于等于0.1s,此段程序在初始化后

⌨️ 快捷键说明

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