📄 12864与ps2.lst
字号:
C51 COMPILER V8.02 12864与PS2 08/12/2008 12:14:11 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 12864与PS2
OBJECT MODULE PLACED IN 12864与PS2.OBJ
COMPILER INVOKED BY: D:\安装程序\UV3\C51\BIN\C51.EXE 12864与PS2.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <at89x51.h>
2 #include "scancodes.h"
3 #include<intrins.h>
4
5 #define uchar unsigned char
6 #define uint unsigned int
7 #define Key_Data P3_4 //定义Keyboard引脚
8 #define Key_CLK P3_3
9 #define Busy 0x80 //用于检测LCM状态字中的Busy标识
10 #define Disp_On 0x3f // 显示开指令 //
11 #define Disp_Off 0x3e // 显示关指令 //
12 #define Col_Add 0x40 // 定位到第0列指令 //
13 #define Page_Add 0xb8 // 定位到第0页指令 //
14 #define Start_Line 0xc0 // 定位从DDROM中的第0行开始往屏幕上显示 //
15
16 void Delay5Ms(void);
17 void Delay400Ms(void);
18 void Decode(unsigned char ScanCode);
19 unsigned char ReadDataLCM(void);
20 unsigned char ReadStatusLCM(void);
21 unsigned char code Cls[] = {" "};
22 static unsigned char IntNum = 0; //中断次数计数
23 static unsigned char KeyV; //键值
24 static unsigned char DisNum = 0; //显示用指针
25 static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识
26 static unsigned char BF = 0; //标识是否有字符被收到
27 typedef bit BOOL ;
28 uchar aa=0x80;
29 uchar TempCyc;
30
31
32 /***************************-= 控 制 宏 =-**************************************************/
33 /** 根据你的控制线接法来修改 **/
34 sbit CS1 = P2^4; // 左屏使能 //
35 sbit CS2 = P2^6; // 右屏使能 //
36 sbit E = P2^7; // 使能端 //
37 sbit RS = P2^3; // 数据或指令寄存器选择端,又名DI //
38 sbit RW = P2^5; // 读写控制端 //
39 sbit RST = P2^1; // 复位端 //
40 sbit sdata = P0; // 数据口 //
41
42 unsigned char code a[]=
43 {
44 /*------------------------------------------------------------------------------
45 源文件 / 文字 : 你
46 宽×高(像素): 16×16
47 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节
48 数据转换日期 : 2008-8-12 11:21:42
49 ------------------------------------------------------------------------------*/
50 0x80,0x40,0xF0,0x2C,0x43,0x20,0x98,0x0F,0x0A,0xE8,0x08,0x88,0x28,0x1C,0x08,0x00,
51 0x00,0x00,0x7F,0x00,0x10,0x0C,0x03,0x21,0x40,0x3F,0x00,0x00,0x03,0x1C,0x08,0x00
52 };
53
54 /*==========================
55 函数名:延时子函数 ==
C51 COMPILER V8.02 12864与PS2 08/12/2008 12:14:11 PAGE 2
56 输 入:time延时长度 ==
57 输 出:无 ==
58 ==========================*/
59 void Delay(unsigned int time)
60 {
61 1 unsigned int i,j;
62 1 for(i=0;i<time;i++)
63 1 for(j=0;j<10;j++)
64 1 ;
65 1 }
66
67 /*===============================
68 // 函数名:写命令到LCD //
69 // 输 入:cmdcode待写入命令 //
70 // 输 出:无 //
71 ===============================*/
72 void write_command(unsigned char cmdcode)
73 {
74 1 RS = 0;
75 1 RW = 0;
76 1 P0 = cmdcode;
77 1 Delay(1);
78 1 E = 1;
79 1 Delay(1);
80 1 E = 0;
81 1 }
82
83 /*================================
84 // 函数名:写数据到LCD //
85 // 输 入:Dispdata待写入数据 //
86 // 输 出:无 //
87 ================================*/
88 void write_dat(unsigned char Dispdata)
89 {
90 1 RS = 1;
91 1 RW = 0;
92 1 P0 = Dispdata;
93 1 Delay(1);
94 1 E = 1;
95 1 Delay(1);
96 1 E = 0;
97 1 }
98
99 /*===================================================
100 // 函数名:任意位置写入一字节 //
101 // 输 入:Page行定位,Col列定位,Data待写入字节 //
102 // 输 出:无 //
103 ===================================================*/
104 void write_data(unsigned char Page,unsigned char Col,unsigned char Data)//在屏幕的任意位置写待显示的数据
105 {
106 1 if ((Col&0x40)==0)
107 1 {
108 2 CS2=1;CS1=0;
109 2 write_command(Page_Add+Page);
110 2 write_command(Col_Add+Col);
111 2 write_dat(Data);
112 2 }
113 1 else
114 1 {
115 2 Col-=64;
116 2 CS2=0;CS1=1;
117 2 write_command(Page_Add+Page);
C51 COMPILER V8.02 12864与PS2 08/12/2008 12:14:11 PAGE 3
118 2 write_command(Col_Add+Col);
119 2 write_dat(Data);
120 2 }
121 1 }
122
123 /*======================
124 // 函数名:清显示屏 //
125 // 输 入:无 //
126 // 输 出:无 //
127 ======================*/
128 void Clr_Scr(void)
129 {
130 1 unsigned char j,k;
131 1 CS2=1;CS1=0; // 清左半屏 //
132 1 {
133 2
134 2 for(k=0;k<8;k++)
135 2 {
136 3 write_command(Page_Add+k);
137 3 write_command(Col_Add);
138 3 for(j=0;j<64;j++)
139 3 write_dat(0x00);
140 3 }
141 2 }
142 1 CS2=0;CS1=1; // 清右半屏 //
143 1 {
144 2
145 2 for(k=0;k<8;k++)
146 2 {
147 3 write_command(Page_Add+k);
148 3 write_command(Col_Add);
149 3 for(j=0;j<64;j++)
150 3 write_dat(0x00);
151 3 }
152 2 }
153 1 }
154
155
156
157 ////////////////////////////////////////////////////////////
158 // 函数名:指定位置显示16*16字母 //
159 // 输 入:pag行定位,col列定位,*zmk待显示数字数据指针 //
160 // 输 出:无 //
161 ////////////////////////////////////////////////////////////
162 void Disp_Chr(unsigned char pag,unsigned char col, unsigned char code *zmk)
163 {
164 1 unsigned char j=0,i=0;
165 1 for(i=0;i<16;i++)
166 1 {
167 2 for(j=0;j<2;j++)
168 2 {
169 3 write_data(pag+j,col+i,zmk[16*j+i]);
170 3 }
171 2 }
172 1 }
173
174 ////////////////////////////
175 // 函数名:初始化液晶屏 //
176 // 输 入:无 //
177 // 输 出:无 //
178 ////////////////////////////
179 void Init_lcd(void)
C51 COMPILER V8.02 12864与PS2 08/12/2008 12:14:11 PAGE 4
180 {
181 1 RST=0;
182 1 Delay(10);
183 1 RST=1;
184 1 Delay(10);
185 1
186 1 CS2=1;
187 1 CS1=1;
188 1
189 1 Delay(100);
190 1 write_command(Disp_Off);
191 1 write_command(Page_Add+0);
192 1 write_command(Start_Line+0);
193 1 write_command(Col_Add+0);
194 1 write_command(Disp_On);
195 1 }
196
197 /********************************-= 用户操作在下面进行 =-**********************************************/
198 ////////////////////////////
199 // 函数名:主函数(例子)//
200 // 输 入:无 //
201 // 输 出:无 //
202 ////////////////////////////
203 void main(void)
204 {
205 1 Init_lcd(); // 初始化液晶屏
206 1 for (TempCyc=0; TempCyc<3; TempCyc++)
207 1 Delay400Ms(); //延时
208 1 Disp_Chr(0,0,a) ;
209 1 for (TempCyc=0; TempCyc<3; TempCyc++)
210 1 Delay400Ms(); //延时
211 1 Clr_Scr(); // 清屏
212 1 IT1 = 0; //设外部中断1为低电平触发
213 1 EA = 1;
214 1 EX1 = 1; //开中断
215 1
216 1 do
217 1 {
218 2 if (BF)
219 2 Decode(KeyV);
220 2 else
221 2 EA = 1; //开中断
222 2 }
223 1 while(1);
224 1
225 1 }
226
227 /**********************************************************************************************
228 函数名称:延时函数
229 函数功能:延时
230 说明:
231 **********************************************************************************************/
232
233 //5ms延时
234 void Delay5Ms(void)
235 {
236 1 unsigned int TempCyc = 5552;
237 1 while(TempCyc--);
238 1 }
239
240 //400ms延时
241 void Delay400Ms(void)
C51 COMPILER V8.02 12864与PS2 08/12/2008 12:14:11 PAGE 5
242 {
243 1 unsigned char TempCycA = 5;
244 1 unsigned int TempCycB;
245 1 while(TempCycA--)
246 1 {
247 2 TempCycB=7269;
248 2 while(TempCycB--);
249 2 };
250 1 }
251 /**********************************************************************************************
252 函数名称:中断函数
253 函数功能:每十一次(IntNum)中断一次,读取键盘值
254 说明:
255 **********************************************************************************************/
256 void Keyboard_out(void) interrupt 2
257 {
258 1 if ((IntNum > 0) && (IntNum < 9))
259 1 {
260 2 KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
261 2 if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
262 2 }
263 1 IntNum++;
264 1 while (!Key_CLK); //等待PS/2CLK拉高
265 1
266 1 if (IntNum > 10)
267 1 {
268 2 IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
269 2 BF = 1; //标识有字符输入完了
270 2 EA = 0; //关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -