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

📄 keycode.lst

📁 38键小键盘程序,可以实现大小键盘的切换工作,并且接收命令和液晶显示
💻 LST
字号:
C51 COMPILER V8.01   KEYCODE                                                               11/08/2007 21:26:49 PAGE 1   


C51 COMPILER V8.01, COMPILATION OF MODULE KEYCODE
OBJECT MODULE PLACED IN keycode.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE keycode.C OPTIMIZE(9,SPEED) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg51.h>
   2          #include <intrins.h>
   3          #include <string.h>
   4          #include  "Scod.h"
   5          ///////////////////////////////////////////////////////////////////
   6          sbit DATA=P3^4;     //用p3.3做数据线控制口(小键盘)
   7          sbit CLK =P3^2;     //用p3.2做时钟线控制口(小键盘)
   8          sbit Key_Data=P3^5; //定义接受标准键盘引脚控制口(数据线)
   9          sbit Key_CLK=P3^3;  //定义接受标准键盘引脚控制口(时钟线,外部中断1)
  10          sbit inhibit=P4^0; //定义专用键盘和标准PS2键盘控制转换(P4.0)
  11          ///////////////////////////////////////////////////////////////////
  12          sbit a1 = P4^1;     //用p4.1做语音控制口1
  13          sbit a2 = P4^2;     //用p4.1做语音控制口2
  14          //////////////////////////////////////////////////////////////////
  15          sbit buzzer = P2^7;   //用p0.1做蜂鸣器控制口
  16          //////////////////////////////////////////////////////////////////
  17          sbit atxtflag  = P4^3; //用p4.3做AT/XT控制口(拨码开关)
  18          sbit bit1_6flag = P3^6; //用p3.6做1bit/6bit清除控制口(拨码开关)
  19          sbit numberflag = P3^7; //用p3.7做液晶显示数字和*号控制口(拨码开关)
  20          //////////////////////液晶控制位及数据接口/////////////////////////
  21          unsigned char code cdle_net[] = {"    WELCOME!    "}; 
  22          unsigned char code email[] = {"we do our best!!"}; 
  23          unsigned char code Cls[] = {"                "};   //清显示
  24          //字符以ASCII码存储,不需要转换
  25          //OSC=12MHZ 
  26          //LCMPORT=P2,4位模式,不带读“忙”状态功能, 
  27          //现用P0口实验. 
  28          //DATA(D7--D4),D3(E),D2(R/W),D1(RS),D0(VO). 
  29          sfr LCMPORT = 0x80; 
  30          sbit E=LCMPORT^3; 
  31          sbit RW=LCMPORT^2; 
  32          sbit RS=LCMPORT^1; 
  33          sbit VO=LCMPORT^0; 
  34          ///////////////////////////////////////////////////////////////////
  35          #define uchar unsigned char 
  36          #define uint  unsigned int 
  37          ///////////////////////////////////////////////////////////////////
  38          ////////////////////////////键盘扫描定义///////////////////////////
  39          unsigned char keyvartab[8][5]={'A','B','C','D','E',
  40                                         'F','G','H','I','J',
  41                                         'K','L','M','N','O',
  42                                         'P','Q','R','S','T',
  43                                         'U','V','1','2','3',
  44                                         ' ',' ','4','5','6',
  45                                         'W','X','7','8','9',
  46                                         'Y','Z','~','0','!'
  47                                          };
  48          //键盘行扫苗码
  49          #define NOKEY 0x01                                  //无键按下时的返回值 
  50          #define LOHI() P1=0xff; P2=0x80;_nop_()  //00           //列出行入 
  51          #define HOLI() P1=0x00; P2=0x9f;_nop_()  //1F          //行出列入 
  52          
  53          code unsigned char hh[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};    //行位置表 
  54          code unsigned char ll[5]={0x9e,0x9d,0x9b,0x97,0x8f};                                     
  55          
