📄 ps2.lst
字号:
C51 COMPILER V7.06 PS2 06/06/2004 19:47:47 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE PS2
OBJECT MODULE PLACED IN ps2.OBJ
COMPILER INVOKED BY: E:\Keil706\C51\BIN\C51.EXE ps2.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <at89x51.h>
2 #include "scancodes.h"
3
4 #define LCM_RW P1_1 //定义LCD引脚
5 #define LCM_RS P1_0
6 #define LCM_E P1_2
7 #define LCM_Data P0
8
9 #define Key_Data P1_7 //定义Keyboard引脚
10 #define Key_CLK P3_2
11
12 #define Busy 0x80 //用于检测LCM状态字中的Busy标识
13
14 void LCMInit(void);
15 void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData);
16 void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData);
17 void Delay5Ms(void);
18 void Delay400Ms(void);
19 void Decode(unsigned char ScanCode);
20 void WriteDataLCM(unsigned char WDLCM);
21 void WriteCommandLCM(unsigned char WCLCM,BuysC);
22
23 unsigned char ReadDataLCM(void);
24 unsigned char ReadStatusLCM(void);
25 unsigned char code cdle_net[] = {"-www.cdle.net--"};
26 unsigned char code email[] = {"pnzwzw@cdle.net"};
27 unsigned char code Cls[] = {" "};
28 static unsigned char IntNum = 0; //中断次数计数
29 static unsigned char KeyV; //键值
30 static unsigned char DisNum = 0; //显示用指针
31 static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识
32 static unsigned char BF = 0; //标识是否有字符被收到
33
34 void main(void)
35 {
36 1 unsigned char TempCyc;
37 1
38 1 Delay400Ms(); //启动等待,等LCM讲入工作状态
39 1 LCMInit(); //LCM初始化
40 1 Delay5Ms(); //延时片刻(可不要)
41 1
42 1 DisplayListChar(0, 0, cdle_net);
43 1 DisplayListChar(0, 1, email);
44 1 ReadDataLCM();//测试用句无意义
45 1 for(TempCyc=0; TempCyc<10; TempCyc++) {
46 2 Delay400Ms(); //延时
47 2 }
48 1 DisplayListChar(0, 1, Cls);
49 1
50 1 IT0 = 0; //设外部中断1为低电平触发
51 1 EX0 = 1; //开中断
52 1 EA = 1;
53 1
54 1 while(1) {
55 2 if(BF)
C51 COMPILER V7.06 PS2 06/06/2004 19:47:47 PAGE 2
56 2 Decode(KeyV);
57 2 else {
58 3 EA = 1; //开中断
59 3 }
60 2 }
61 1 }
62
63 //写数据
64 void WriteDataLCM(unsigned char WDLCM)
65 {
66 1 ReadStatusLCM(); //检测忙
67 1 LCM_Data = WDLCM;
68 1 LCM_RS = 1;
69 1 LCM_RW = 0;
70 1 LCM_E = 0; //若晶振速度太高可以在这后加小的延时
71 1 LCM_E = 0; //延时
72 1 LCM_E = 1;
73 1 }
74
75 //写指令
76 void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
77 {
78 1 if(BuysC) ReadStatusLCM(); //根据需要检测忙
79 1 LCM_Data = WCLCM;
80 1 LCM_RS = 0;
81 1 LCM_RW = 0;
82 1 LCM_E = 0;
83 1 LCM_E = 0;
84 1 LCM_E = 1;
85 1 }
86
87 //读数据
88 unsigned char ReadDataLCM(void)
89 {
90 1 LCM_RS = 1;
91 1 LCM_RW = 1;
92 1 LCM_E = 0;
93 1 LCM_E = 1;
94 1
95 1 return(LCM_Data);
96 1 }
97
98 //读状态
99 unsigned char ReadStatusLCM(void)
100 {
101 1 LCM_Data = 0xFF;
102 1 LCM_RS = 0;
103 1 LCM_RW = 1;
104 1 LCM_E = 0;
105 1 LCM_E = 1;
106 1 while(LCM_Data & Busy); //检测忙信号
107 1
108 1 return(LCM_Data);
109 1 }
110
111 void LCMInit(void) //LCM初始化
112 {
113 1 LCM_Data = 0;
114 1 WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
115 1 Delay5Ms();
116 1 WriteCommandLCM(0x38,0);
117 1 Delay5Ms();
C51 COMPILER V7.06 PS2 06/06/2004 19:47:47 PAGE 3
118 1 WriteCommandLCM(0x38,0);
119 1 Delay5Ms();
120 1
121 1 WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
122 1 WriteCommandLCM(0x08,1); //关闭显示
123 1 WriteCommandLCM(0x01,1); //显示清屏
124 1 WriteCommandLCM(0x06,1); // 显示光标移动设置
125 1 WriteCommandLCM(0x0F,1); // 显示开及光标设置
126 1 }
127
128 //按指定位置显示一个字符
129 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
130 {
131 1 Y &= 0x1;
132 1 X &= 0xF; //限制X不能大于15,Y不能大于1
133 1 if(Y)
134 1 X |= 0x40; //当要显示第二行时地址码+0x40;
135 1 X |= 0x80; //算出指令码
136 1 WriteCommandLCM(X, 1); //发命令字
137 1 WriteDataLCM(DData); //发数据
138 1 }
139
140 //按指定位置显示一串字符
141 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
142 {
143 1 unsigned char ListLength;
144 1
145 1 ListLength = 0;
146 1 Y &= 0x1;
147 1 X &= 0xF; //限制X不能大于15,Y不能大于1
148 1 while (DData[ListLength]>0x19) {//若到达字串尾则退出
149 2 if(X <= 0xF) {//X坐标应小于0xF
150 3 DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
151 3 ListLength++;
152 3 X++;
153 3 }
154 2 }
155 1 }
156
157 //5ms延时
158 void Delay5Ms(void)
159 {
160 1 unsigned int TempCyc = 5552;
161 1 while(TempCyc--)
162 1 ;
163 1 }
164
165 //400ms延时
166 void Delay400Ms(void)
167 {
168 1 unsigned char TempCycA = 5;
169 1 unsigned int TempCycB;
170 1 while(TempCycA--) {
171 2 TempCycB=7269;
172 2 while(TempCycB--)
173 2 ;
174 2 }
175 1 }
176
177 void Keyboard_out(void) interrupt 0
178 {
179 1 if((IntNum > 0) && (IntNum < 9)) {
C51 COMPILER V7.06 PS2 06/06/2004 19:47:47 PAGE 4
180 2 KeyV >>= 1; //因键盘数据是低>>高,结合上一句所以右移一位
181 2 if(Key_Data) {
182 3 KeyV |= 0x80; //当键盘数据线为1时为1到最高位
183 3 }
184 2 }
185 1 IntNum++;
186 1 while(!Key_CLK); //等待PS/2CLK拉高
187 1 if(IntNum > 10) {
188 2 IntNum = 0; //当中断10次后表示一帧数据收完,清变量准备下一次接收
189 2 BF = 1; //标识有字符输入完了
190 2 EA = 0; //关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -