📄 lcd_elbe.lst
字号:
C51 COMPILER V7.50 LCD_ELBE 08/13/2007 14:29:46 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE LCD_ELBE
OBJECT MODULE PLACED IN lcd_Elbe.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE lcd_Elbe.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /***************************************************************\
2 |* 12864LCD显示程序 proteus6.9 仿真AMPIRE128*64 *|
3 |* 制作人:熊涛 *|
4 |* 时间:2007年4月12日 *|
5 |* 接口定义:P1接数据 DB7~DB0 *|
6 |* P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 接控制线 *|
7 |* 具体见定义 *|
8 \***************************************************************/
9
10
11
12 /*Keyboard接线
13 PS/2--------51
14 1 DATA------P2.0
15 3 GND
16 4 VCC
17 5 CLK-------P3.3 接在51的外部中断,触发方式为低电平
18 [注:AT89x51使用12M或11.0592M晶振,实测使用11.0592M]*/
19
20 #include <reg52.h>
21 #include <string.h>
22 #include <Asc8_16.h>
23 #include <start.h>
24 #include <scancodes.h>
25
26
27 typedef unsigned char uchar;
28 typedef unsigned int uint;
29
30
31 sbit DI =P3^7; // 数据\指令 选择
32 sbit RW =P3^6; // 读\写 选择
33 sbit E =P3^5; // 读\写使能
34 sbit CS2 =P3^4; // 片选1
35 sbit CS1 =P3^3; // 片选2
36 sbit RST =P3^2; // 复位
37
38 sbit Key_Data = P2^0;
39 sbit Key_CLK = P2^1;
40 static unsigned char IntNum = 0; //中断次数计数
41 static unsigned char KeyV; //键值
42 static unsigned char DisNum = 0; //显示用指针
43 static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识
44 static unsigned char BF = 0; //标识是否有字符被收到
45
46
47 /**********************************************\
48 |* 写命令子程序 *|
49 |* 入口参数:cmd 控制命令数据 *|
50 |* 出口参数:null *|
51 |* 调用函数: null *|
52 \**********************************************/
53 void write_cmd(uchar cmd) //写命令子程序
54 { uchar t=30;
55 1 RW=0;
C51 COMPILER V7.50 LCD_ELBE 08/13/2007 14:29:46 PAGE 2
56 1 DI=0; //DI=0 写命令
57 1 E=1;
58 1 P1=cmd;
59 1 while(t--);//如果不延时 将会出现不可预料的错误 显示的汉字会出现错误的现象 而且随机出现
60 1 E=0; //RW="L",E="H->L" DB7~DB0的数据被写到IR或DR
61 1 }
62
63 /**********************************************\
64 |* 写数据子程序 *|
65 |* 入口参数:dat 显示字符的数据 *|
66 |* oppo 标志位 1:显示阳文 *|
67 |* 0:显示阴文 *|
68 |* 出口参数:null *|
69 |* 调用函数: null *|
70 \**********************************************/
71 void write_dat(uchar dat,bit oppo) //写数据子程序
72 { uchar t=30;
73 1 RW=0;
74 1 DI=1; //DI=1 写数据
75 1 E=1;
76 1 if(oppo==0) P1=~dat; //按位取反得阴文
77 1 if(oppo==1) P1=dat;
78 1 oppo=1;
79 1 while(t--);
80 1 E=0; //RW="L",E="H->L" DB7~DB0的数据被写到IR或DR
81 1 }
82
83 /**********************************************\
84 |* 设置显示起始行 X地址和Y地址 *|
85 |* 入口参数:st_line 显示起始行 0~63 *|
86 |* x_add 页地址 8行为一页 0~7 *|
87 |* y_add Y地址 0~128 *|
88 |* 出口参数:null *|
89 |* 调用函数: write_cmd() *|
90 \**********************************************/
91
92 void set_dis(uchar st_line,uchar x_add,uchar y_add) //设置显示起始行 X地址和Y地址
93 {
94 1 write_cmd(st_line+0xc0); //+0xc0是参照设置起始行的格式
95 1 write_cmd(x_add+0xb8); //+0xb8是参照设置页地址的格式
96 1 if(y_add<64) { CS1=0;CS2=1;write_cmd(y_add+0x40);} //Y_add地址实际上只有0~63 采用CS1和CS2选左右半屏
97 1 else { CS1=1;CS2=0;write_cmd(y_add);}
98 1 }
99
100
101
102
103 /***********************************************\
104 |* 写数字标点字母子程序1 可以在任意位置写入 *|
105 |* 入口参数:st_line 显示起始行 0~63 *|
106 |* x_add 页地址 8行为一页 0~7 *|
107 |* y_add Y地址 0~128 *|
108 |* ASC 字符的ACSII码 *|
109 |* 出口参数:null *|
110 |* 调用函数: write_cmd() set_dis() *|
111 |* strcmp() write_dat() *|
112 \***********************************************/
113 void write_num_all(uchar st_line,uchar x_add,uchar y_add,uchar ASC)
114 { uchar j;
115 1 bit oppo=1;
116 1 if(y_add<64) { CS1=0;CS2=1;write_cmd(y_add+0x40);}
117 1 else { CS1=1;CS2=0;write_cmd(y_add);}
C51 COMPILER V7.50 LCD_ELBE 08/13/2007 14:29:46 PAGE 3
118 1 set_dis(st_line, x_add,y_add);
119 1 for(j=0;j<8;j++) write_dat(nAsciiDot[(ASC-32)*16+j],oppo); //逐字节写入
120 1 set_dis(st_line, x_add+1,y_add); //下一页 写字的下半部分
121 1 for(j=8;j<16;j++) write_dat(nAsciiDot[(ASC-32)*16+j],oppo); //此处用break是为了能跳出for循环
122 1 }
123
124 /***********************************************\
125 |* 写数字标点字母子程序2 只能在指定位置写入 *|
126 |* 入口参数:n 指定地址 0~63 全屏32字(16*16) *|
127 |* ASC 字符的ACSII码 *|
128 |* 出口参数:null *|
129 |* 调用函数: write_num_all() *|
130 |* *|
131 \***********************************************/
132 void write_num(uchar n,uchar ASC) //写入数字或字母或标点
133 { uchar st_line=0,x_add=n%64/16*2,y_add=n%64%16*8;
134 1 write_num_all(st_line,x_add,y_add,ASC);
135 1 }
136
137
138 /***********************************************\
139 |* 画图子程序 全屏画图 *|
140 |* 入口参数:图片数据代码数组 1024的数组 *|
141 |* *|
142 |* 出口参数:null *|
143 |* 调用函数: set_dis() *|
144 |* write_dat( ) *|
145 \***********************************************/
146 void draw_picture(uchar picture[1024])
147 { int i;
148 1 uchar j=0;
149 1 for(j=0;j<8;j++)
150 1 { set_dis(0,j,0);
151 2 for(i=j*128;i<j*128+64;i++) write_dat(picture[i],1);
152 2 set_dis(0,j+1,64);
153 2 for(i=j*128+64;i<j*128+128;i++) write_dat(picture[i],1); }
154 1 }
155
156
157 /**********************************************\
158 |* 清屏子程序 *|
159 |* 入口参数:null *|
160 |* 出口参数:null *|
161 |* 调用函数: write_num() *|
162 \**********************************************/
163 void cls_display(void)
164 { uchar i;
165 1 for(i=0;i<64;i++) write_num(i,' ');
166 1 DisNum = 0;}
167
168
169 /**********************************************\
170 |* 初始化子程序 *|
171 |* 入口参数:null *|
172 |* 出口参数:null *|
173 |* 调用函数: null *|
174 \**********************************************/
175 void initial(void) //初始化子程序
176 { write_cmd(0x3e); //关显示
177 1 }
178
179
C51 COMPILER V7.50 LCD_ELBE 08/13/2007 14:29:46 PAGE 4
180
181 void Keyboard_out(void)
182 { if ((IntNum > 0) && (IntNum < 9))
183 1 { KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
184 2 if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
185 2 }
186 1 IntNum++;
187 1 while (!Key_CLK); //等待PS/2CLK拉高
188 1 if (IntNum > 10)
189 1 { IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
190 2 BF = 1; //标识有字符输入完了
191 2 EA = 0; //关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数要
-声明为再入函数)
192 2 } }
193
194 void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码
-+shift的断码+G的断码
195 { unsigned char TempCyc;
196 1 if (!Key_UP) //当键盘松开时
197 1 { switch (ScanCode)
198 2 { case 0xF0 : Key_UP = 1; break;// 当收到0xF0,Key_UP置1表示断码开始
199 3 case 0x12 : Shift = 1;break;// 左 SHIFT
200 3 case 0x59 : Shift = 1;break;// 右 SHIFT
201 3 case 0x37 : cls_display();break; //power键清屏
202 3 case 0x76 : draw_picture(nBitmapDot);break; //ESC键显示图片
203 3 case 0x66 : write_num(--DisNum,' ');break; //backspace键删除前一个字
204 3 case 0x5a : DisNum=(DisNum&0xf0)+0x10;break;
205 3 default:if (DisNum == 64) DisNum = 0;
206 3 if(!Shift) //如果SHIFT没按下
207 3 { for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -