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

📄 key_display.lst

📁 LC75823E_TEST[字符测试程序],主要是用来测试芯片是否工作正常.
💻 LST
字号:
C51 COMPILER V7.50   KEY_DISPLAY                                                           09/17/2008 16:34:35 PAGE 1   


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

line level    source

   1          /******************************************************************************************************
   2          File Name:key_display.c
   3          Version:
   4          Discription:显示和按键及消息的处理
   5          Author:
   6          Date:
   7          *******************************************************************************************************/
   8          #include "key_display.h"
   9           
  10           typedef unsigned char BYTE;
  11           extern unsigned char lcd_byte;//LC75823E的显示缓冲区中的byte计数
  12           extern unsigned char lcd_bit;//LC75823E的显示缓冲区中一个byte的bit计数
  13           extern BYTE disp_buff[]; //LC75823E显示缓冲区定义,20个字节
  14           extern bit vfd_flag ;//更新显示标志
  15          
  16           
  17           bit key_detect_en = 1;     //是否允许按键检测
  18           bit updata_disp = 0;
  19          
  20           unsigned char screen; 
  21           unsigned char disp_buf[4] = {0xff,0xff,0xff,0xff};
  22           bit led_blank_flag;
  23          
  24           unsigned char   key_bak = 0 , yKeyTimeTemp = 0;      //按键扫描时用的中间变量
  25           code unsigned char code lcd_segment[] = { LED_0,LED_1,LED_2,LED_3,LED_4,LED_5,LED_6,LED_7,LED_8,LED_9,LED
             -_V,LED__, LED_P,LED_E};//数字0-9,V,-,P,E
  26          
  27           #define Clr_bit(b)     &= ~(1<<(b))
  28           #define  MAX_MSG_POOL    15 //最大信息池深度
  29           unsigned char xdata msg_buf[MAX_MSG_POOL];
  30           unsigned char  data msg_read_counter = 0;
  31           unsigned char  data msg_write_counter = 0; 
  32          /*******************************************************************************************************
  33          *   函数名称: put_msg()
  34          *   功    能:消息池管理,把信息压入消息池中,消息池深度为0~15
  35          *   输入参数: msg
  36          *   输出参数:所需要的信息msg
  37          *   说    明:*消息池深度为15层(0~15)
  38                        *在消息池工作过程中,会禁止中断的发生
  39          ********************************************************************************************************/
  40           #pragma NOAREGS
  41           #pragma DISABLE
  42           void put_msg(unsigned char msg)small    //信息压入消息池
  43           {
  44   1           msg_buf[msg_write_counter] = msg;
  45   1           msg_write_counter++;
  46   1           if(msg_write_counter == MAX_MSG_POOL)
  47   1               msg_write_counter = 0;
  48   1       }
  49          /*******************************************************************************************************
  50          *   函数名称: get_msg()
  51          *   功    能:把已经压入消息池中的信息读出来
  52          *   输入参数: msg_temp
  53          *   输出参数:所需要的信息msg
  54          *   说    明:
C51 COMPILER V7.50   KEY_DISPLAY                                                           09/17/2008 16:34:35 PAGE 2   

  55          *******************************************************************************************************/
  56           #pragma DISABLE
  57           unsigned char get_msg(void) small //从消息池中读出信息
  58           {
  59   1           unsigned char  msg;
  60   1           if(msg_read_counter == msg_write_counter)
  61   1           {
  62   2               return NO_MSG;
  63   2           }
  64   1           msg = msg_buf[msg_read_counter];
  65   1           msg_read_counter++;
  66   1           if(msg_read_counter == MAX_MSG_POOL)
  67   1               msg_read_counter = 0;
  68   1      
  69   1           return msg;
  70   1       }
  71           #pragma AREGS
  72          /*******************************************************************************************************
  73          *   函数名称: display()
  74          *   功    能:LED(四位数码管、最高位为1)的显示管理(共阳)
  75          *   输入参数: msg_temp
  76          *   输出参数:
  77          *   说    明:
  78          *******************************************************************************************************/
  79          void display()
  80          {
  81   1          if(led_blank_flag)
  82   1          {
  83   2              led_com1 = LED_HIGH;
  84   2              led_com2 = LED_HIGH;
  85   2              led_com3 = LED_HIGH;
  86   2              led_com4 = LED_HIGH;
  87   2              return;
  88   2          }    
  89   1          if(screen == 0)
  90   1          {
  91   2              led_com1 = LED_HIGH;
  92   2              led_com2 = LED_HIGH;
  93   2              led_com3 = LED_HIGH;
  94   2              led_com4 = LED_LOW;
  95   2              led_seg  = disp_buf[3];            // 最高位
  96   2           }
  97   1          else if(screen == 1)
  98   1          {
  99   2              led_com1 = LED_HIGH;
 100   2              led_com2 = LED_HIGH;
 101   2              led_com3 = LED_LOW;
 102   2              led_com4 = LED_HIGH;
 103   2              led_seg  = disp_buf[2];                 // 次高位
 104   2          }
 105   1          else if(screen == 2)
 106   1          {
 107   2              led_com1 = LED_HIGH;
 108   2              led_com2 = LED_LOW;
 109   2              led_com3 = LED_HIGH;
 110   2              led_com4 = LED_HIGH;
 111   2              led_seg  = disp_buf[1];             // 次低位
 112   2          }
 113   1          else if(screen == 3)
 114   1          {
 115   2              led_com1 = LED_LOW;
 116   2              led_com2 = LED_HIGH;
C51 COMPILER V7.50   KEY_DISPLAY                                                           09/17/2008 16:34:35 PAGE 3   

 117   2              led_com3 = LED_HIGH;
 118   2              led_com4 = LED_HIGH;
 119   2              led_seg  = disp_buf[0];             // 最低位
 120   2          }
 121   1      }
 122          /********************************************************************************************************
 123          *   函数名称:key_scan()
 124          *   功    能:
 125                        
 126          *   输入参数:
 127          *   输出参数:
 128          *   说    明:
 129          *********************************************************************************************************/
 130          void key_scan(void)
 131           {
 132   1           unsigned char key_flag_start = 0,temp;    //初始化为无按键按下
 133   1           EA = 0;
 134   1           CPUCFG |= 0x20; //选择EMI
 135   1           temp = XBYTE[0x8000];//相当于读P6口的电压
 136   1           CPUCFG = 0; //IRAM
 137   1           EA = 1;
 138   1           if ((temp & 0x01) == 0)key_flag_start = KEY_NEXT;//S0
 139   1           else if ((temp & 0x02) == 0)key_flag_start = KEY_PREV;//S1
 140   1           else if ((temp & 0x04) == 0)key_flag_start = KEY_P_P;//S2
 141   1           
 142   1      
 143   1           if (key_flag_start)
 144   1           {
 145   2      
 146   2               if((key_bak != 0) && (key_bak != key_flag_start))
 147   2               {
 148   3                   yKeyTimeTemp = 0;
 149   3               }
 150   2               key_bak =   key_flag_start;
 151   2               if (yKeyTimeTemp < 250)yKeyTimeTemp ++;
 152   2               if(yKeyTimeTemp == 101)     //长按
 153   2               {
 154   3                   put_msg(key_bak | 0x10);
 155   3                   //put_msg(key_bak | 0x20);
 156   3               }
 157   2               else if((yKeyTimeTemp > 120)&&((key_bak==KEY_NEXT)||(key_bak==KEY_PREV)))       //音量增加或减小
 158   2               {
 159   3                   //flash_disp_mask = 1;
 160   3                   put_msg(key_bak | 0x10);
 161   3                   //put_msg(key_bak | 0x20);
 162   3                   yKeyTimeTemp -= 15;     //2007-9-29 8:16 by juntham
 163   3                               //yKeyTimeTemp -= 30; 
 164   3               }
 165   2      
 166   2           }
 167   1           else
 168   1           {
 169   2               if((yKeyTimeTemp < 3)||(yKeyTimeTemp >100))          //长按或抖动
 170   2               {
 171   3                   yKeyTimeTemp    = 0;
 172   3               }
 173   2               else//((yKeyTimeTemp >= 3)&&(yKeyTimeTemp <= 200))         //短按
 174   2               {
 175   3      
 176   3                   put_msg(key_bak);
 177   3                   yKeyTimeTemp = 0;
 178   3               }
C51 COMPILER V7.50   KEY_DISPLAY                                                           09/17/2008 16:34:35 PAGE 4   

 179   2               //flash_disp_mask = 0;
 180   2           }
 181   1       }
 182          /********************************************************************************************************
 183          *   函数名称: timer4_init()
 184          *   功    能:Timer4的初始化程序,timer4 OSC(振荡器) input 12.288Mh,T4PR = 2.5 * 12288 / 128 = 240,
 185                        定时2.5ms;timer4的中断为低优先级.
 186          *   输入参数: msg_temp
 187          *   输出参数:
 188          *   说    明:
 189          ********************************************************************************************************/
 190           void timer4_init(void)
 191           {
 192   1           INTFG0 Clr_bit(F_T4);
 193   1           T4CON  = 0x87; // 选择timer模式,OSC 12.288M为计数源,128预分频,compare mode
 194   1           T4CNT  = 0X00;
 195   1           T4PR   = (unsigned long)CRYSTAL * 2.5 / 128000;    //T4PR_set; 2.5 for 12.288M
 196   1           IP1   &= 0xFB;               //关timer4的优先级
 197   1           IEN1  |= 0x04;               //开timer4中断
 198   1           T4CON |= 0x10;               //使能timer4
 199   1       }
 200          /********************************************************************************************************
 201          *   函数名称: Timer_4_Isr()
 202          *   功    能:timer4中断服务程序,每2.5ms产生一次中断,主要处理了扫描按键,
 203                        即每3*2.5ms调用一次键盘扫描函数。
 204          *   输入参数: msg_temp
 205          *   输出参数:
 206          *   说    明:
 207          *********************************************************************************************************/
 208           void Timer_4_Isr() INT_TMR4
 209           {
 210   1           static unsigned char key_scan_flag = 0;
 211   1               
 212   1           INTFG0 Clr_bit(F_T4);                    // timer4 pending bit
 213   1           _push_(DPS);
 214   1           DPCON = 0x0; //DPTR0
 215   1           BANKSEL = 0;
 216   1               key_scan_flag++;
 217   1           if(key_scan_flag == 3)
 218   1           {
 219   2              if(key_detect_en)
 220   2              {
 221   3                  key_scan_flag = 0;
 222   3                  key_scan();      // 扫描得到键值  待处理
 223   3              }
 224   2           }
 225   1           screen++;
 226   1           if(screen > 3)
 227   1              screen = 0;
 228   1           display();
 229   1           _pop_(DPS);
 230   1       }
 231          
 232          /********************************************************************************************************
 233          *   函数名称: 
 234          *   功    能:
 235          *   输入参数:定时50MS
 236          *   输出参数:
 237          *   说    明:
 238          ********************************************************************************************************/
 239          void timer0_init(void)
 240          {
C51 COMPILER V7.50   KEY_DISPLAY                                                           09/17/2008 16:34:35 PAGE 5   

 241   1        TMOD = 0x01;//T0的工作模式,12分频,16位
 242   1        TH0 = (65536-50000/3)/256;
 243   1        TL0 = (65536-50000/3)%256;
 244   1        IEN0 |= 0x02;//开t0中断
 245   1        TCON |= 0x10;//使能t0
 246   1      }
 247          /********************************************************************************************************
 248          *   函数名称: 
 249          *   功    能:中断服务程序,每50MS产生一次中断,定时0.25S
 250          *   输入参数:
 251          *   输出参数:
 252          *   说    明:
 253          ********************************************************************************************************/
 254          void t0(void) interrupt 1 using 0
 255          {
 256   1        unsigned char tcont;
 257   1        tcont++;
 258   1        if(tcont==5)
 259   1        {
 260   2           tcont=0;
 261   2               disp_buff[lcd_byte] &= ~(1<<lcd_bit);//熄灭当前字段
 262   2               vfd_flag = !vfd_flag;//更新显示标志取反,闪烁显示
 263   2        }
 264   1        TH0 = (65536-50000/3)/256;
 265   1        TL0 = (65536-50000/3)%256;
 266   1      }
 267          /********************************************************************************************************
 268          *   函数名称: 
 269          *   功    能:
 270          *   输入参数:
 271          *   输出参数:
 272          *   说    明:
 273          ********************************************************************************************************/
 274           void disp_number(unsigned char a,unsigned char b)      
 275           {     
 276   1           disp_buf[3] = lcd_segment[a%10];
 277   1           disp_buf[2] = lcd_segment[b%10] LED_DOT;
 278   1           disp_buf[1] = lcd_segment[((b%100)/10)];
 279   1           if (b<100)disp_buf[0] =  LED_BLANK;
 280   1           else  disp_buf[0] =  LED_ALL_ON;
 281   1       }
 282          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    513    ----
   CONSTANT SIZE    =     14    ----
   XDATA SIZE       =     15    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     10       1
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      3    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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