📄 lcd.lst
字号:
C51 COMPILER V7.10 LCD 07/01/2005 09:26:59 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE LCD
OBJECT MODULE PLACED IN lcd.OBJ
COMPILER INVOKED BY: D:\PROGRAM FILES\KEIL\C51\BIN\C51.EXE lcd.c OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND
line level source
1 //**********************************************************************************
2 //本函数模块来自"51单片机世界",作者版主丁丁(聂小猛)。
3 //主页地址http://www.mcu51.com
4 //本程序为本站推出的"MCU51-63K仿真器"及"DX-51多功能试验板"而设计的,详情请到本站查看.
5 //"51单片机世界"版权所有,未经允许,不得抄袭作为商业用途
6 //**********************************************************************************
7 //点阵液晶模块上的汉字显示程序
8 //可以显示全部一二级中文简体汉字
9 //可以混显全角和半角,并自动转行
10 #define uchar unsigned char
11 #define uint unsigned int
12 #define ulong unsigned long
13 #include <reg52.h>
14 #include <absacc.h>
15 #include "study.h"
16
17 #define LCMD XBYTE[0xAf00] // 液晶数据口
18 #define LCMC XBYTE[0xAb00] // 液晶命令口
19
20 //#define LCMD XBYTE[0x7fff] // 数据口
21 //#define LCMC XBYTE[0x7bff] // 命令口
22
23 #define LCD_DOT_X 98 // lcd 的宽点数
24 #define LCD_DOT_Y 54 //lcd 的高点数
25 //定义光标范围,每个光标占用8*8点阵
26 #define LCD_MAX_X 11 //每行字符, ( LCD_MAX_X +1 ) * 8 点
27 #define LCD_MAX_Y 5 //共多少行,( LCD_MAX_Y +1 ) * 8 点
28 //光标位置定义
29 struct cursortype
30 {
31 uchar x;
32 uchar y;
33 };
34 struct cursortype cursor;
35
36 void wridata(uchar ch)
37 {
38 1
39 1 LCMD=ch;
40 1 }
41 void wricmd(uchar ch)
42 {
43 1
44 1 LCMC=ch;
45 1 }
46
47 //*******************************
48 //改变LCD亮度
49 //输入范围0-63
50 void light(uchar n)
51 {
52 1 LCMC=0x81;
53 1 LCMC=n;
54 1 }
55 //****************************
C51 COMPILER V7.10 LCD 07/01/2005 09:26:59 PAGE 2
56 //清屏
57 //入口:ch=9会连带ICON一起清除,ch=8不清除ICON
58
59 void cls(uchar ch)
60 {
61 1 uchar i,j;
62 1
63 1 for(j=0x0;j<ch;j++)
64 1 {
65 2
66 2 wricmd(0xb0+j);//set page
67 2 wricmd(0x10);//set column msb
68 2 wricmd(0x0);//set column lsb
69 2 wricmd(0xe0);//set modify-read mode
70 2 for(i=0;i<132;i++)
71 2 {
72 3
73 3 wridata(0x00); //填满0即清屏
74 3 }
75 2 wricmd(0xee);//reset modify-read mode
76 2 }
77 1 }
78
79
80
81
82 show_asc(uchar ch);
83 //***********************
84 //初始化液晶
85 uchar lcdlight=6; //motorola的液晶默认亮度为32,早期学习板132*64液晶的默认亮度为6
86 void initlcd(void)
87 {
88 1
89 1 //初始化液晶0x2f,0x22,0x81,32,0x40,0xa0,0xc8,0xa2
90 1 // P2=0x00; //P2作为总线时,其寄存器的值对总线没有影响。
91 1 //初始化为0,是为了更好的配合液晶的6800总线。motorola的液晶内部固定了6800总线方式。
92 1 //如果去掉这一句,motorola的液晶的最左边一列点将无法控制。
93 1 //如果液晶是8080总线,则无需这样做。
94 1 wricmd(0x2f);//SET POWER CONTROL
95 1 wricmd(0x20);//REGULATOR RESISTOR SELECT
96 1 wricmd(0x81);
97 1 wricmd(lcdlight);
98 1 wricmd(0x40);//INITIAL DISPLAY LINE
99 1 wricmd(0xa0);//ADC=0(SEG1~SEG132)
100 1 wricmd(0xc8);//SHL=0(COM1~COM64)
101 1 wricmd(0xa2);//SET 1/9 LCD BIAS
102 1 LCMC=0xa6;//NORMAL DISPIAY SET
103 1 cls(9);
104 1 wricmd(0xaf);//DISPIAY ON
105 1 setcursor(0,0);//设置光标到左上角
106 1 }
107
108 //**********************************************************
109 //在当前光标位置显示一个12*6 点阵的ASC码字符
110 //入口:asc字符的值ch
111 show_asc(uchar ch)
112 {
113 1 uint addr;
114 1 uchar hzdata[16];
115 1 uchar xdot,i;
116 1 addr=16*ch; //寻址点阵在flash中的物理位置
117 1
C51 COMPILER V7.10 LCD 07/01/2005 09:26:59 PAGE 3
118 1 readeprom(addr,hzdata,16); //读出16个字节的点阵数据
119 1 xdot=cursor.x*8; //计算出横向点位置
120 1 wricmd(0xb0+cursor.y); //将y位置送入液晶
121 1 wricmd(xdot & 0x0f); //将x位置送入液晶
122 1 wricmd( 0x10 | (xdot >> 4 ));
123 1 wricmd(0xe0);
124 1 for(i=0;i<8;i++)
125 1 {
126 2 wridata(hzdata[i]); //写上半个字符
127 2 }
128 1 wricmd(0xee);
129 1 wricmd(0xb0+cursor.y+1);
130 1 wricmd(xdot & 0x0f);
131 1 wricmd(0x10 | (xdot >> 4 ));
132 1 wricmd(0xe0);
133 1 for(;i<16;i++) //写下半个字符
134 1 {
135 2 wridata(hzdata[i]);
136 2 }
137 1 wricmd(0xee);
138 1 }
139 //*************************************
140 //在当前光标位置显示一个16*16 汉字或者全角字符
141 //入口:该汉字的区码ch1,和位码ch2
142 show_hz(uchar ch1, uchar ch2)
143 {
144 1 ulong addr;
145 1 uchar hzdata[32];
146 1 uchar xdot,i;
147 1 if (ch1>=0xb0) //寻址汉字在flash中的物理位置
148 1 {
149 2 addr=(ch1-0xb0)*94+ ch2-0xa1;
150 2 addr=addr*32+0x5a40;
151 2 }
152 1 else
153 1 {
154 2 addr=(ch1-0xa1)*94+ ch2-0xa1;
155 2 addr=addr*32+0x800;
156 2 }
157 1
158 1 readeprom(addr,hzdata,32); //读出32个汉字点阵数据
159 1
160 1 xdot=cursor.x*8; //计算X位置
161 1 wricmd(0xb0+cursor.y);
162 1 wricmd(xdot & 0x0f);
163 1 wricmd( 0x10 | (xdot >> 4 ));
164 1 wricmd(0xe0);
165 1 for(i=0;i<16;i++) //显示上半个汉字
166 1 {
167 2 wridata(hzdata[i]);
168 2 }
169 1 wricmd(0xee);
170 1 wricmd( 0xb0+cursor.y+1);
171 1 wricmd(xdot & 0x0f);
172 1 wricmd( 0x10 | (xdot >> 4 ));
173 1 wricmd(0xe0);
174 1 for(;i<32;i++) //显示下半个汉字
175 1 {
176 2 wridata(hzdata[i]);
177 2 }
178 1 wricmd(0xee);
179 1 }
C51 COMPILER V7.10 LCD 07/01/2005 09:26:59 PAGE 4
180 //*******************************************
181 //设置光标位置
182 //以6×6点阵为一个光标单位,
183 //入口:x方向和y方向光标位置
184 void setcursor(uchar x, uchar y)
185 {
186 1 if ( x<= LCD_MAX_X )
187 1 cursor.x= x;
188 1 else
189 1 cursor.x= LCD_MAX_X;
190 1
191 1 if ( y<= LCD_MAX_Y )
192 1 cursor.y= y;
193 1 else
194 1 cursor.y= LCD_MAX_Y-1;
195 1 }
196
197 // **********************************
198 //在光标位置显示字符串
199 //入口:要显示的字符串
200 void lcdstring( uchar *pst)
201 {
202 1 while ( *pst != 0 )
203 1 {
204 2 if ( *pst < 0x80 ) //小于0x80是字符
205 2 {
206 3 if (*pst==0x0a) setcursor(0, cursor.y+2); //处理回车换行
207 3 else if (*pst== 0x0d) setcursor(0, cursor.y );
208 3 else
209 3 {
210 4 show_asc(*pst); //显示ASC字符
211 4 cursor.x++;
212 4 if (( cursor.x > LCD_MAX_X )&& (*(pst+1)!=0x0a)){cursor.x=0;cursor.y=cursor.y+2;}
213 4 }
214 3 pst++; //下一个要显示的字符
215 3 }
216 2 else //大于0x80是汉字
217 2 {
218 3 if ( cursor.x>= LCD_MAX_X )
219 3 {
220 4 show_asc(0x20); //一行的尾部只有半个汉字位置的处理,加一个空格,在下一行开始显示
221 4 cursor.x=0;cursor.y=cursor.y+2;
222 4 if (cursor.y> LCD_MAX_Y) cursor.y=0; //
223 4 }
224 3 show_hz(*pst, *(pst+1)); //显示一个汉字
225 3 cursor.x+=2;
226 3 pst+=2;
227 3 if ((cursor.x> LCD_MAX_X)&& (*(pst+1)!=0x0a)){cursor.x=0;cursor.y=cursor.y+2;}
228 3 }
229 2 if ( cursor.y> LCD_MAX_Y ){ cursor.x=0;cursor.y=0;return;}
230 2 }
231 1 }
232 //**********************************************
233 //在当前光标以十进制方式在液晶上显示一个字节的值
234 //入口:要显示的值
235 lcddigit(uchar ch)
236 {
237 1 uchar i[4];
238 1 i[0]=(0x30+ch/100);
239 1 i[1]=(0x30+(ch%100)/10);
240 1 i[2]=(0x30+ch%10);
241 1 i[3]=0; //添加结束符号
C51 COMPILER V7.10 LCD 07/01/2005 09:26:59 PAGE 5
242 1 lcdstring(i);
243 1 }
244 //***********************************
245 //在当前光标显示一个ASC字符
246 //入口:要显示的字符
247 lcdchar(uchar ch)
248 {
249 1 uchar i[2];
250 1 i[0]=ch;
251 1 i[1]=0; //添加结束符号
252 1 lcdstring(i);
253 1 }
254
255
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 851 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 63
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 + -