📄 lcd12864.lst
字号:
C51 COMPILER V8.08 LCD12864 11/20/2008 22:02:48 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE LCD12864
OBJECT MODULE PLACED IN LCD12864.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE LCD12864.C BROWSE DEBUG OBJECTEXTEND
line level source
1 #include"reg52.h"
2 #include"IOCfg.c"
3 #include"Config.h"
4 #include"LCD12864.h"
5 #include"delay.h"
6
7
8 /*********************************************************************************
9
10 管脚号 管脚名称 电平 管脚功能描述
11
12 1 VSS 0V 电源地
13 2 VCC +5V 电源正
14 3 V0 - 对比度(亮度)调整
15 4 RS(CS) H/L RS="H",表示DB7--DB0为显示数据
16 4 RS(CS) H/L RS="L",表示DB7--DB0为显示指令数据
17 5 R/W(SID) H/L R/W="H",E="H",数据被读到DB7--DB0
18 5 R/W(SID) H/L R/W="L",E="H→L", DB7--DB0的数据被写到IR或DR
19 6 E(SCLK) H/L 使能信号
20 7 DB0 H/L 三态数据线
21 8 DB1 H/L 三态数据线
22 9 DB2 H/L 三态数据线
23 10 DB3 H/L 三态数据线
24 11 DB4 H/L 三态数据线
25 12 DB5 H/L 三态数据线
26 13 DB6 H/L 三态数据线
27 14 DB7 H/L 三态数据线
28 15 PSB H/L H:8位或4位并口方式,L:串口方式(见注释1)
29 16 NC - 空脚
30 17 /RESET H/L 复位端,低电平有效(见注释2)
31 18 VOUT - LCD驱动电压输出端
32 19 A VDD 背光源正端,要加限流电阻(+5V)(见注释3)
33 20 K VSS 背光源负端(见注释3)
34 ------------------------------------------------------------------------------
35 点阵和字符重合显示的时候不会覆盖,要先清除
36 字符和点阵重合显示的时候,要分别清除掉
37
38 1.上电时先复位端口
39
40 2.设置屏内部
41
42 3.显示点阵时设置点阵模式,显示字符时设置字符模式,图像有重合时要清掉先前送的不同类显示数据
43
44 4.最少要零点几秒就刷新整屏数据,以免有干扰出现数据乱码显示
45
46 5.屏幕的刷新频率不能太高,10HZ时屏幕没出现干扰线或噪点
47
48 6.12864屏在读数据的时候要空读一次才能正确读出数据
49
50 7.想用8*16的点阵显示,程序还不太复杂,单独操作每个点就以后再弄,先弄到能正常显示参数和菜单
51
52
53
54 ************************************************************************************/
55
C51 COMPILER V8.08 LCD12864 11/20/2008 22:02:48 PAGE 2
56 //----------------------------------------------------------------------
57 //定义MCU与LCD的接口
58
59
60
61 //----------------------------------------------------------------------
62
63
64
65
66
67 /******************************************************************
68 // 函数名:lcd_delayms
69 // 功 能:精确延时1mS
70 // 参 数:输入延时毫秒数(0-65535)
71 // 返回值:无
72 晶振频率:22.1184MHz ,循环次数是229 ;
73 ******************************************************************/
74 void lcd_delayms(unsigned int i) //使用22.1184M时的延时循环次数
75 {
76 1 unsigned int j;
77 1
78 1 for(;i!=0;i--)
79 1 {
80 2 for(j = 0; j < 229; j++);
81 2 }
82 1 }
83
84 /************************************************************************************
85
86 查忙函数
87 //RS=0;RW=1;wait=0闲;wait!=0忙
88 ************************************************************************************/
89 void busy(void)
90 {
91 1 uchar wait;
92 1 RS = 0;
93 1 RW = 1;
94 1 E = 1;
95 1 for(;;)
96 1 {
97 2 wait = DB;
98 2 wait &= 0x80;
99 2 if(wait == 0)break;
100 2 }
101 1 E = 0;
102 1 DB = 0XFF;
103 1 }
104
105 /************************************************************************************
106
107 写指令函数
108 //RS=0;RW=0;E下降沿
109 ************************************************************************************/
110 void w_code(uchar c)
111 {
112 1 busy();
113 1 RS=0;
114 1 RW=0;
115 1 DB=c;
116 1 E=1;
117 1 E=0;
C51 COMPILER V8.08 LCD12864 11/20/2008 22:02:48 PAGE 3
118 1 DB=0xff;
119 1 }
120 /************************************************************************************
121
122 写数据函数
123 //RS=1;RW=0;E下降沿
124
125 ************************************************************************************/
126 void w_data(uchar d)
127 {
128 1 busy();
129 1 RS = 1;
130 1 RW = 0;
131 1 DB = d;
132 1 E = 1;
133 1 E = 0;
134 1 DB = 0xff;
135 1 }
136
137 /************************************************************************************
138 指定地址写数据函数
139 x:
140 y:
141 i: 数据
142 ************************************************************************************/
143 void w_data_addr(uchar x,uchar y,uchar i)
144 {
145 1 w_code(y);
146 1 w_code(x);
147 1 w_data(i);
148 1 }
149
150 /************************************************************************************
151
152 读数据函数
153 12864屏在读数据的时候要空读一次才能正确读出数据
154
155 ************************************************************************************/
156 uchar r_data(void)//RS=1;RW=1;E下降沿
157 {
158 1 uchar rd_lcd;
159 1 busy();
160 1 RS=1;
161 1 RW=1;
162 1 E=1;
163 1 E=0;
164 1
165 1 busy();
166 1 RS=1;
167 1 RW=1;
168 1 E=1;
169 1 rd_lcd=DB;
170 1 E=0;
171 1 return rd_lcd;
172 1 }
173
174 /************************************************************************************
175
176 读指定地址的数据函数
177 x: x轴地址
178 y: y轴地址
179 ************************************************************************************/
C51 COMPILER V8.08 LCD12864 11/20/2008 22:02:48 PAGE 4
180 uchar r_data_addr(uchar x,uchar y)
181 {
182 1 uchar i;
183 1 w_code(y);
184 1 w_code(x);
185 1 i = r_data();
186 1 return i;
187 1 }
188
189
190 /************************************************************************************
191
192 初始化液晶屏
193
194 上电复位液晶屏
195 ************************************************************************************/
196 void lcd_rst(void)
197 {
198 1 /*********上电复位,大于40毫秒***********************/
199 1 LCD_RST = 0;
200 1 lcd_delayms(50);
201 1 LCD_RST = 1;
202 1 w_code(0x30);// 功能设置---8BIT控制界面,绘图显示ON
203 1 lcd_delayms(1);
204 1 w_code(0x01);// 清屏
205 1 lcd_delayms(1);
206 1 w_code(0x0c);// 功能设置---8BIT控制界面,扩充指令集
207 1 lcd_delayms(15);
208 1 w_code(0x32);//32
209 1 w_code(0x36);//36
210 1 }
211
212 /************************************************************************************
213
214 ---------------------------写8*16阵数据
215 ************************************************************************************/
216 void write_lcd_0816(uchar x1,uchar y1,uchar * zz,bit fanbai)
217 {
218 1 uchar a,y,x,z,i = 0;
219 1 if((x1 % 2) == 0)
220 1 {
221 2 x1 = x1 / 2;
222 2 for(a = 0;a < 16;a++)
223 2 {
224 3 y = y1;
225 3 x = x1;
226 3 /**/
227 3 if(y < 16)
228 3 {
229 4 x = x + 0x80;
230 4 y = y + 0x80;
231 4 }
232 3 if((y >= 16) && (y < 32))
233 3 {
234 4 x = x + 0x90;
235 4 y = y + 0x80;
236 4 }
237 3 if((y >= 32) && (y < 48))
238 3 {
239 4 x = x + 0x88;
240 4 y = (y - 32) + 0x80;
241 4 }
C51 COMPILER V8.08 LCD12864 11/20/2008 22:02:48 PAGE 5
242 3 if((y >= 48) && (y < 64))
243 3 {
244 4 x = x + 0x98;
245 4 y = (y - 32) + 0x80;
246 4 }
247 3
248 3 w_code(y);
249 3 y1++;
250 3 w_code(x);
251 3 if(fanbai == 0)
252 3 {
253 4 w_data(zz[i]);
254 4 }
255 3 else
256 3 {
257 4 w_data(~zz[i]);
258 4 }
259 3 i++;
260 3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -