📄 1602.lst
字号:
C51 COMPILER V8.02 1602 03/12/2009 15:47:43 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 1602
OBJECT MODULE PLACED IN 1602.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 1602.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*=======================================
2 1602lcd模块驱动程序
3 ==========================================
4
5 说明:1.晶体:11.0592MHz
6 2.1602驱动:ks0066
7
8 ******************************************/
9 #include <reg52.h>
10 #include <string.h>
11
12 #define uchar unsigned char
13 #define uint unsigned int
14 #define lcd_data P0 //定义P2口为数据口
15
16 sbit lcd_rs = P2^0 ; //寄存器选择
17 sbit lcd_rw = P2^1 ; //读/写控制
18 sbit lcd_e = P2^2 ; //读/写使能
19 //sbit lcd_blk = P1^0 ; //背光led 1.off 0.on
20
21
22
23 //函数声明
24 void delay5ms(void);
25 void delay400ms(void);
26 void lcd_write_command(uchar wc_lcd,busy_c);
27
28
29 /***********************************
30 //函数名称: void lcd_ini(void)
31 //传递参数: 无
32 //返 回 值: 无
33 //函数功能: LCD初始化
34 //函数说明:
35 ***********************************/
36 void lcd_ini(void)
37 {
38 1 lcd_data = 0;
39 1 lcd_write_command(0x38,0); //16*2显示,5*7点阵,8位数据接口,不检测忙
40 1 delay5ms();
41 1 // lcd_write_command(0x38,0);
42 1 // delay5ms();
43 1 // lcd_write_command(0x38,0); //三次显示模式, 不检测忙
44 1 // delay5ms();
45 1 lcd_write_command(0x38,1); //16*2显示,5*7点阵,8位数据接口,需要检测忙
46 1 // lcd_write_command(0x80,1); //关闭显示
47 1 lcd_write_command(0x01,1); //clear显示
48 1 lcd_write_command(0x06,1); //指针和光标+1,不滚屏
49 1 lcd_write_command(0x0c,1); //开显示,不显示光标
50 1 }
51
52 /***********************************
53 //函数名称: uchar lcd_read_status(void)
54 //传递参数: 无
55 //返 回 值: uchar
C51 COMPILER V8.02 1602 03/12/2009 15:47:43 PAGE 2
56 //函数功能: 读lcm状态,等待lcd空闲
57 //函数说明: DB7=1,忙
58 ***********************************/
59 uchar lcd_read_status(void)
60 {
61 1 lcd_data=0xff;
62 1 lcd_rs=0;
63 1 lcd_rw=1;
64 1 lcd_e=0;
65 1 lcd_e=0;
66 1 lcd_e=1;
67 1 while(lcd_data & 0x80); //如果DB7为1表示忙,则死循环等待
68 1 return lcd_data;
69 1 }
70
71 /***********************************
72 //函数名称: void lcd_write_data(uchar wd_lcd)
73 //传递参数: uchar wd_lcd
74 //返 回 值: 无
75 //函数功能: lcd写数据
76 //函数说明:
77 ***********************************/
78 void lcd_write_data(uchar wd_lcd)
79 {
80 1 lcd_read_status(); //判断lcd忙标志
81 1 lcd_data = wd_lcd;
82 1 lcd_rs = 1;
83 1 lcd_rw = 0;
84 1 lcd_e = 0;
85 1 lcd_e = 0;
86 1 lcd_e = 1;
87 1 }
88
89 /***********************************
90 //函数名称: void lcd_write_command(uchar wc_lcd, busy_c)
91 //传递参数: uchar wc_lcd, busy_c
92 //返 回 值: 无
93 //函数功能: lcd写命令
94 //函数说明: busy_c=0 是表示不用检测忙信号
95 ***********************************/
96 void lcd_write_command(uchar wc_lcd, busy_c)
97 {
98 1 if (busy_c)
99 1 lcd_read_status();
100 1 lcd_data = wc_lcd;
101 1 lcd_rs=0;
102 1 lcd_rw = 0;
103 1 lcd_e = 0;
104 1 lcd_e = 0;
105 1 lcd_e = 1;
106 1 }
107
108 /***********************************
109 //函数名称: void disp_one_char(uchar x, uchar y,uchar disp_data)
110 //传递参数: uchar x, uchar y,uchar disp_data
111 //返 回 值: 无
112 //函数功能: 指定位置显示 一个 字符
113 //函数说明:
114 ***********************************/
115 void disp_one_char(uchar x,uchar y,uchar disp_data)
116 {
117 1 y = y&0x01;
C51 COMPILER V8.02 1602 03/12/2009 15:47:43 PAGE 3
118 1 x = x&0x0f; //限制2行,没行15个字
119 1 if (y)
120 1 x =x + 0x40; //算RAM地址,假如y为1则表示第二行,x地址就从40H开始
121 1 x = x + 0x80; //两行的地址的最高位DB7都要恒为1
122 1 lcd_write_command(x,0);
123 1 lcd_write_data(disp_data);
124 1 }
125
126 /***********************************
127 //函数名称: void disp_one_char(uchar x, uchar y,uchar *disp_data)
128 //传递参数: uchar x, uchar y,uchar *disp_data
129 //返 回 值: 无
130 //函数功能: 指定位置显示 一串 字符
131 //函数说明:
132 ***********************************/
133 void disp_list_char(uchar x,uchar y,uchar *disp_data) //x表示列位置,从0到15共16位,y表示行,从0到1共2行
134 {
135 1 uchar char_length,j;
136 1 char_length = strlen(disp_data);
137 1 y = y&0x01;
138 1 x = x&0x0f;
139 1 for (j=0;j<char_length;j++)
140 1 {
141 2 disp_one_char( x,y,disp_data[j]); //显示一个字符
142 2 x++;
143 2 }
144 1 }
145
146 /***********************************
147 //函数名称: void delay5ms(void)
148 //传递参数: 无
149 //返 回 值: 无
150 //函数功能: 延时5MS
151 //函数说明:
152 ***********************************/
153 void delay5ms(void)
154 {
155 1 uint TempCyc = 5552;
156 1 while(TempCyc--);
157 1 }
158
159
160 /***********************************
161 //函数名称: void delay400ms(void)
162 //传递参数: 无
163 //返 回 值: 无
164 //函数功能: L延时400MS
165 //函数说明: LCD开机延时
166 ***********************************/
167
168 /*
169 void delay400ms(void)
170 {
171 uchar TempCycA = 5;
172 uint TempCycB;
173 while(TempCycA--)
174 {
175 TempCycB=7269;
176 while(TempCycB--);
177 };
178 }
179
C51 COMPILER V8.02 1602 03/12/2009 15:47:43 PAGE 4
180 /*****d******************************
181 //函数名称: void main(void)
182 //传递参数: 无
183 //返 回 值: 无
184 //函数功能: 主函数
185 //函数说明:
186 ************************************/
187 void main(void)
188 {
189 1 uint key,x=0;
190 1 delay5ms();
191 1 lcd_ini(); //lcd初始化
192 1 while((key=P2&0xf0)==0xf0) //Wellcome流动效果
193 1 {
194 2 disp_list_char(x,0,"->Wellcome-> "); // 开机首屏幕
195 2 x++;
196 2
197 2 disp_list_char(0,1,"^Happy new year^"); // 问候语
198 2 delay5ms();delay5ms();delay5ms();delay5ms();delay5ms();
199 2 delay5ms();delay5ms();delay5ms();delay5ms();delay5ms(); //10个delay5毫秒
200 2
201 2 } //要按定任一键约1秒才跳出循环
202 1
203 1 while(1)
204 1 {
205 2 key=0;
206 2 key=P2&0xf0; //键盘扫描
207 2
208 2 switch(key)
209 2 { case 0xe0:
210 3 {
211 4 disp_list_char(0,0," Do you want to ");
212 4 disp_list_char(0,1,"send Record 01 ?");
213 4
214 4 }break;
215 3 }
216 2 }
217 1
218 1 }
219
220
221
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 336 ----
CONSTANT SIZE = 68 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 11
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 + -