📄 lcd1602四线驱动.lst
字号:
13 =1
14 =1 /*--------------------------------------------------------------*/
15 =1 //LCD1602接口定义
16 =1 sfr LCD_DATA = 0xa0; //P2口高四位(P2^4~P2^7)与LCD的高四位(D4~D7)一一对应相接
17 =1 sbit LCD_RS = P2^2; //数据指令
C51 COMPILER V7.06 LCD1602四_咔齙_ 08/10/2008 09:23:55 PAGE 5
18 =1 sbit LCD_EN = P2^3; //使能端
19 =1 //sbit LCD_RW = GND; //读写控制端接地 ^_^哈哈,又少了一根线咯!
20 =1
21 =1
22 =1 /*--------------------------------------------------------------*/
23 =1 //函数声明
24 =1 void LCD_init (void); //液晶初始化
25 =1 void LCD_en (void); //输入使能
26 =1 void LCD_clr (void); //液晶清屏
27 =1 void LCD_cmd (unsigned char cmd); //指令输入
28 =1 void LCD_dat (unsigned char dat); //数据输入
29 =1 void LCD_delay (unsigned char m, unsigned char n); //延迟时间
30 =1 void LCD_pos (unsigned char x, unsigned char y); //液晶定位
31 =1 void LCD_printc (unsigned char x, unsigned char y, unsigned char c); //字符定位输出
32 =1 void LCD_prints (unsigned char x, unsigned char y, unsigned char *s); //字符串定位输出
33 =1 /*
34 =1 void LCD_fprints(unsigned char *s,signed char pos); //字符串输出
35 =1 */
36 =1
37 =1 /*--------------------------------------------------------------*/
38 =1 //延迟时间12us→130 000us
39 =1 void LCD_delay(unsigned char m, unsigned char n)
40 =1 {
41 1 =1 unsigned char tempm,tempn=n;
42 1 =1 do{tempm=m;while(--tempm);}while(--tempn);
43 1 =1 }
44 =1
45 =1
46 =1 /*--------------------------------------------------------------*/
47 =1 //液晶初始化
48 =1 void LCD_init(void)
49 =1 {
50 1 =1 LCD_cmd(0x28);
51 1 =1 LCD_en();
52 1 =1 LCD_cmd(0x28); //四线显示
53 1 =1 LCD_cmd(0x0c); //显示打开
54 1 =1 LCD_cmd(0x01); //显示清屏
55 1 =1 LCD_delay(2, 249); //2000-2 us
56 1 =1 }
57 =1
58 =1
59 =1 /*--------------------------------------------------------------*/
60 =1 //输入使能
61 =1 void LCD_en(void)
62 =1 {
63 1 =1 LCD_EN = 1;
64 1 =1 LCD_delay(1,1); //12us
65 1 =1 LCD_EN = 0;
66 1 =1 }
67 =1
68 =1
69 =1 /*--------------------------------------------------------------*/
70 =1 //指令输入
71 =1 void LCD_cmd(unsigned char cmd)
72 =1 {
73 1 =1 LCD_delay(15,1); //40us
74 1 =1 LCD_RS = 0; //指令
75 1 =1 LCD_DATA &= 0x0f; //清高四位
76 1 =1 LCD_DATA |= cmd&0xf0; //写高四位
77 1 =1 LCD_en();
78 1 =1 cmd <<= 4; //低四位移到高四位
79 1 =1 LCD_DATA &= 0x0f; //清高四位
C51 COMPILER V7.06 LCD1602四_咔齙_ 08/10/2008 09:23:55 PAGE 6
80 1 =1 LCD_DATA |= cmd&0xf0; //写高四位
81 1 =1 LCD_en();
82 1 =1 }
83 =1
84 =1
85 =1 /*--------------------------------------------------------------*/
86 =1 //数据输入
87 =1 void LCD_dat(unsigned char dat)
88 =1 {
89 1 =1 LCD_delay(15,1); //40us
90 1 =1 LCD_RS = 1; //数据
91 1 =1 LCD_DATA &= 0x0f; //清高四位
92 1 =1 LCD_DATA |= dat&0xf0; //写高四位
93 1 =1 LCD_en();
94 1 =1 dat <<= 4; //低四位移到高四位
95 1 =1 LCD_DATA &= 0x0f; //清高四位
96 1 =1 LCD_DATA |= dat&0xf0; //写高四位
97 1 =1 LCD_en();
98 1 =1 }
99 =1
100 =1
101 =1 /*--------------------------------------------------------------*/
102 =1 //液晶清屏
103 =1 void LCD_clr(void)
104 =1 {
105 1 =1 LCD_cmd(0x01);
106 1 =1 LCD_delay(2, 249); //2000-2 us
107 1 =1 }
108 =1
109 =1
110 =1 /*--------------------------------------------------------------*/
111 =1 //液晶定位
112 =1 void LCD_pos(unsigned char x, unsigned char y)
113 =1 {
114 1 =1 if(y) LCD_cmd(x|0xc0);
115 1 =1 else LCD_cmd(x|0x80);
116 1 =1 }
117 =1
118 =1
119 =1
120 =1 /*--------------------------------------------------------------*/
121 =1 //字符定位输出
122 =1 void LCD_printc(unsigned char x, unsigned char y, unsigned char c)
123 =1 {
124 1 =1 LCD_pos(x, y);
125 1 =1 LCD_dat(c);
126 1 =1 }
127 =1
128 =1
129 =1 /*--------------------------------------------------------------*/
130 =1 //字符串定位输出
131 =1 void LCD_prints(unsigned char x, unsigned char y, unsigned char *s)
132 =1 {
133 1 =1 LCD_pos(x, y);
134 1 =1 while(*s)
135 1 =1 {
136 2 =1 LCD_dat(*s);
137 2 =1 s++;
138 2 =1 }
139 1 =1 }
140 =1
141 =1
C51 COMPILER V7.06 LCD1602四_咔齙_ 08/10/2008 09:23:55 PAGE 7
142 =1 /*--------------------------------------------------------------*/
143 =1 //字符串输出 //pos=-1 清屏 *s='\n' 换行 *s='\b' 退格
144 =1 /*void LCD_fprints(unsigned char *s, signed char pos)
145 =1 {
146 =1 unsigned char i;
147 =1 if(pos==-1)
148 =1 {
149 =1 LCD_cmd(0x01); //清屏
150 =1 LCD_delay(2, 249); //2000-2 us
151 =1 pos = 0;
152 =1 }
153 =1 while(*s)
154 =1 {
155 =1 switch(*s)
156 =1 {
157 =1 case '\n': //换行
158 =1 {
159 =1 if(pos < 17)
160 =1 {
161 =1 for(i = pos; i < 16; i++)
162 =1 LCD_printc(i%16, i/16, ' ');
163 =1 pos = 16;
164 =1 }
165 =1 else
166 =1 {
167 =1 for(i = pos; i < 32; i++)
168 =1 LCD_printc(i%16, i/16, ' ');
169 =1 pos = 32;
170 =1 }
171 =1 break;
172 =1 }
173 =1
174 =1 case '\b': //退格
175 =1 {
176 =1 if(pos > 0) pos--;
177 =1 LCD_printc(pos%16, pos/16, ' ');
178 =1 break;
179 =1 }
180 =1
181 =1 default:
182 =1 {
183 =1 if(*s < 0x20)
184 =1 *s=' ';
185 =1 LCD_printc(pos%16, pos/16, *s);
186 =1 pos++;
187 =1 break;
188 =1 }
189 =1 }
190 =1 s++;
191 =1 }
192 =1 }
193 =1 */
194 =1
195 =1
196 =1 /*--------------------------------------------------------------*/
197 =1 #endif
198 =1
199 =1
200 =1
201 =1
202 =1
203 =1
C51 COMPILER V7.06 LCD1602四_咔齙_ 08/10/2008 09:23:55 PAGE 8
204 =1
205 =1
3
4
5 void main(void)
6 {
7 1 LCD_init();
8 1 LCD_clr();
9 1 LCD_prints(0,0,"Hello! I am glad");
10 1 LCD_prints(4,1,"!*^ ^*!");
11 1 LCD_printc(7,1,'_');
12 1 /*LCD_clr();
13 1 LCD_fprints("HA HA... \n!*^_^*!\b!",-1);*/
14 1 while(1);
15 1 }
C51 COMPILER V7.06 LCD1602四_咔齙_ 08/10/2008 09:23:55 PAGE 9
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION Com0017 (BEGIN)
0000 L?0024:
0000 53A00F ANL LCD_DATA,#0FH
0003 EC MOV A,R4
0004 54F0 ANL A,#0F0H
0006 42A0 ORL LCD_DATA,A
0008 120000 R LCALL LCD_en
000B EC MOV A,R4
000C C4 SWAP A
000D 54F0 ANL A,#0F0H
000F FC MOV R4,A
0010 53A00F ANL LCD_DATA,#0FH
0013 54F0 ANL A,#0F0H
0015 42A0 ORL LCD_DATA,A
0017 22 RET
; FUNCTION Com0017 (END)
; FUNCTION L?0025 (BEGIN)
0000 AC07 MOV R4,AR7
0002 7D01 MOV R5,#01H
0004 7F0F MOV R7,#0FH
; FUNCTION _LCD_delay (BEGIN)
; SOURCE LINE # 39
;---- Variable 'n' assigned to Register 'R5' ----
;---- Variable 'm' assigned to Register 'R7' ----
; SOURCE LINE # 40
; SOURCE LINE # 41
;---- Variable 'tempn' assigned to Register 'R5' ----
0006 ?C0003:
; SOURCE LINE # 42
;---- Variable 'tempm' assigned to Register 'R6' ----
0006 AE07 MOV R6,AR7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -