📄 lcdinti.lst
字号:
C51 COMPILER V7.50 LCDINTI 04/29/2007 17:31:57 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE LCDINTI
OBJECT MODULE PLACED IN lcdinti.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcdinti.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h>
2 #define uchar unsigned char
3 #define uint unsigned int
4 //*************************************************************
5 sbit rst=P1^4;
6 sbit psb=P1^3;
7 sbit rs=P1^0;
8 sbit rw=P1^1;
9 sbit e=P1^2;
10 void delay_50us(uint t);
11 void delay_50ms(uint t);
12 void wri(uint t);
13 void wrd(uint t);
14 void welcome();
15 void WriteLCD(unsigned char StartAddress,unsigned char Size,unsigned char Charactors[]);
16 void WriteLCD_Command(unsigned char Command);
17 void WriteLCD_Data(unsigned char Data);
18 unsigned char ChangeAddress(unsigned char StartAddress);
19 unsigned char LCDBusyWait();
20 //*************************************************************
21 void lcd_init()//LCD初始化程序
22 {
23 1 rst=0;
24 1 rst=1; //LCD复位
25 1 psb=1; //将PSB置1,通信方式为8位数据并口
26 1 delay_50ms(1);//延时40ms
27 1 //功能设置---8BIT控制界面,基本指令集
28 1 wri(0x30); //调用写指令子程序
29 1 delay_50us(1); //延迟50us
30 1 //显示打开,光标关,反白显示关
31 1 wri(0x0c); //调用写指令子程序
32 1 delay_50us(1); //延迟50uS
33 1 //清除屏幕显示,将DDRAM的地址计数器归零
34 1 wri(0x01); //调用写指令子程序
35 1 delay_50us(1); //延迟39uS
36 1 //DDRAM的地址计数器(AC)加1
37 1 wri(0x06); //调用写指令子程序
38 1 delay_50us(1); //延迟39uS
39 1 }
40 void welcome()
41 { uchar i,j;
42 1 wri(0x01);
43 1 delay_50ms(1);
44 1 WriteLCD(0x82,0,"欢迎使用");
45 1 WriteLCD(0x92,0,"Welcome ");
46 1 //WriteLCD(0x89,0,"系统正忙");
47 1 WriteLCD(0x89,0,"Waiting.");
48 1 //WriteLCD(0x88,0,"正在加载初始化");
49 1 //WriteLCD(0x99,0,"Waiting ");
50 1 for(j=0;j<=1;j++)
51 1 {
52 2 wri(0x8d);
53 2 wrd(0x20);
54 2 wrd(0x20);
55 2 wrd(0x20);
C51 COMPILER V7.50 LCDINTI 04/29/2007 17:31:57 PAGE 2
56 2 wrd(0x20);
57 2 wrd(0x20);
58 2 wri(0x8d);
59 2 for(i=0;i<=4;i++)
60 2 {
61 3 wrd(0x2e);
62 3 delay_50ms(10);
63 3 }
64 2 }
65 1 }
66 //*************************************下面是延时程序(包括50us和50ms)
67 void delay_50us(uint t) //50us延时程序
68 {
69 1 uchar j;
70 1 for(;t>0;t--)
71 1 for(j=19;j>0;j--)
72 1 ;
73 1 }
74 void delay_50ms(uint t)//50ms延时程序
75 {
76 1 uint j;
77 1 for(;t>0;t--)
78 1 for(j=6245;j>0;j--)
79 1 ;
80 1 }
81 //***********************************************************
82 void wri(uint com)
83 {
84 1 rs=0;
85 1 rw=1;
86 1 loop1: P0=0xff;
87 1 e=1;
88 1 ACC=P0;
89 1 delay_50us(2);
90 1 if(ACC^7!=1)
91 1 {
92 2 rw=0;
93 2 P0=com;
94 2 e=1;
95 2 e=0;
96 2 }
97 1 else
98 1 goto loop1;
99 1 }
100 //******************************************以上是写指令子程序
101 void wrd(uint dat)
102 {
103 1 rs=0;
104 1 rw=1;
105 1 loop2:
106 1 P0=0xff;
107 1 e=1;
108 1 ACC=P0;
109 1 delay_50us(3);
110 1 if(ACC^7!=1)
111 1 {
112 2 rs=1;
113 2 rw=0;
114 2 P0=dat;
115 2 e=1;
116 2 e=0;
117 2 }
C51 COMPILER V7.50 LCDINTI 04/29/2007 17:31:57 PAGE 3
118 1 else
119 1 goto loop2;
120 1 }
121 //******************************************以上是写数据子程序
122 void WriteLCD(unsigned char StartAddress,unsigned char Size,unsigned char Charactors[])
123 {
124 1 unsigned char *i=Charactors; //字符串的首地址
125 1 WriteLCD_Command(StartAddress);
126 1 if(Size) //Size不为0
127 1 {
128 2 bit Over=0;
129 2 while(i<(Charactors+Size)) //判断字符串结尾
130 2 {
131 3 if(Over)
132 3 {
133 4 WriteLCD_Data(' ');i++;
134 4 if(i>=(Charactors+Size)) break;
135 4 WriteLCD_Data(' ');i++;
136 4 }
137 3 else
138 3 {
139 4
140 4 switch(((*i)*256)+(*(i+1)))
141 4 {
142 5
143 5 }
144 4 }
145 3 StartAddress=ChangeAddress(StartAddress); //改变地址,实现了逐行显示
146 3 }
147 2 }
148 1 else //Size为0
149 1 {
150 2 while(*i) //判断字符串结尾,*i为0代表结束
151 2 {
152 3 WriteLCD_Data(*i);
153 3 i++;
154 3 WriteLCD_Data(*i);
155 3 i++;
156 3 StartAddress=ChangeAddress(StartAddress);
157 3 }
158 2 }
159 1 }
160 void WriteLCD_Data(unsigned char Data) //向LCD写入一个字节的数据
161 {
162 1 LCDBusyWait();
163 1 rs=1;
164 1 P0 = Data;
165 1 e=1;
166 1 e=0;
167 1 }
168
169 void WriteLCD_Command(unsigned char Command) //向LCD写入一个字节的命令
170 {
171 1 LCDBusyWait();
172 1 rs=0;
173 1 P0=Command;
174 1 e=1;
175 1 e=0;
176 1 }
177 unsigned char ChangeAddress(unsigned char StartAddress)
178 {
179 1 switch(StartAddress)
C51 COMPILER V7.50 LCDINTI 04/29/2007 17:31:57 PAGE 4
180 1 {
181 2 case 0x87:WriteLCD_Command(0x90);StartAddress=0x90;break;
182 2 case 0x8F:WriteLCD_Command(0x98);StartAddress=0x98;break;
183 2 case 0x97:WriteLCD_Command(0x88);StartAddress=0x88;break;
184 2 default:StartAddress+=1;
185 2 }
186 1 return StartAddress;
187 1 }
188 unsigned char LCDBusyWait() //等待LCD就绪
189 {
190 1 unsigned char Status;
191 1 rs=0;
192 1 rw=1;
193 1 P0=0xFF;
194 1 e=1;
195 1 Status=P0;
196 1 e=0;
197 1 while(Status & 0x80)
198 1 {
199 2 e=1;
200 2 Status=P0;
201 2 e=0;
202 2 }
203 1 rw=0;
204 1 return Status;
205 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 618 ----
CONSTANT SIZE = 27 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 12
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -