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

📄 key_lcd.lst

📁 单片机与LCD1602
💻 LST
字号:
C51 COMPILER V8.02   KEY_LCD                                                               12/31/2008 16:15:53 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE KEY_LCD
OBJECT MODULE PLACED IN key_lcd.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE key_lcd.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<AT89X51.h>
   2          #include <stdio.h>
   3          #include <math.h>
   4          #define unchar unsigned char
   5          #define unint unsigned int
   6          sbit e=P2^0;
   7          sbit rw=P2^1;
   8          sbit rs=P2^2;
   9          bit flag=0;
  10          unint count=0;
  11          unchar code table[]={0x30,0x31,0x32,0x33,
  12                               0x34,0x35,0x36,0x37,
  13                                                   0x38,0x39,0x2b,0x2d,
  14                                                   0x2a,0x25,0x3d,0x30};//+-*/= on分别为2b,2d,2a,25,3d,0x71(F的代码)
  15          unchar key,temp;
  16          
  17          void delay(void);//LCD延时
  18          void delay10ms(unsigned char time);     //键盘延时
  19          void write_c(unchar command);//写命令到LCD
  20          void write_d(unchar dat);//写数据到LCD
  21          //void disply();//显示程序
  22          
  23          
  24          
  25          void delay10ms(unsigned char time) //键盘延时程序
  26          {
  27   1      unsigned char a,b,c;
  28   1      for(a=0;a<time;a++)
  29   1      for(b=0;b<10;b++)
  30   1        for(c=0;c<120;c++)
  31   1        ;
  32   1      }
  33          
  34          void write_c(unchar command)//写命令到LCD
  35          {
  36   1       e=1; 
  37   1       rw=0;
  38   1       rs=0;
  39   1       P0=command;
  40   1       e=0;
  41   1       delay();
  42   1      }
  43          
  44          void write_d(unchar dat) //写数据到LCD
  45          {
  46   1       e=1;
  47   1       rw=0;
  48   1       rs=1;
  49   1       P0=dat;
  50   1       e=0;
  51   1       delay();
  52   1      }
  53          
  54          
  55          void delay(void)  //LCD延时
C51 COMPILER V8.02   KEY_LCD                                                               12/31/2008 16:15:53 PAGE 2   

  56          {
  57   1       int i;
  58   1       for(i=0;i<1000;i++);
  59   1      }
  60          
  61          
  62          void keyscan(void) interrupt 1 //按键扫描子程序
  63          {
  64   1      P3=0xFF;
  65   1      P3_3=0;   //第a行为0
  66   1      temp=P3;
  67   1      temp&=0xF0;
  68   1      if(temp!=0xF0)
  69   1      {
  70   2      delay10ms(10); //等待键盘释放
  71   2      temp=P3;
  72   2      temp&=0xF0;
  73   2      if(temp !=0xF0)
  74   2      { count++;
  75   3        temp=P3;
  76   3        temp&=0xF0;
  77   3      
  78   3        switch(temp)
  79   3        {
  80   4        case 0xe0:
  81   4        key=10;flag=1;break; 
  82   4        case 0xd0:                     
  83   4        key=14;flag=1;break;
  84   4        case 0xb0:
  85   4        key=0;flag=1;break;
  86   4        case 0x70:
  87   4        key=15;flag=1;break;
  88   4        }
  89   3      }
  90   2      }
  91   1      
  92   1      P3=0xFF;
  93   1      P3_2=0;  //第b行为0
  94   1      temp=P3;
  95   1      temp&=0xF0;
  96   1      if(temp !=0xF0)
  97   1      { 
  98   2      delay10ms(10);  //等待键盘释放
  99   2      temp=P3;
 100   2      temp&=0xF0;
 101   2      if(temp !=0xF0)
 102   2      { count++;
 103   3        temp=P3;
 104   3        temp&=0xF0;
 105   3      
 106   3        switch(temp)
 107   3        {
 108   4        case 0xe0:
 109   4        key=11;flag=1;break;
 110   4        case 0xd0:
 111   4        key=3;flag=1;break;
 112   4        case 0xb0:
 113   4        key=2;flag=1;break;
 114   4        case 0x70:
 115   4        key=1;flag=1;break;
 116   4        }
 117   3      }
C51 COMPILER V8.02   KEY_LCD                                                               12/31/2008 16:15:53 PAGE 3   

 118   2      }
 119   1      
 120   1      P3=0xFF;
 121   1      P3_1=0;  //第c行为0
 122   1      temp=P3;
 123   1      temp&=0xF0;
 124   1      if(temp !=0xF0)
 125   1      { 
 126   2      delay10ms(10); //等待键盘释放
 127   2      temp=P3;
 128   2      temp&=0xF0;
 129   2      if(temp !=0xF0)
 130   2      { count++;
 131   3        temp=P3;
 132   3        temp&=0xF0;
 133   3      
 134   3        switch(temp)
 135   3        {
 136   4        case 0xe0:
 137   4        key=12;flag=1;break;
 138   4        case 0xd0:
 139   4        key=6;flag=1;break;
 140   4        case 0xb0:
 141   4        key=5;flag=1;break;
 142   4        case 0x70:
 143   4        key=4;flag=1;break;
 144   4        }
 145   3      }
 146   2      }
 147   1      
 148   1      P3=0xFF;
 149   1      P3_0=0;  //第d行为0
 150   1      temp=P3;
 151   1      temp&=0xF0;
 152   1      if(temp !=0xF0)
 153   1      {
 154   2      delay10ms(10);  //等待键盘释放
 155   2      temp=P3;
 156   2      temp&=0xF0;
 157   2      if(temp !=0xF0)
 158   2      { count++;
 159   3        temp=P3;
 160   3        temp&=0xF0;
 161   3      
 162   3        switch(temp)
 163   3        {
 164   4        case 0xe0:
 165   4        key=13;flag=1;break;
 166   4        case 0xd0:
 167   4        key=9;flag=1;break;
 168   4        case 0xb0:
 169   4        key=8;flag=1;break;
 170   4        case 0x70:
 171   4        key=7;flag=1;break;
 172   4        }
 173   3      }
 174   2      }
 175   1      
 176   1       TH0=0x0b;//重赋初值
 177   1       TL0=0xcf;//20ms
 178   1       TR0=1;
 179   1      }
C51 COMPILER V8.02   KEY_LCD                                                               12/31/2008 16:15:53 PAGE 4   

 180          
 181          void disply(void)       //这个函数没用到,但是一个好的显示函数
 182          { 
 183   1        if(count<=8)   //如果第一行写满则换到第二行
 184   1        {write_c(0x80);
 185   2         write_d(table[key]);
 186   2        }
 187   1        else
 188   1        {
 189   2        write_c(0xc0);
 190   2        write_d(table[key]);
 191   2        }
 192   1        flag=0;
 193   1      }
 194          
 195          main()
 196          {               
 197   1       EA=1; //定时器T0
 198   1       ET0=1;
 199   1       TH0=0x0b;
 200   1       TL0=0xcf;//20ms
 201   1       TR0=1;
 202   1       write_c(0x38);//设置为8总线16*2 5*7点阵
 203   1       write_c(0x0c);//开显示,光标闪烁
 204   1       write_c(0x01);//清屏幕
 205   1       write_c(0x80);
 206   1       while(1)
 207   1       { 
 208   2        if(flag)
 209   2           {if(count<=32)      //如果第一行写满则换到第二行
 210   3               write_d(table[key]);
 211   3            else
 212   3               {
 213   4                write_c(0xc0+(count-34));   //转到第二行显示
 214   4                write_d(table[key]);
 215   4               }
 216   3             flag=0;//标志清零
 217   3            }
 218   2       }
 219   1      }


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