C51 COMPILER V8.01   KEYCODE                                                               11/08/2007 21:26:49 PAGE 2   

  56          unsigned char DispFlag;
  57          unsigned char key;
  58          
  59          ////////////////////////////////////////////////////////////////////
  60          void initlcm4bit(void);
  61          void writport(unsigned char lcmdata);
  62          void writbyte(unsigned char RS,unsigned char asic);
  63          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  64          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  65          /////////////////////////////////////////////////////////////////////
  66          void Delay5Ms(void);
  67          void Delay400Ms(void);
  68          void delay(unsigned  int N);
  69          /////////////////////////////////////////////////////////////////////
  70          void Decode(unsigned char ScanCode);
  71          /////////////////////////////////////////////////////////////////////
  72          void numbertocode(void);
  73          void initkeyvariable(void);
  74          unsigned char readkeyvar(void);
  75          unsigned char parity(unsigned char x);
  76          void SEND_byte(unsigned char byte_data);
  77          /////////////////////////////////////////////////////////////////////
  78          static unsigned char IntNum = 0; //中断次数计数
  79          static unsigned char KeyV; //键值
  80          static unsigned char DisNum = 0; //显示用指针
  81          static unsigned char Key_UP=0, Ctrl = 0;//Key_UP是键松开标识,Ctrl是Ctrl键按下标识
  82          static unsigned char BF = 0; //标识是否有字符被收到
  83          static unsigned char biaozhiflag = 1;//表示小键盘已经有键按下标志位
  84          /////////////////////////////////////////////////////////////////////
  85          /////////////////////////延时子函数开始//////////////////////////////
  86          void delay_ms(unsigned char ms) // 延时子程序
  87          {                                               
  88   1              unsigned char i;
  89   1              while(ms--)
  90   1              {
  91   2                for(i = 0; i < 120; i++);
  92   2              }
  93   1      }
  94          /////////////////////////////////////////
  95          void delayus(unsigned int us) //执行一次是机器周期=12÷11.0592MHz=1.0857μS
  96                                        //(65536-定时常数)*1.0857μS=50mS
  97                                        // 定时常数=4C00H 
  98          { 
  99   1      while(us--); 
 100   1      } 
 101          ////////////////////////////////////////
 102          void delay5Ms(void)
 103          {
 104   1              unsigned int TempCyc =5552;
 105   1              while(TempCyc--);
 106   1      }
 107          ////////////////////////////////////////
 108          //400ms延时函数
 109          void Delay400Ms(void)
 110          {
 111   1              unsigned char TempCycA = 5;
 112   1              unsigned int TempCycB;
 113   1              while(TempCycA--)
 114   1                      {
 115   2                              TempCycB=7269;
 116   2                              while(TempCycB--);
 117   2                      };
C51 COMPILER V8.01   KEYCODE                                                               11/08/2007 21:26:49 PAGE 3   

 118   1      }
 119          ///////////////////////////////////////
 120          // 函数功能:延时子程序,实现(16*N+24)us的延时 
 121          // 系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动
 122          /*void delay(unsigned  int N)  
 123          {
 124            int i; 
 125            for(i=0;i<N;i++);
 126          }
 127          //////////////////////////////////////
 128          void delay_us(unsigned char i)//(2n+8)*i+5T
 129          {
 130                  uchar j,n;
 131                  for(j=i;j;j--)
 132                  for(n=1;n;n--);
 133          }*/
 134          /////////////////////////延时子函数结束//////////////////////////////
 135          /////////////////////////////////////////////////////////////////////
 136          //////////////////////////1602-LCD驱动程序开始///////////////////////
 137          void writport(unsigned char lcmdata) 
 138          { 
 139   1      LCMPORT=lcmdata|0x08; 
 140   1      delayus(100);
 141   1      LCMPORT=lcmdata&0xf7; 
 142   1      } 
 143          ///////////////////////////////////////////////////
 144          //RS=1时为写数据,RS=0时为写命令。 
 145          void writbyte(unsigned char RS,unsigned char asic) 
 146          { 
 147   1      unsigned char temp=asic&0xf0; 
 148   1      if(RS) 
 149   1      { 
 150   2      temp|=0x02; 
 151   2      writport(temp); 
 152   2      temp=asic<<4; 
 153   2      temp|=0x02; 
 154   2      
 155   2      } 
 156   1      else 
 157   1      { 
 158   2      delayus(1050); 
 159   2      writport(temp); 
 160   2      temp&=0xf0; 
 161   2      temp=asic<<4; 
 162   2      
 163   2      } 
 164   1      writport(temp); 
 165   1      } 
 166          ///////////////////////////////////////////////////
 167          //4BIT 初始化,分两行。 
 168          void initlcm4bit(void) 
 169          { 
 170   1      E=0;E=0; 
 171   1      delayus(40000);// 
 172   1      writport(0x20); //4-BIT mode chage 
 173   1      delayus(10000); 
 174   1      writbyte(0,0x2C);//seting display mode 2 line mode,display off //0X2C
 175   1      writbyte(0,0x0C);//display on/off. //0X0F
 176   1      writbyte(0,0x01);//display clear 
 177   1      delayus(30000); 
 178   1      } 
 179          ///////////////////////////////////////////////////
C51 COMPILER V8.01   KEYCODE                                                               11/08/2007 21:26:49 PAGE 4   

 180          //按指定位置显示一个字符 
 181          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) 
 182          { 
 183   1      Y &= 0x1; X &= 0xF; //限制X不能大于15,Y不能大于1 
 184   1      if (Y) X |= 0x40; //当要显示第二行时地址码+0x40; 
 185   1      X |= 0x80; //算出指令码 
 186   1      writbyte(0,X);
 187   1      writbyte(1,DData); 
 188   1      } 
 189          ///////////////////////////////////////////////////
 190          //按指定位置显示一串字符  ***原来的遇到空格0x20就不显示*** 
 191          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) 
 192          { 
 193   1        unsigned char ListLength,j; 
 194   1        ListLength = strlen(DData); 
 195   1        Y &= 0x1; 
 196   1        X &= 0xF; //限制X不能大于15,Y不能大于1 
 197   1            if (X <= 0xF) //X坐标应小于0xF 
 198   1              {  
 199   2            for(j=0;j<ListLength;j++) 
 200   2              { 
 201   3                   DisplayOneChar(X, Y, DData[j]); //显示单个字符 
 202   3                   //delayus5Ms();
 203   3                   X++; 
 204   3                  } 
 205   2              } 
 206   1      } 
 207          //////////////////////////1602-LCD驱动程序结束///////////////////////
 208          /////////////////////////////////////////////////////////////////////
 209          /////////////////////接收大键盘命令开始//////////////////////////////
 210          //接收标准键盘扫描码命令函数
 211          void Keyboard_out(void) interrupt 2     
 212          { 
 213   1              if ((IntNum > 0) && (IntNum < 9))
 214   1                      {                       
 215   2                              KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
 216   2                              if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
 217   2                      }
 218   1              IntNum++;
 219   1              while (!Key_CLK); //等待PS/2CLK拉高
 220   1      
 221   1              if (IntNum > 10)
 222   1                      {
 223   2                              IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
 224   2                              BF = 1; //标识有字符输入完了
 225   2                              EA = 0; //关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数

⌨️ 快捷键说明

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