📄 lcd.lst
字号:
C51 COMPILER V7.02b LCD 08/02/2005 17:51:31 PAGE 1
C51 COMPILER V7.02b, 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 //240*128液晶显示驱动程序
3 //控制器件为:AT89S52
4 //程序设计:卢印举
5 /*----------------------------------------------------------------------------------------*/
6
7 #include <AT89X51.H>
8 #include <math.h>
9 #include <absacc.h>
10 #include <string.h>
11
12 //以8*8字符计算,显示屏横向、纵向可以显示的字符个数
13 #define LineChar 16//共16行
14 #define ColumnChar 30 //总共30列
15
16 //信号管脚定义(全局变量)(注意:因为液晶数据口接P0,故为直接访问方式)
17 sbit cd=P2^0;
18 //sbit reset=P2^5;
19 sbit ce=P2^1;
20 sbit wr=P3^6;
21 sbit rd=P3^7;
22 unsigned char code ASCII816[ ][16]; //西文字模
23 unsigned char code HZTable[ ][32]; //汉字字模
24
25 //const char string[15]={"HELLO WORD"};
26
27 //数据线定义
28 #define dataport P0 //P0为数据口
29 #define unchar unsigned char //定义unchar
30 #define unint unsigned int //定义unint
31
32 /*----------------------------------------------------------------------------------------*/
33 //延时函数
34 void Lcddelay(unsigned char MS)
35 {
36 1 unsigned char us, usn;
37 1 while(MS!=0)
38 1 {
39 2 usn = 4;
40 2 while(usn!=0)
41 2 {
42 3 us=0xf0;
43 3 while(us!=0)
44 3 {us--;}
45 3 usn--;
46 3 }
47 2 MS--;
48 2 }
49 1 }
50
51 /*---------------------------------------------------------------------------------------*/
52 //状态检查函数
53 //指令,数据读写状态检查
54 //1-准备好;0-没有准备好;
55 //数据的读写之前,必须对芯片进行状态检查
C51 COMPILER V7.02b LCD 08/02/2005 17:51:31 PAGE 2
56
57 void RWCheck()
58 {
59 1 unchar dat;
60 1 do{
61 2 dataport=0xff;
62 2 cd=1;
63 2 rd=0;
64 2 dat=dataport;
65 2 rd=1;
66 2 dat=0x03&dat;//STA0,STA1分别是检查准备好
67 2 }while(dat!=0x03);
68 1 }
69 //数据自动读状态检查
70 void AutoRCheck()
71 {
72 1 unchar dat;
73 1 ce=0;
74 1 do{
75 2 dataport=0xff;
76 2 cd=1;
77 2 rd=0;
78 2 dat=dataport;
79 2 rd=1;
80 2 dat=0x04&dat;//STA2是否准备好
81 2 }while(dat==0x00);
82 1 }
83 //数据自动写状态检查
84 void AutoWCheck()
85 {
86 1 unchar dat;
87 1 do{
88 2 dataport=0xff;
89 2 cd=1;
90 2 rd=0;
91 2 dat=dataport;
92 2 rd=1;
93 2 dat=0x08&dat;//STA3是否准备好
94 2 }while(dat==0x00);
95 1 }
96
97
98 /*------------------------------------------------------------------------------------*/
99 //输入/出函数,与T6963C通讯
100 //读数据线上的数据
101 unchar InPortData()
102 {
103 1 unchar dat;
104 1 RWCheck();
105 1 cd=0;
106 1 dataport=0xff;
107 1 rd=0;
108 1 dat=dataport;
109 1 rd=1;
110 1 return(dat);
111 1 }
112
113 //向数据口发送Data
114 void OutPortData(dat){RWCheck();cd=0;wr=0;dataport=dat;wr=1;}
115
116 //写有 1 个参数命令:仅仅发送一个命令
117 void OutPortCom1(command) { RWCheck();cd=1;wr=0;dataport=command;wr=1;}
C51 COMPILER V7.02b LCD 08/02/2005 17:51:31 PAGE 3
118
119 //写有 2 个参数命令:向数据端口发送一个数据(dat),然后发送一个命令
120 void OutPortCom2(dat, command) { OutPortData(dat); OutPortCom1(command); }
121
122 //写有 3 个参数命令:向数据端口发送两个数据(dat1和dat2),然后发送一个命令
123 void OutPortCom3(data1, data2, command) { OutPortData(data1); OutPortData(data2); OutPortCom1(command);}
124
125 /*-----------------------------------------------------------------------------------*/
126 //显示30*16字符(显示范围为:30列16行)(图形显示方式)
127 //lin:行位置,(范围:0-15)
128 //column: 列位置,(范围0-29)
129 //ch:被发送的字符代码(标准ASCII码)
130 void ShowChar(unchar lin,unchar column,unchar ch)
131 {
132 1 unchar i;
133 1 unchar dat;
134 1 unint StartAddr;//开始的地址
135 1
136 1 while(column>15)
137 1 {
138 2 column=column-16;
139 2 lin=lin+1;
140 2 }
141 1 if (lin>3) return;
142 1
143 1 //StartAddr=(lin<<8)+column; //定位起始行(要求文本区从0x0000开始)
144 1 StartAddr=lin*LineChar+column; //定位起始行(要求文本区从0x0000开始)
145 1
146 1 for(i=0;i<16;i++)
147 1 {
148 2 dat=ASCII816[ch][i];//后面定义
149 2 OutPortCom3((unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address(可行吗?)
150 2 OutPortCom2(dat, 0xc4);
151 2
152 2 StartAddr=StartAddr + ColumnChar;
153 2 }
154 1 }
155
156 /*----------------------------------------------------------------------------------------------*/
157 //显示一个汉字(汉字为:8*8点阵格式,显示范围为:240X128点阵) (图形方式显示)
158 //lin:行位置。(范围0-15)
159 //column: 列位置,(范围0-29)
160 //hzcode: 要发送的汉字代码(自定义的汉字字库)
161 void ShowHZ(unchar lin,unchar column,unint hzcode)
162 {
163 1 unsigned char i;
164 1 unsigned int StartAddr;
165 1
166 1 while(column>14)
167 1 {
168 2 column=column-16;
169 2 lin=lin+1;
170 2 }
171 1 if (column<0) column=0;
172 1 if (lin>3) return;
173 1
174 1 StartAddr=(lin<<8)+column; //定位起始行(括号中相当于lin*ColumnChar*16)
175 1
176 1 for(i=0;i<16;i++)
177 1 {
178 2 OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);
179 2 OutPortCom2( HZTable[hzcode][i*2], 0xc0); //左半部 地址加一
C51 COMPILER V7.02b LCD 08/02/2005 17:51:31 PAGE 4
180 2 OutPortCom2( HZTable[hzcode][i*2+1], 0xc4); //右半部 字模地址加一
181 2
182 2 StartAddr=StartAddr + ColumnChar;
183 2 }
184 1 }
185
186 /*-----------------------------------------------------------------------------------*/
187 //显示一行字符串(汉字,字母混排)
188 //lin:行位置。(范围0-15)
189 //column: 列位置,(范围0-29)
190 void ShowLine(unchar lin,unchar column,unchar *puts,unchar i)
191 {
192 1 unchar j,byte,k;
193 1 while(column>15)
194 1 {
195 2 column=column-16;
196 2 lin=lin+1;
197 2 }
198 1 if (lin>3) return;//看首行是否超出屏幕
199 1 for (k=column,j=0;j<i;j++)
200 1 {
201 2 byte = puts[j];
202 2 if (byte&0x80) //汉字 /*汉字从0x80开始,包括0x80*/
203 2 {
204 3 ShowHZ(lin,k,byte&0x7f);
205 3 k=k+2;
206 3 }
207 2 else {ShowChar(lin,k,byte-0x20);k=k+1;}//字母 /*ascii码表从0x20开始*/
208 2
209 2 }
210 1 }
211
212 /*----------------------------------------------------------------------------------------------------*/
213 //反显一个字符
214 //lin:行位置。(范围0-15)
215 //column: 列位置,(范围0-29)
216 void ReverseShowChar(unchar lin,unchar column)
217 {
218 1 unsigned char i;
219 1 unsigned char dat;
220 1 unsigned int StartAddr;
221 1
222 1 StartAddr=(lin<<8) +column; //定位起始行
223 1
224 1 for(i=0;i<16;i++)
225 1 {
226 2 OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address
227 2 OutPortCom1( 0xc5 ); //数据一次读,地址不变
228 2 dat=InPortData(); //读入数据
229 2 dat=~dat; //取反
230 2 OutPortCom2( dat, 0xc4); //送回
231 2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -