📄 lcd1602.lst
字号:
C51 COMPILER V8.02 LCD1602 08/30/2008 17:20:03 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE LCD1602
OBJECT MODULE PLACED IN LCD1602.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE LCD1602.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*********************************************************************
2 * 标题: 1602简单驱动(C)
3 * 文件: LCD1602.c
4 * 作者: 机器人DIY工作室
5 * 日期: 2008.7.15
6 * 修改: 2008.7.25
7 * 软件: Keil C51 V8.02
8 * 芯片: AT89X52
9 * 说明: 硬件连接定义在LCD1602.H中
10 *********************************************************************/
11
12 #include <LCD1602.H>
13
14 // 本地函数
15
16 void lcd_delay_us(unsigned char us) // 延时微秒@12M,ms最大值255
17 {
18 1 while(--us)
19 1 {
20 2 ;
21 2 }
22 1 }
23
24 void lcd_delay_ms(unsigned char ms) // 延时毫秒@12M,ms最大值255
25 {
26 1 unsigned char i;
27 1 while(ms--)
28 1 {
29 2 for(i = 0; i < 124; i++)
30 2 {
31 3 ;
32 3 }
33 2 }
34 1 }
35
36
37 // 产生一个使能脉冲
38
39 void lcd_e_toggle(void)
40 {
41 1 LCD_E = 1;
42 1 lcd_delay_us(3);
43 1 LCD_E = 0;
44 1 }
45
46
47 // 循环检测LCD忙标志(BF),直到其值为0,方可执行下一指令
48
49 void lcd_wait_until_finish(void)
50 {
51 1 LCD_RW = 1; // RW置1,状态为读
52 1 LCD_RS = 0; // RS置0,读状态时RS需置低电平
53 1 LCD_E = 1; // E 置1,读取信息
54 1
55 1 while(LCD_BF) // 循环直至BF=0
C51 COMPILER V8.02 LCD1602 08/30/2008 17:20:03 PAGE 2
56 1 {
57 2 ;
58 2 }
59 1 LCD_E = 0; // E重置为0
60 1 }
61
62
63 // 公共函数
64
65 // 向LCD写命令字
66
67 void lcd_command(unsigned char cmd)
68 {
69 1 LCD_RW = 0; // RW置0,状态为写
70 1 LCD_RS = 0; // RS置0,写入命令字
71 1
72 1 LCD_DATA_PORT = cmd; // 将命令字cmd送入LCD的数据端口
73 1 lcd_e_toggle(); // 产生使能脉冲,在下降沿开始执行,将命令字读入
74 1 lcd_wait_until_finish(); // 等待执行完毕
75 1 }
76
77
78 // 设置显示位置(即写入显示地址),x,y均从0开始
79
80 void lcd_goto_xy(unsigned char x, unsigned char y)
81 {
82 1 unsigned char p; // p为字符显示位置,即DDRAM中的地址
83 1 if (y==0)
84 1 {
85 2 p = 0x00 + x; // (0,0)显示位置为0x00
86 2 }
87 1 else
88 1 {
89 2 p = 0x40 + x; // (0,1)显示位置为0x40
90 2 }
91 1 lcd_command(p + 0x80); // 写入显示地址时DB7须为高电平,加0x80
92 1 lcd_command(p + 0x80); // 写入显示地址时DB7须为高电平,加0x80
93 1 }
94
95
96 // 写字符(传入的参数实际为所需显示字符的地址,即液晶字符产生器中字符的地址)
97
98 void lcd_putc(unsigned char c)
99 {
100 1 LCD_RW = 0; // RW置0,状态为写
101 1 LCD_RS = 1; // RS置1,写入数据
102 1
103 1 LCD_DATA_PORT = c; // 将字符c(实际上是字符的地址)送入LCD数据端口
104 1 lcd_e_toggle(); // 使能脉冲
105 1 lcd_wait_until_finish(); // 等待完成
106 1 }
107
108
109 // 指定位置写字符
110
111 void lcd_xy_putc(unsigned char x, unsigned char y, unsigned char c)
112 {
113 1 lcd_goto_xy(x,y);
114 1 lcd_putc(c);
115 1 }
116
117
C51 COMPILER V8.02 LCD1602 08/30/2008 17:20:03 PAGE 3
118 // 写字符串
119
120 void lcd_puts(unsigned char *s)
121 {
122 1 while(*s)
123 1 {
124 2 lcd_putc(*s);
125 2 s++;
126 2 }
127 1 }
128
129
130 // 指定位置写字符串
131
132 void lcd_xy_puts(unsigned char x, unsigned char y, unsigned char *s)
133 {
134 1 lcd_goto_xy(x, y);
135 1 lcd_puts(s);
136 1 }
137
138 // LCD初始化
139
140 void lcd_init(void)
141 {
142 1 lcd_delay_ms(12); // 上电后适当延时
143 1 lcd_command(0x38); // 设为8位接口模式,显示2行字符
144 1 lcd_command(0x06); // 写入新数据后光标右移
145 1 lcd_command(0x0c); // 显示功能开,不显示光标
146 1 lcd_command(0x01); // 清屏
147 1 }
148
149 //把一个十六进制数转化成一个十进制数,返回值放在一个数组里面
150 char *convert(unsigned int outData)
151 {
152 1 unsigned char strTemp[5];
153 1 strTemp[0]= (unsigned char)(((outData / 10000)% 10) + 0x30);
154 1 strTemp[1] = (unsigned char)(((outData / 1000) % 10) + 0x30);
155 1 strTemp[2] = (unsigned char)(((outData / 100) % 10) + 0x30);
156 1 strTemp[3] =(unsigned char)(((outData / 10) % 10) + 0x30);
157 1 strTemp[4]=(unsigned char)((outData % 10) + 0x30);
158 1 return strTemp;
159 1 }
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
C51 COMPILER V8.02 LCD1602 08/30/2008 17:20:03 PAGE 4
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 267 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 5
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 + -