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

📄 key_b.lst

📁 本程序主要通过外部中断INT0及3.3端口读取PS2键盘值并通过LCD1602显示
💻 LST
字号:
C51 COMPILER V8.08   KEY_B                                                                 10/11/2008 11:54:07 PAGE 1   


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

line level    source

   1          /****************************************************************************
   2          *函数功能:本程序主要通过外部中断INT0及3.3端口读取PS2键盘值并通过LCD1602显示,           
   3          *键扫描码的解码通过数组方式解码,程序的解码功能主要针对数字及大小写字母和常用                     
   4          *标点符号 
   5          *创建者:  曹兴
   6          *创建日期:2008-10-11
   7          *版本号:  2008101101
   8          *****************************************************************************/
   9          #include"reg51.h"
  10          #include"stdio.h"
  11          /*****************************端口定义***************************************/
  12          #define   DATA    P0                                     //LCD数据传输端口
  13          sbit RS = P2^7;                                      //LCD控制端口定义
  14          sbit RW = P2^6;
  15          sbit EP = P2^5;
  16          sbit k_data =  P3^3;                                     //PS/2数据线端口
  17          sbit k_clk  =  P3^2;                                     //PS/2时钟线端口
  18          unsigned char bitcount = 11;                     //PC键盘数据长度计数
  19          unsigned char input = 0;                                 //缓冲区读指针
  20          unsigned char k_buf[32];                                 //键盘缓冲区
  21          //没有按下shift键的PC键盘扫描码
  22          unsigned char code unshifted[][2]=
  23          {28,'a',50,'b',33,'c',35,'d',36,'e',43,'f',52,'g',51,'h',67,'i',59,'j',
  24           66,'k',75,'l',58,'m',49,'n',68,'o',77,'p',21,'q',45,'r',27,'s',44,'t',
  25           60,'u',42,'v',29,'w',34,'x',53,'y',26,'z',69,'0',22,'1',30,'2',38,'3',
  26           37,'4',46,'5',54,'6',61,'7',62,'8',70,'9',14,'`',78,'-',85,'=',
  27           84,'[',91,']',76,';',65,',',73,'.',74,'/'};
  28          //按下shift键的PC键盘扫描码
  29          unsigned char code shifted[][2]=
  30          {28,'A',50,'B',33,'C',35,'D',36,'E',43,'F',52,'G',51,'H',67,'I',59,'J',
  31           66,'K',75,'L',58,'M',49,'N',68,'O',77,'P',21,'Q',45,'R',27,'S',44,'T',
  32           60,'U',42,'V',29,'W',34,'X',53,'Y',26,'Z',69,')',22,'!',30,'@',38,'#',
  33           37,'$',46,'%',54,'^',61,'&',62,'*',70,'(',14,'~',78,'_',85,'+',93,'|',
  34           84,'{',91,'}',76,':',82,'"',65,'<',73,'>',74,'?'};
  35          /*****************************************************************************
  36          *函数名称:put_k_buf
  37          *函数功能:将解码后的字符放入键盘缓冲区内
  38          *入口参数:k_char
  39          *出口参数:无
  40          *****************************************************************************/
  41          void put_k_buf(unsigned char k_char)
  42          {
  43   1       k_buf[input] = k_char;                                  //送键盘值ASCII码到键盘缓冲区
  44   1       if(input<31)
  45   1          input++;
  46   1       else
  47   1          input = 0;
  48   1              return;
  49   1      } 
  50          /*****************************************************************************
  51          *函数名称:decode
  52          *函数功能:解码函数,将接收到的数据转化为其对应的字符
  53          *入口参数:k_code
  54          *出口参数:无
  55          *****************************************************************************/
