📄 keycode.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 + -