📄 lcd12864s.lst
字号:
C51 COMPILER V7.07 LCD12864S 11/02/2010 19:56:41 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE LCD12864S
OBJECT MODULE PLACED IN lcd12864s.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE lcd12864s.c DEBUG OBJECTEXTEND
stmt level source
1 /*************************************************
2 名 称:LCD12864_ST7920串行测试程序
3 试验功能:测试基于ST7920控制芯片的LCD12864的显示
4 串行方式连接;晶振11.0592M
5 编 写:JiangX.net
6 *************************************************/
7
8 #include <reg52.h>
9 #include <ziku.h>
10 #include <intrins.h>
11 #define uchar unsigned char
12 #define uint unsigned int //宏定义
13
14
15
16 /*****LCD接口定义*****/
17 sbit CS = P2^4; //片选信号
18 sbit SID = P2^5; //串行数据
19 sbit SCLK = P2^6; //串行同步时钟
20 sbit PSB = P2^1; //串并口选择 1:并口模式; 0:串口模式;
21
22 /*****LCD功能初始化指令*****/
23 #define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H
24 #define AC_INIT 0x02 //将AC设置为00H。且游标移到原点位置,位置归位
25 #define CURSE_ADD 0x06 //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)
26 #define FUN_MODE 0x30 //工作模式:8位基本指令集
27 #define DISPLAY_ON 0x0c //显示开,显示游标,且游标位置反白
28 #define DISPLAY_OFF 0x08 //显示关
29 #define CURSE_DIR 0x14 //游标向右移动:AC=AC+1
30 #define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH
31 #define SET_DD_AC 0x80
32
33 /*****汉字地址表*****/
34 uchar code addr_tab[]={
35 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置
36 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置
37 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置
38 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置
39 };
40
41 /*****n(ms)延时子程序**** */
42 void delayms(uint t) //约延时n(ms)
43 {
44 1 uint i;
45 1 while(t--)
46 1 {
47 2 for(i=120;i>0;i--);
48 2 }
49 1 }
50
51
52
53
54
55
C51 COMPILER V7.07 LCD12864S 11/02/2010 19:56:41 PAGE 2
56
57
58
59 /*****串行发送一个字节*****/
60 void SendByte(uchar Dbyte)
61 {
62 1 uchar i;
63 1 for(i=0;i<8;i++)
64 1 {
65 2 SCLK = 0;
66 2 Dbyte=Dbyte<<1; //左移一位
67 2 SID = CY; //移出的位给SID
68 2 SCLK = 1;
69 2 SCLK = 0;
70 2 }
71 1 }
72
73 /*****串行接收一个字节*****/
74 uchar ReceiveByte(void)
75 {
76 1 uchar i,temp1,temp2;
77 1 temp1 = 0;
78 1 temp2 = 0;
79 1 for(i=0;i<8;i++)
80 1 {
81 2 temp1=temp1<<1;
82 2 SCLK = 0;
83 2 SCLK = 1;
84 2 SCLK = 0;
85 2 if(SID) temp1++;
86 2 }
87 1 for(i=0;i<8;i++)
88 1 {
89 2 temp2=temp2<<1;
90 2 SCLK = 0;
91 2 SCLK = 1;
92 2 SCLK = 0;
93 2 if(SID) temp2++;
94 2
95 2 }
96 1
97 1 return ((0xf0&temp1)+(0x0f&temp2));
98 1 }
99
100 /*****检测LCD忙状态*****/
101 void CheckBusy( void )
102 {
103 1 do SendByte(0xfc); //11111,RW(1),RS(0),0
104 1 while(0x80&ReceiveByte()); //BF(.7)=1 Busy
105 1 }
106
107 /*****写指令*****/
108 void Lcd_WriteCmd(uchar Cbyte )
109 {
110 1 CS = 1;
111 1 CheckBusy();
112 1 SendByte(0xf8); //11111,RW(0),RS(0),0
113 1 SendByte(0xf0&Cbyte); //高四位
114 1 SendByte(0xf0&Cbyte<<4); //低四位(先执行<<)
115 1 CS = 0;
116 1 }
117
C51 COMPILER V7.07 LCD12864S 11/02/2010 19:56:41 PAGE 3
118 /*****写数据*****/
119 void Lcd_WriteData(uchar Dbyte )
120 {
121 1 CS = 1;
122 1 CheckBusy();
123 1 SendByte(0xfa); //11111,RW(0),RS(1),0
124 1 SendByte(0xf0&Dbyte); //高四位
125 1 SendByte(0xf0&Dbyte<<4); //低四位(先执行<<)
126 1 CS = 0;
127 1 }
128
129 /*****初始化LCD*****/ //里面有清除显示的命令
130 void Lcd_Init(void)
131 {
132 1 PSB = 0;
133 1 delayms(50);
134 1 Lcd_WriteCmd(0x30); //选择基本指令集
135 1 delayms(1);
136 1 Lcd_WriteCmd(0x30); //选择8bit数据流
137 1 delayms(1);
138 1 Lcd_WriteCmd(0x0c); //开显示(无游标、不反白)
139 1 delayms(1);
140 1 Lcd_WriteCmd(0x01); //清除显示,并且设定地址指针为00H
141 1 delayms(20);
142 1 }
143
144 /*****显示汉字*****/
145 void hanzi_Disp(uchar x,uchar y,uchar code *s)//只能在同一行中显示,不能实现自动换行
146 {
147 1 Lcd_WriteCmd(addr_tab[8*x+y]); //写地址
148 1 while(*s>0)
149 1 {
150 2 Lcd_WriteData(*s); //写数据
151 2 s++;
152 2 }
153 1 }
154
155 /*****显示图片(显示Gdram内容)*****/
156
157 /*绘图显示的步骤
158 1 关闭绘图显示功能
159 2 先将垂直的坐标(Y)写入绘图RAM地址
160 3 再将水平的位元组坐标(X)写入绘图RAM地址
161 4 将D15-D8写入RAM中
162 5 将D7-D0写入到RAM中
163 6 打开绘图显示功能*/
164
165 //图片取模方式:横向取模,字节正序
166 void pic_Disp(uchar *pic) //显示Gdram内容(显示图片)
167 {
168 1 uchar x,y,i;
169 1 for(i=0;i<9;i=i+8)
170 1 for(y=0;y<32;y++)
171 1 {
172 2 for(x=0;x<8;x++)
173 2 {
174 3 Lcd_WriteCmd(0x36); //扩充指令,开绘图显示
175 3 Lcd_WriteCmd(0x80+y); //行地址
176 3 Lcd_WriteCmd(0x80+x+i); //列地址
177 3 Lcd_WriteData(*pic++); //写数据 D15-D8
178 3 Lcd_WriteData(*pic++); //写数据 D7-D0
179 3 Lcd_WriteCmd(0x30); //扩充指令,关绘图显示
C51 COMPILER V7.07 LCD12864S 11/02/2010 19:56:41 PAGE 4
180 3 }
181 2 }
182 1 }
183
184 /*****整屏显示竖条*****/
185 //当i=0时显示上面128×32,当i=8时显示下面128×32
186 //当i=0时显示上面128×32,当i=8时显示下面128×32
187 void LcdFill_Vertical()
188 {
189 1 uchar x,y,i;
190 1 for(i=0;i<9;i=i+8)
191 1 for(y=0;y<0x20;y++)
192 1 {
193 2 for(x=0;x<8;x++)
194 2 {
195 3 Lcd_WriteCmd(0x36); //扩充指令 绘图显示
196 3 Lcd_WriteCmd(y+0x80); //行地址
197 3 Lcd_WriteCmd(x+0x80+i); //列地址
198 3 Lcd_WriteData(0x55); //写数据 D15-D8
199 3 Lcd_WriteData(0x55); //写数据 D7-D0
200 3 Lcd_WriteCmd(0x30);
201 3 }
202 2 }
203 1 }
204
205 /*****整屏显示横条*****/
206 void LcdFill_Level()
207 {
208 1 uchar x,y,i;
209 1 uchar k;
210 1 for(i=0;i<9;i+=8)
211 1 for(y=0;y<0x20;y++)
212 1 {
213 2 if((y%2)==1) k=0xff;
214 2 else k=0;
215 2 for(x=0;x<8;x++)
216 2 {
217 3 Lcd_WriteCmd(0x36); //扩充指令 绘图显示
218 3 Lcd_WriteCmd(y+0x80); //行地址
219 3 Lcd_WriteCmd(x+0x80+i); //列地址
220 3 Lcd_WriteData(k);
221 3 Lcd_WriteData(k);
222 3 Lcd_WriteCmd(0x30);
223 3 }
224 2 }
225 1 }
226
227 /*****整屏充满亮点或暗点*****/
228 //当i=0时显示上面128×32,当i=8时显示下面128×32
229 //当i=0时显示上面128×32,当i=8时显示下面128×32
230 void Lcd_Fill(uchar test)
231 {
232 1 uchar x,y,i;
233 1 for(i=0;i<9;i=i+8)
234 1 for(y=0;y<0x20;y++)
235 1 {
236 2 for(x=0;x<8;x++)
237 2 {
238 3 Lcd_WriteCmd(0x36); //扩充指令 绘图显示
239 3 Lcd_WriteCmd(y+0x80); //行地址
240 3 Lcd_WriteCmd(x+0x80+i); //列地址
241 3 Lcd_WriteData(test); //写数据 D15-D8
C51 COMPILER V7.07 LCD12864S 11/02/2010 19:56:41 PAGE 5
242 3 Lcd_WriteData(test); //写数据 D7-D0
243 3 Lcd_WriteCmd(0x30);
244 3 }
245 2 }
246 1 }
247
248 /*****主函数*****/
249 void main(void)
250 {
251 1 Lcd_Init();
252 1 while(1)
253 1 {
254 2 Lcd_Init();
255 2 hanzi_Disp(0,0,"光伏项目组:");
256 2 hanzi_Disp(1,1,"LCD测试程序");
257 2 hanzi_Disp(2,0,"越做越好");
258 2 hanzi_Disp(3,3,"");
259 2 delayms(2000);
260 2
261 2 Lcd_Init();
262 2 //Lcd_Fill(0xff);
263 2 hanzi_Disp(1,2,"坏点检测");
264 2 delayms(500);
265 2
266 2 Lcd_Init();
267 2 Lcd_Fill(0xff);
268 2 delayms(1500);
269 2
270 2 Lcd_Init();
271 2 LcdFill_Vertical();
272 2 delayms(750);
273 2
274 2 Lcd_Init();
275 2 LcdFill_Level();
276 2 delayms(750);
277 2
278 2 Lcd_Init();
279 2 hanzi_Disp(1,2,"唐诗演示");
280 2 delayms(500);
281 2
282 2 Lcd_Init();
283 2 hanzi_Disp(0,0,tangshi);
284 2 delayms(1500);
285 2
286 2 Lcd_Init();
287 2 hanzi_Disp(1,2,"显示图片");
288 2 delayms(500);
289 2
290 2
291 2
292 2
293 2 /* Lcd_Init();
294 2 pic_Disp(LCDsheji);
295 2 delayms(1000);
296 2
297 2 Lcd_Init();
298 2 pic_Disp(rmb);
299 2 delayms(1000);
300 2
301 2 Lcd_Init();
302 2 pic_Disp(qiche);
303 2 delayms(1000);
C51 COMPILER V7.07 LCD12864S 11/02/2010 19:56:41 PAGE 6
304 2
305 2 Lcd_Init();
306 2 pic_Disp(gongji);
307 2 delayms(1000);
308 2
309 2 Lcd_Fill(0x00); //清显示RAM
310 2 delayms(500); */
311 2
312 2
313 2
314 2 }
315 1 }
316
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 703 ----
CONSTANT SIZE = 4255 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 8
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -