📄 lcd.lst
字号:
C51 COMPILER V7.06 LCD 11/13/2006 15:57:58 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE LCD
OBJECT MODULE PLACED IN LCD.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE LCD.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*--------------------------------------------------------------------------------------------------------
-----
2 液晶模块OCM4X8C DB0-DB7连接至实验板DP0-DP7(4/8位并行接口方式)
3 E(sclk)连接至实验板DL7;
4 RS连接到DL6;
5 R/W(SID)固定接地;
6 外加一条连线:DK6,DK7接到VCC(+5V);
7 本程序功能:实现自动换行,汉字不能正常显示出自动补空,及无乱码显示(单字节于双字节字符混合)
8 实现方式:检测汉字前的字母(单字节)个数,若为奇数,字母后一位补以空字符,以后的字符全部往后退一个字符位
9 测试字符串:3嵌G入1式C21工4作8式03届
10 变量说明:
11 LCD_cn 字符写入地址或液晶要显示的数据
12 line 对应于液晶的显示行数,从的0行开始
13 3G1C embedded studio design
14 ----------------------------------------------------------------------------------------------------------
---*/
15 #include <reg52.h>
16 #include <absacc.h> //片外地址定义
17
18 #define uchar unsigned char
19
20 #define led_data XBYTE[0xe000] /*端口地址,对应实验板的DP0-DP7,数据*/
21 #define led_sel XBYTE[0xc000] /*端口地址,对应实验板的DL*/
22
23 void changeAddr(uchar lin); //地址转换子程序
24 void insert(uchar p); //插入空字符子程序
25 void changeArr(void); //数组调整子程序
26 void show(void); //液晶显示子程序
27 void wcom(void); //液晶写指令子程序
28 void wdat(void); //液晶写数据子程序
29 void delayms(uchar ms); //ms级延时子程序
30 void init(void); //初始化子程序
31
32 uchar LCD_cn;
33 uchar buffer[100]={"3嵌G入1式C21工4作8式03届"};
34 /*---------------------------------------------------------------------------------------------
35 主函数
36 ---------------------------------------------------------------------------------------------*/
37 main(void)
38 {
39 1 init(); //液晶模块初始化
40 1
41 1 led_data=0;
42 1 led_sel=0xff;
43 1
44 1 changeArr(); //调用字符数组排列子程序
45 1 show(); //调用液晶显示子程序
46 1
47 1 while(1)
48 1 {
49 2
50 2 }
51 1
52 1 }
53 /*-----------------------------------------------------------------------------------------------
C51 COMPILER V7.06 LCD 11/13/2006 15:57:58 PAGE 2
54 液晶初始化子程序
55 -----------------------------------------------------------------------------------------------*/
56 void init(void)
57 {
58 1 LCD_cn=0x30; //功能设定
59 1 wcom();
60 1 //delayms(2);
61 1
62 1 LCD_cn=0x01; //清除显示
63 1 wcom();
64 1 //delayms(2);
65 1
66 1 LCD_cn=0x06; //光标右移
67 1 wcom();
68 1 //delayms(2);
69 1
70 1 LCD_cn=0x0c; //开显示器
71 1 wcom();
72 1 //delayms(2);
73 1
74 1 LCD_cn=0x01; //清除显示
75 1 wcom();
76 1 //delayms(2);
77 1
78 1 }
79 /*----------------------------------------------------------------------------------------------
80 延时子程序
81 确保上一指令/数据已经接受、处理完。
82 ----------------------------------------------------------------------------------------------*/
83 void delayms(uchar ms)
84 {
85 1 uchar i;
86 1 while(ms--)
87 1 {
88 2 for(i=0; i<125; i++);
89 2 }
90 1 }
91
92 /*----------------------------------------------------------------------------------------------
93 液晶写指令子程序
94 ----------------------------------------------------------------------------------------------*/
95 void wcom(void) //写指令
96 {
97 1 led_sel=0xbf; //RW=0,RS=0,E=1 指令写
98 1 //delayms(2);
99 1 led_data=LCD_cn;
100 1 //delayms(2);
101 1 led_sel=0x3f; //RW=0,RS=0,E=0 恢复
102 1 delayms(2);
103 1 }
104 /*-----------------------------------------------------------------------------------------------
105 液晶写数据子程序
106 -----------------------------------------------------------------------------------------------*/
107 void wdat(void) //写数据
108 {
109 1 led_sel=0xff; //RW=0,RS=1,E=1 写
110 1 //delayms(2);
111 1 led_data=LCD_cn;
112 1 //delayms(2);
113 1 led_sel=0x7f; //写脉冲Rs=1,wr=0;e=0 恢复
114 1 //led_sel=0x3f; //RW=0,RS=0,E=0 恢复 这句代替上句的话,RS=0,无法显示数据
115 1 delayms(2);
C51 COMPILER V7.06 LCD 11/13/2006 15:57:58 PAGE 3
116 1 }
117 /*--------------------------------------------------------------------
118 地址转换子程序
119 第一行: 80H ———87H ,第二行: 90H ———97H 第三行:88H ———8FH 第四行:9
120 --------------------------------------------------------------------*/
121 void changeAddr(uchar lin)
122 {
123 1 switch(lin)
124 1 {
125 2 case 0:
126 2 LCD_cn=0x80; //LINE 1
127 2 break;
128 2 case 1:
129 2 LCD_cn=0x90; //LINE 2
130 2 break;
131 2 case 2:
132 2 LCD_cn=0x88; //LINE 3
133 2 break;
134 2 case 3:
135 2 LCD_cn=0x98; //LINE 4
136 2 break;
137 2 }
138 1 }
139 /*------------------------------------------------------------------------------------------
140 插入字符子程序
141 相应位插入空字符,同时该位以后的所有字符逐位往后退一位
142 ------------------------------------------------------------------------------------------*/
143 void insert(uchar p)
144 {
145 1 uchar p1;
146 1 p1=p;
147 1 while(buffer[p]!='\0') //将数组指针移到数组末尾第一个\0处
148 1 {
149 2 p++;
150 2 }
151 1 for(;p>p1;p--) //从第p1+1位开始,逐位往后退一位
152 1 buffer[p]=buffer[p-1];
153 1 buffer[p1]=' '; //p1位补空字符
154 1 }
155 /*----------------------------------------------------------------------------------------
156 数组重排列子程序
157 ----------------------------------------------------------------------------------------*/
158 void changeArr(void)
159 {
160 1 uchar count; //用于计算字母(单字符)个数
161 1 uchar j=0;
162 1 while(buffer[j]!='\0')
163 1 {
164 2 if(buffer[j]<127) //判断是否位字母
165 2 {
166 3 count++;
167 3 j++;
168 3 }
169 2 if(buffer[j]>127) //判断是否位汉字
170 2 {
171 3 if(count%2!=0) //若汉字前字母个数为奇数则调用子函数insert(),作相应的处理
172 3 {
173 4 insert(j);
174 4 j=j+2; //跳到汉字后的字符(一个汉字占用2个字节位置)
175 4 count=0;
176 4 }
177 3 else
C51 COMPILER V7.06 LCD 11/13/2006 15:57:58 PAGE 4
178 3 {
179 4 count=0;
180 4 j++;
181 4 }
182 3 }
183 2 }
184 1 }
185 /*---------------------------------------------------------------------------------------------------
186 液晶显示子程序
187 ---------------------------------------------------------------------------------------------------*/
188 void show(void)
189 {
190 1 uchar j=0;
191 1 uchar line;
192 1 LCD_cn=0x80;
193 1 wcom();
194 1 while(buffer[j]!='\0')
195 1 {
196 2 if(j%16==0) //每行智能显示16个字符,到达字符个数自动换行
197 2 {
198 3 line=j/16;
199 3 if(line>4) break;
200 3 changeAddr(line); //改变地址
201 3 wcom();
202 3 }
203 2 LCD_cn=buffer[j];
204 2 wdat();
205 2 j++;
206 2 }
207 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 282 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 101 ----
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 + -