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

📄 keyboard.lst

📁 S52单片机对PS/2键盘的主从通信
💻 LST
字号:
C51 COMPILER V7.50   KEYBOARD                                                              12/01/2006 18:46:01 PAGE 1   


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

line level    source

   1          #include"reg52.h"
   2          #include "intrins.h"
   3          #include "string.h"
   4          #include "key.h" //按键通码与ascii对照表
   5          #define uchar unsigned char
   6          #define uint  unsigned int
   7          #define cmd_word 0xff   //复位命令
   8          sbit Clk_Line = P3^3; //时钟线
   9          sbit Data_Line=P3^4;  //键盘数据线
  10          uchar key=0; //按键最终值
  11          uint  Key_Value=0;
  12          uchar Int_Time=0;
  13          uchar save=0;
  14          uchar display[40];
  15          uint num = 0;
  16          uchar blank;
  17          uchar flag;
  18          uchar comf = 0x01;
  19          //**************************************************************************
  20          void init(void);
  21          void delay(uint us);    //us=12大约100us 
  22          void command(uchar cmd);
  23          void interrupt1_receive(void);
  24          void getkey(void) ;////内部中断0 用来处理缓冲区里的数据
  25          void keyprocess(void);
  26          void lcdclr(void);
  27          //**************************************************************************
  28          //Port Definitions**********************************************************
  29          sbit LcdRs  = P1^0;
  30          sbit LcdRw  = P1^1;
  31          sbit LcdEn  = P1^2;
  32          sfr  DBPort = 0x80;  //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
  33          
  34          sbit LcdLight   = DBPort^4;
  35          
  36          void Delay1ms(unsigned int count)
  37          {
  38   1       unsigned int i,j;
  39   1       for(i=0;i<count;i++)
  40   1       for(j=0;j<120;j++);
  41   1      }
  42          //内部等待函数**************************************************************************
  43          unsigned char LCD_Wait(void)
  44          {
  45   1       LcdRs=0;
  46   1       LcdRw=1; _nop_();
  47   1       LcdEn=1; _nop_();
  48   1       while(DBPort&0x80);  //或do{ACC=DBPort;} while(ACC_7==1); 忙信号??为1忙
  49   1       LcdEn=0;
  50   1       Delay1ms(1);
  51   1       return ACC;  
  52   1      }
  53          //向LCD写入命令或数据************************************************************
  54          #define LCD_COMMAND   0x00      // Command
  55          #define LCD_DATA   0x01         // Data