C51 COMPILER V8.08   KEY_B                                                                 10/11/2008 11:54:07 PAGE 2   

  56          void decode(unsigned char k_code) 
  57          {
  58   1       static unsigned char shift,up,shiftup;
  59   1       unsigned i;
  60   1       if(k_code==0xf0)                                                //按键释放
  61   1       {
  62   2        up = 1;
  63   2        return;
  64   2       }
  65   1       if(up==1)                                                               //shift键开关
  66   1       {
  67   2       up = 0;
  68   2       if((k_code==0x12)|(k_code==0x59))
  69   2          shift = 0;
  70   2       return;
  71   2       }
  72   1       switch(k_code)
  73   1              {
  74   2                      case 0x12:                                               //检测左shift键
  75   2                           {
  76   3                               shift = 1;
  77   3                               shiftup = 1;
  78   3                               } 
  79   2                       case 0x59:                                              //检测右shift键
  80   2                           {
  81   3                                shift = 1;
  82   3                                shiftup = 1;
  83   3                               }
  84   2                        default:                                               
  85   2                           { 
  86   3                                if(shift==0)                           //找出没有按下shift键的字符码将其存日键盘缓冲区中
  87   3                                 {
  88   4                                  for(i=0;unshifted[i][0]!=k_code&&unshifted[i][0];i++);
  89   4                                  if(unshifted[i][0]==k_code)
  90   4                                  put_k_buf(unshifted[i][1]);
  91   4                                 }                                             
  92   3                                else                                           //找出按下shift键的字符码将其存日键盘缓冲区中
  93   3                                 {
  94   4                                      for(i=0;shifted[i][0]!=k_code&&shifted[i][0];i++);              
  95   4                                  if(shifted[i][0]==k_code)
  96   4                                      put_k_buf(shifted[i][1]);       
  97   4                                 }
  98   3                               }
  99   2                      } 
 100   1      }
 101          /*****************************************************************************
 102          *函数名称:Keyboard_out
 103          *函数功能:中断函数接受键盘发来的数据
 104          *入口参数:无
 105          *出口参数:无
 106          *****************************************************************************/
 107          void Keyboard_out(void) interrupt 0     using 0
 108          {
 109   1       static unsigned char dat;
 110   1       switch(bitcount)
 111   1       {
 112   2        case 11:                                                              //接收起始位 
 113   2            {
 114   3                 if(k_data )                                          //若数据线为高则返回
 115   3                      return ;                                        
 116   3                 else                                                     //若数据线为低则bitcount减1准备接收数据 
 117   3                      bitcount--; 
C51 COMPILER V8.08   KEY_B                                                                 10/11/2008 11:54:07 PAGE 3   

 118   3                 break;                
 119   3                }
 120   2        case 2:                                                               //奇校验位
 121   2                {
 122   3                 bitcount--;
 123   3                 break;
 124   3                }                                                                     
 125   2         case 1:                                                              //停止位
 126   2             {
 127   3                 bitcount--;                                      
 128   3                 if(!k_data )                                         //若数据线为0,则主机禁止接收放弃数据
 129   3                 {
 130   4                  bitcount = 11;
 131   4                      return;
 132   4                 }
 133   3                 else                                                         //若数据线为1,则接受停止位
 134   3                 {
 135   4                  bitcount = 11;
 136   4                  decode(dat);                                    //将数据进行解码
 137   4                 }
 138   3                 break;
 139   3                 }
 140   2        
 141   2         default:                                                 //通过移位保存接收的8位数据
 142   2             {
 143   3                  dat = (dat>>1);
 144   3                      if(k_data )
 145   3                      dat|=0x80;
 146   3                      bitcount--;
 147   3                 }
 148   2       }
 149   1      }
 150          /*****************************************************************************
 151          *函数名称:delayns
 152          *函数功能:LCD延时子程序
 153          *入口参数:time
 154          *出口参数:无
 155          *****************************************************************************/
 156          void delayns(unsigned char time)
 157          {
 158   1       unsigned char i;
 159   1       for(;time>0;time--)
 160   1       for(i = 0; i< 250; i++)        ;
 161   1      }
 162          /*****************************************************************************
 163          *函数名称:lcd_buzy
 164          *函数功能:测试LCD忙碌状态               
 165          *入口参数:无
 166          *出口参数:result
 167          *****************************************************************************/
 168          bit lcd_buzy()
 169          {
 170   1       bit result;
 171   1       RS = 0;
 172   1       RW = 1;
 173   1       EP = 1;
 174   1       delayns(1);                          //此处延时特别重要 (必不可少)
 175   1       result = (bit)(DATA & 0x80);
 176   1       delayns(1);
 177   1       EP = 0;
 178   1       return result;
 179   1      }
C51 COMPILER V8.08   KEY_B                                                                 10/11/2008 11:54:07 PAGE 4   

 180          /*****************************************************************************
 181          *函数名称:lcd_w_order
 182          *函数功能:写指令数据到LCD子程序
 183          *入口参数:cmd
 184          *出口参数:无
 185          *****************************************************************************/
 186          void lcd_w_order(unsigned char cmd)
 187          {
 188   1       while(lcd_buzy());                  //判断LCD是否忙碌
 189   1       RS = 0;
 190   1       RW = 0;
 191   1       EP = 1;
 192   1       DATA = cmd;
 193   1       delayns(1);
 194   1       EP = 0;
 195   1      }
 196          /*****************************************************************************
 197          *函数名称:lcd_w_data
 198          *函数功能:写入显示数据到LCD子程序
 199          *入口参数:dat
 200          *出口参数:五
 201          *****************************************************************************/
 202          void lcd_w_data(unsigned char dat)
 203          {
 204   1       while(lcd_buzy());                  //判断LCD是否忙碌
 205   1       RS = 1;
 206   1       RW = 0;
 207   1       EP = 1;
 208   1       DATA = dat;
 209   1       delayns(1);
 210   1       EP = 0;
 211   1      }
 212          /*****************************************************************************
 213          *函数名称:lcd_post
 214          *函数功能:设定显示位置子程序
 215          *入口参数:pos
 216          *出口参数:无 
 217          *****************************************************************************/
 218          void lcd_post(unsigned char pos)
 219          
 220          {
 221   1       lcd_w_order(pos | 0x80);
 222   1      }
 223          /*****************************************************************************
 224          *函数名称:lcd_init
 225          *函数功能:LCD初始化子程序
 226          *入口参数:无
 227          *出口参数:无
 228          *****************************************************************************/
 229          void lcd_init()
 230          {
 231   1       lcd_w_order(0x38);                    //显示模式设置
 232   1       delayns(1);
 233   1       lcd_w_order(0x0c);                    //显示光标设置,开显示
 234   1       delayns(1);
 235   1       lcd_w_order(0x06);                    //显示光标移动(右移) 
 236   1       delayns(1);
 237   1       lcd_w_order(0x01);                    //清屏
 238   1       delayns(1);
 239   1      }
 240          /*****************************************************************************
 241          *函数名称:main
C51 COMPILER V8.08   KEY_B                                                                 10/11/2008 11:54:07 PAGE 5   

 242          *函数功能:本程序主要通过外部中断INT0及3.3端口读取PS2键盘值并通过LCD1602显示,键
 243          *扫描码的解码通过数组方式解码,程序的解码功能主要针对数字及大小写字母和常用标点
 244          *符号
 245          *入口参数:无
 246          *出口参数:无 
 247          *****************************************************************************/
 248          void main()
 249          {
 250   1       unsigned char j,i=0;
 251   1       EA = 1;
 252   1       IT0 = 1;
 253   1       EX0 = 1;
 254   1       
 255   1       while(1)
 256   1       {
 257   2       i=0;
 258   2       lcd_init();                       // 初始化LCD
 259   2       delayns(10);
 260   2       lcd_post(0x00);                   //设置显示位置
 261   2       while(i<input)                    
 262   2       {
 263   3        lcd_w_data(k_buf[i]);            //显示字符
 264   3        i++;
 265   3       if(i==16)
 266   3        {
 267   4         lcd_post(0x40);                 // 设置显示位置
 268   4        }       
 269   3       }
 270   2       for (j=0;j<20;j++)
 271   2       delayns(200);
 272   2       }
 273   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    495    ----
   CONSTANT SIZE    =    184    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     38       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 + -