C51 COMPILER V7.50   KEYBOARD                                                              12/01/2006 18:46:01 PAGE 2   

  56          #define LCD_CLEAR_SCREEN 0x01   // 清屏
  57          #define LCD_HOMING    0x02      // 光标返回原点
  58          void LCD_Write(unsigned char style, unsigned char input)
  59          {
  60   1       LcdRs=style;
  61   1       LcdRw=0;  _nop_();
  62   1       LcdEn=1;  _nop_();
  63   1       DBPort=input; _nop_();
  64   1       LcdEn=0;  _nop_();
  65   1       LCD_Wait(); 
  66   1      }
  67          
  68          //设置显示模式************************************************************
  69          #define LCD_SHOW   0x04    //显示开
  70          #define LCD_HIDE   0x00    //显示关   
  71          
  72          #define LCD_CURSOR   0x02  //显示光标
  73          #define LCD_NO_CURSOR  0x00    //无光标       
  74          
  75          #define LCD_FLASH   0x01    //光标闪动
  76          #define LCD_NO_FLASH  0x00    //光标不闪动
  77          
  78          void LCD_SetDisplay(unsigned char DisplayMode)
  79          {
  80   1       LCD_Write(LCD_COMMAND, 0x08|DisplayMode); 
  81   1      }
  82          
  83          //设置输入模式************************************************************
  84          #define LCD_AC_UP   0x02
  85          #define LCD_AC_DOWN   0x00      // default
  86          
  87          #define LCD_MOVE   0x01      // 画面可平移
  88          #define LCD_NO_MOVE   0x00      //default
  89          
  90          void LCD_SetInput(unsigned char InputMode)
  91          {
  92   1       LCD_Write(LCD_COMMAND, 0x04|InputMode);
  93   1      }
  94          
  95          //移动光标或屏幕************************************************************
  96          #define LCD_CURSOR  0x02      
  97          #define LCD_SCREEN  0x08
  98          #define LCD_LEFT  0x00
  99          #define LCD_RIGHT  0x04
 100          void LCD_Move(unsigned char object, unsigned char direction)
 101          {
 102   1       if(object==LCD_CURSOR)
 103   1        LCD_Write(LCD_COMMAND,0x10|direction);
 104   1       if(object==LCD_SCREEN)
 105   1        LCD_Write(LCD_COMMAND,0x18|direction);
 106   1      }
 107          
 108          //初始化LCD************************************************************
 109          void LCD_Initial()
 110          {
 111   1       LcdEn=0;
 112   1       Delay1ms(80);
 113   1       LCD_Write(LCD_COMMAND,0x38);           //8位数据端口,2行显示,5*7点阵
 114   1       Delay1ms(10);
 115   1       LCD_Write(LCD_COMMAND,0x38);
 116   1       Delay1ms(10);
 117   1       LCD_SetDisplay(LCD_SHOW|LCD_CURSOR);    //开启显示, 无光标
C51 COMPILER V7.50   KEYBOARD                                                              12/01/2006 18:46:01 PAGE 3   

 118   1       //LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
 119   1       LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);          //清屏
 120   1       LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动
 121   1      }
 122          
 123          //************************************************************************
 124          void GotoXY(unsigned char x, unsigned char y)//y是行 ,x是列
 125          {
 126   1       if(y==0)
 127   1        LCD_Write(LCD_COMMAND,0x80|x);
 128   1       if(y==1)
 129   1        LCD_Write(LCD_COMMAND,0x80|(x-0x40));
 130   1      }
 131          void Print(unsigned char *str)
 132          {
 133   1       while(*str!='\0')
 134   1       {
 135   2        LCD_Write(LCD_DATA,*str);
 136   2        str++;
 137   2       }
 138   1      }
 139          void LCD_LoadChar(unsigned char user[8], unsigned char place)
 140          {
 141   1       unsigned char i;
 142   1       LCD_Write(LCD_COMMAND,0x40|(place*8));
 143   1       for(i=0; i<8; i++)
 144   1         LCD_Write(LCD_DATA,user[i]);
 145   1      }
 146          //************************************************************************
 147          void lcdclr(void)
 148          {
 149   1         uchar clrstr[17];
 150   1         uchar i = 0;
 151   1         while(i < 16)
 152   1         {
 153   2            clrstr[i++] = ' ';  
 154   2         }
 155   1         clrstr[i] = 0;
 156   1         GotoXY(0, 0);
 157   1         Print(clrstr);       //在LCD上显示按键值
 158   1         GotoXY(0, 1);
 159   1         Print(clrstr);       //在LCD上显示按键值
 160   1      }
 161          //************************************************************************
 162          
 163          void main(void)
 164          {
 165   1          uchar thir=2; 
 166   1          init();                //初始化
 167   1          LCD_Initial();
 168   1          command(cmd_word);  
 169   1          delay(150);
 170   1          while(1)
 171   1          {
 172   2            EX1=1;
 173   2            while(EX1) ;
 174   2            getkey();
 175   2            keyprocess();
 176   2          }
 177   1      }
 178          void init(void)
 179          {
C51 COMPILER V7.50   KEYBOARD                                                              12/01/2006 18:46:01 PAGE 4   

 180   1         EA = 1;
 181   1         IT1 = 1;     //外部中断1是下降沿触发方式
 182   1      }
 183          
 184          void getkey(void)
 185          {
 186   1           uchar i=0;
 187   1           //static uint num = 0;
 188   1           save = Key_Value;
 189   1           for(i=0;i<49;i++)
 190   1           {
 191   2               if(noshift[i][0] == save) //普按键的通码在缓冲区的第一位
 192   2               {   
 193   3                   key = noshift[i][1]; //搜索到字母后进行相应的处理 
 194   3                   P2 = key;             
 195   3                   if(num == 32)
 196   3                   {
 197   4                      //num = 0;
 198   4                      while(num)
 199   4                      {
 200   5                         display[--num] = 0;
 201   5                      }
 202   4                      blank = 0;
 203   4                      lcdclr();
 204   4                   }
 205   3                   display[num++] = key;
 206   3                   flag = 0;
 207   3                   break;   
 208   3               }
 209   2           } 
 210   1      } 
 211          void keyprocess(void)
 212          {      
 213   1           delay(10);
 214   1          if((save == back)&&num)
 215   1          { 
 216   2             flag = 0;
 217   2             if(num == 16 && blank) 
 218   2             {
 219   3                while(--blank)
 220   3                {
 221   4                    display[--num] = 0;
 222   4                    GotoXY(num,0);
 223   4                    Print(" ");       
 224   4                }
 225   3             }
 226   2             else
 227   2             {
 228   3                display[--num] = 0;
 229   3                if(num<16) 
 230   3                   GotoXY(num,0);
 231   3                else 
 232   3                   GotoXY(num-16,1);
 233   3                Print(" ");   
 234   3             }
 235   2          } 
 236   1          if(num<=16)
 237   1          {     
 238   2              if(save == enter)
 239   2              {   
 240   3                  flag = 0;
 241   3                  blank = 17 - num;
C51 COMPILER V7.50   KEYBOARD                                                              12/01/2006 18:46:01 PAGE 5   

 242   3                  while( num < 16 )
 243   3                  {  
 244   4                      display[num++] = ' ';
 245   4                  }
 246   3                  flag = 1;
 247   3              }
 248   2              else
 249   2              {
 250   3                  GotoXY(0, 0);
 251   3                  Print(display);          //在LCD上显示按键值
 252   3              }
 253   2      
 254   2          }
 255   1          else 
 256   1          {
 257   2              GotoXY(0, 1);
 258   2              Print(display+16);
 259   2          }
 260   1          if(flag == 1)
 261   1          {
 262   2              GotoXY(0, 1);
 263   2          }       
 264   1      }
 265          void delay(uint us)  //us=12大约100us 
 266          { 
 267   1         while(us--) ;
 268   1      }
 269          void interrupt1_receive(void) interrupt 2
 270          { 
 271   1        _nop_();
 272   1        if(Data_Line)
 273   1           Key_Value|=0x8000;
 274   1        Int_Time++;
 275   1        if(Int_Time==11)
 276   1        { 
 277   2          Key_Value>>=6;
 278   2          Int_Time=0;
 279   2          EX1=0;
 280   2        }
 281   1        Key_Value>>=1; 
 282   1      }
 283          void command(uchar cmd)
 284          {  
 285   1         uchar parity;
 286   1         uchar i;
 287   1         comf = 0x01;
 288   1         parity=0;
 289   1      
 290   1         Clk_Line=1;
 291   1         Data_Line=1;
 292   1         delay(100);
 293   1         Clk_Line=0;
 294   1         delay(20);  
 295   1         Data_Line=0;
 296   1         Clk_Line = 1;
 297   1         for(i=0;i<8;i++)
 298   1         {  
 299   2            Clk_Line = 1;
 300   2            while(Clk_Line);
 301   2            Data_Line = 0; 
 302   2            if(cmd & (comf<<1)) 
 303   2            {
C51 COMPILER V7.50   KEYBOARD                                                              12/01/2006 18:46:01 PAGE 6   

 304   3               Data_Line = 1;  
 305   3               parity++; 
 306   3            }
 307   2         }
 308   1         while(!Clk_Line) ; 
 309   1         while(Clk_Line)  ; 
 310   1         
 311   1         if((parity&0x01))
 312   1            Data_Line=0;
 313   1         else Data_Line=1;
 314   1         while(!Clk_Line) ;
 315   1         while(Clk_Line)  ;
 316   1         Data_Line=1;
 317   1         while(!Clk_Line);
 318   1         while(Data_Line) ; 
 319   1         while(Clk_Line) ;
 320   1         while(!Clk_Line) ;
 321   1         while(!Data_Line);
 322   1      } 
 323          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    871    ----
   CONSTANT SIZE    =    256    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     50      28
   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 + -