📄 1602.lst
字号:
145 01A5 MOVW R20,R10
146 C00A RJMP 0x0151
(0135) {
(0136) t = *pBuffer;
147 01FB MOVW R30,R22
148 90A7 ELPM R10,Z+
149 90B6 ELPM R11,10(Z)
(0137) PORTA|=(1<<EN);
14A 9ADF SBI 0x1B,7
(0138) PORTD = t;
14B BAA2 OUT 0x12,R10
(0139) PORTA&=~(1<<EN);
14C 98DF CBI 0x1B,7
(0140) pBuffer++;
14D 5F6E SUBI R22,0xFE
14E 4F7F SBCI R23,0xFF
14F 5041 SUBI R20,1
150 4050 SBCI R21,0
151 3040 CPI R20,0
152 0745 CPC R20,R21
153 F799 BNE 0x0147
154 940C 0229 JMP pop_xgsetF00C
_WriteMenu:
t --> R10
i --> R22
pBuffer --> R20
156 940E 0222 CALL push_xgsetF00C
158 01A8 MOVW R20,R16
(0141) }
(0142)
(0143) }
(0144)
(0145) //=================================================
(0146) //描述:写菜单函数,本程序使用的LCD规格为 16 * 2
(0147) //入口:菜单数组首地址
(0148) //出口:无
(0149) //=================================================
(0150) void WriteMenu(const uchar *pBuffer)
(0151) {
(0152) uchar i,t;
(0153) writecom(0x80); //数据地址
159 E800 LDI R16,0x80
15A DF4F RCALL _writecom
(0154)
(0155) PORTA|=(1<<RS);
15B 9ADD SBI 0x1B,5
(0156) PORTA&=~(1<<RW);
15C 98DE CBI 0x1B,6
(0157) s_ms(50);
15D E302 LDI R16,0x32
15E E010 LDI R17,0
15F DF16 RCALL _s_ms
(0158) for(i=0;i<16;i++)
160 2766 CLR R22
161 C00B RJMP 0x016D
(0159) {
(0160) t = *pBuffer;
162 01FA MOVW R30,R20
163 90A6 ELPM R10,11(Z)
(0161) PORTD = t;
164 BAA2 OUT 0x12,R10
(0162) PORTA|=(1<<EN);
165 9ADF SBI 0x1B,7
(0163) s_ms(50);
166 E302 LDI R16,0x32
167 E010 LDI R17,0
168 DF0D RCALL _s_ms
(0164) PORTA&=~(1<<EN);
169 98DF CBI 0x1B,7
(0165) pBuffer++;
16A 5F4F SUBI R20,0xFF
16B 4F5F SBCI R21,0xFF
16C 9563 INC R22
16D 3160 CPI R22,0x10
16E F398 BCS 0x0162
(0166) }
(0167) writecom(0xC0);
16F EC00 LDI R16,0xC0
170 DF39 RCALL _writecom
(0168)
(0169) PORTA|=(1<<RS);
171 9ADD SBI 0x1B,5
(0170) PORTA&=~(1<<RW);
172 98DE CBI 0x1B,6
(0171) s_ms(50);
173 E302 LDI R16,0x32
174 E010 LDI R17,0
175 DF00 RCALL _s_ms
(0172) for(i=0;i<16;i++)
176 2766 CLR R22
177 C00B RJMP 0x0183
(0173) {
(0174) t = *pBuffer;
178 01FA MOVW R30,R20
179 90A6 ELPM R10,11(Z)
(0175) PORTD = t;
17A BAA2 OUT 0x12,R10
(0176) PORTA|=(1<<EN);
17B 9ADF SBI 0x1B,7
(0177) s_ms(50);
17C E302 LDI R16,0x32
17D E010 LDI R17,0
17E DEF7 RCALL _s_ms
(0178) PORTA&=~(1<<EN);
17F 98DF CBI 0x1B,7
(0179) pBuffer++;
180 5F4F SUBI R20,0xFF
181 4F5F SBCI R21,0xFF
182 9563 INC R22
183 3160 CPI R22,0x10
184 F398 BCS 0x0178
185 940C 0229 JMP pop_xgsetF00C
_WriteNum:
num --> R20
col --> R10
row --> R22
187 940E 0222 CALL push_xgsetF00C
189 0159 MOVW R10,R18
18A 01B8 MOVW R22,R16
18B 814E LDD R20,Y+6
18C 815F LDD R21,Y+7
(0180) }
(0181) }
(0182) //====================================================
(0183) // 描述:在任意位置写数字函数
(0184) // 入口:’row‘表示要写数字所在的行地址,只能为1或2
(0185) // ’col‘表示要写数字所在的列地址,只能为0--15
(0186) // ‘num’表示要写的数字,只能为0--9
(0187) // 出口:无
(0188) //===================================================
(0189) void WriteNum(uint row,uint col,uint num)
(0190) {
(0191) if (row == 1) row = 0x80 + col;
18D 3061 CPI R22,1
18E E0E0 LDI R30,0
18F 077E CPC R23,R30
190 F421 BNE 0x0195
191 01B5 MOVW R22,R10
192 5860 SUBI R22,0x80
193 4F7F SBCI R23,0xFF
194 C003 RJMP 0x0198
(0192) else row = 0xC0 + col;
195 01B5 MOVW R22,R10
196 5460 SUBI R22,0x40
197 4F7F SBCI R23,0xFF
(0193) writecom(row);
198 2F06 MOV R16,R22
199 DF10 RCALL _writecom
(0194) if (num<=0 | num>9) num =0x30;
19A 3040 CPI R20,0
19B 0745 CPC R20,R21
19C F421 BNE 0x01A1
19D E081 LDI R24,1
19E E090 LDI R25,0
19F 015C MOVW R10,R24
1A0 C002 RJMP 0x01A3
1A1 24AA CLR R10
1A2 24BB CLR R11
1A3 E089 LDI R24,0x9
1A4 E090 LDI R25,0
1A5 1784 CP R24,R20
1A6 0795 CPC R25,R21
1A7 F418 BCC 0x01AB
1A8 E061 LDI R22,1
1A9 E070 LDI R23,0
1AA C002 RJMP 0x01AD
1AB 2766 CLR R22
1AC 2777 CLR R23
1AD 0115 MOVW R2,R10
1AE 2A26 OR R2,R22
1AF 2A37 OR R3,R23
1B0 2022 TST R2
1B1 F411 BNE 0x01B4
1B2 2033 TST R3
1B3 F019 BEQ 0x01B7
1B4 E340 LDI R20,0x30
1B5 E050 LDI R21,0
1B6 C002 RJMP 0x01B9
(0195) else num = 0x30 + num;
1B7 5D40 SUBI R20,0xD0
1B8 4F5F SBCI R21,0xFF
(0196)
(0197) PORTA|=(1<<RS);
1B9 9ADD SBI 0x1B,5
(0198) s_ms(500);
1BA EF04 LDI R16,0xF4
1BB E011 LDI R17,1
1BC DEB9 RCALL _s_ms
(0199) PORTA&=~(1<<RW);
1BD 98DE CBI 0x1B,6
(0200) s_ms(500);
1BE EF04 LDI R16,0xF4
1BF E011 LDI R17,1
1C0 DEB5 RCALL _s_ms
(0201) PORTD = num;
1C1 BB42 OUT 0x12,R20
(0202) s_ms(500);
1C2 EF04 LDI R16,0xF4
1C3 E011 LDI R17,1
1C4 DEB1 RCALL _s_ms
(0203) PORTA|=(1<<EN);
1C5 9ADF SBI 0x1B,7
(0204) s_ms(500);
1C6 EF04 LDI R16,0xF4
1C7 E011 LDI R17,1
1C8 DEAD RCALL _s_ms
(0205) PORTA&=~(1<<EN);
1C9 98DF CBI 0x1B,7
(0206) s_ms(500);
1CA EF04 LDI R16,0xF4
1CB E011 LDI R17,1
1CC DEA9 RCALL _s_ms
1CD 940C 0229 JMP pop_xgsetF00C
_WriteChar:
t --> R12
i --> R10
pBuffer --> R20
num --> Y,+8
col --> R10
row --> R22
1CF 940E 0230 CALL push_xgsetF03C
1D1 2EA2 MOV R10,R18
1D2 2F60 MOV R22,R16
1D3 854A LDD R20,Y+10
1D4 855B LDD R21,Y+11
(0207) }
(0208) //================================================================
(0209) // 描述:在任意位置写任意多个字符
(0210) // 入口:’row‘要写的字符所在的行,只能为1或2;
(0211) // ‘col’要写的字符所在的列,只能为0---15
(0212) // ‘num’要写字符的个数
(0213) // ‘pbuffer’要写字符的首地址
(0214) //==================================================================
(0215) void WriteChar(uchar row,uchar col,uint num,uchar *pBuffer)
(0216) {
(0217) uchar i,t;
(0218) if (row == 1) row = 0x80 + col;
1D5 3061 CPI R22,1
1D6 F419 BNE 0x01DA
1D7 2D6A MOV R22,R10
1D8 5860 SUBI R22,0x80
1D9 C002 RJMP 0x01DC
(0219) else row = 0xC0 + col;
1DA 2D6A MOV R22,R10
1DB 5460 SUBI R22,0x40
(0220) writecom(row);
1DC 2F06 MOV R16,R22
1DD DECC RCALL _writecom
(0221) //if (num<=0 | num>9) num =0x30;
(0222) //else num = 0x30 + num;
(0223)
(0224) PORTA|=(1<<RS);
1DE 9ADD SBI 0x1B,5
(0225) s_ms(500);
1DF EF04 LDI R16,0xF4
1E0 E011 LDI R17,1
1E1 DE94 RCALL _s_ms
(0226) PORTA&=~(1<<RW);
1E2 98DE CBI 0x1B,6
(0227) s_ms(500);
1E3 EF04 LDI R16,0xF4
1E4 E011 LDI R17,1
1E5 DE90 RCALL _s_ms
(0228) for(i=num;i!=0;i--)
1E6 84A8 LDD R10,Y+8
1E7 C014 RJMP 0x01FC
(0229) {
(0230) t = *pBuffer;
1E8 01FA MOVW R30,R20
1E9 80C0 LDD R12,Z+0
(0231) s_ms(500);
1EA EF04 LDI R16,0xF4
1EB E011 LDI R17,1
1EC DE89 RCALL _s_ms
(0232) PORTD = t;
1ED BAC2 OUT 0x12,R12
(0233) s_ms(500);
1EE EF04 LDI R16,0xF4
1EF E011 LDI R17,1
1F0 DE85 RCALL _s_ms
(0234) PORTA|=(1<<EN);
1F1 9ADF SBI 0x1B,7
(0235) s_ms(500);
1F2 EF04 LDI R16,0xF4
1F3 E011 LDI R17,1
1F4 DE81 RCALL _s_ms
(0236) PORTA&=~(1<<EN);
1F5 98DF CBI 0x1B,7
(0237) s_ms(500);
1F6 EF04 LDI R16,0xF4
1F7 E011 LDI R17,1
1F8 DE7D RCALL _s_ms
(0238) pBuffer++;
1F9 5F4F SUBI R20,0xFF
1FA 4F5F SBCI R21,0xFF
1FB 94AA DEC R10
1FC 20AA TST R10
1FD F751 BNE 0x01E8
1FE 940C 0239 JMP pop_xgsetF03C
_main:
200 9724 SBIW R28,4
FILE: D:\16实验程序\1602液晶\1602_main.c
(0001) //1602液晶显示程序
(0002) #include<iom16v.h>
(0003) #include"1602.h"
(0004) #define uchar unsigned char
(0005) #define uint unsigned int
(0006)
(0007) uchar wz[]={"WWW.ISMCU.COM"};
(0008) uchar gd[]={"Good Luck!"};
(0009)
(0010) //主函数
(0011) void main()
(0012) {
(0013) DDRA=0xff;
201 EF8F LDI R24,0xFF
202 BB8A OUT 0x1A,R24
(0014) PORTA=0xff;
203 BB8B OUT 0x1B,R24
(0015) DDRD=0xff;
204 BB81 OUT 0x11,R24
(0016) PORTD=0xff;
205 BB82 OUT 0x12,R24
(0017) s_ms(5000); //延时
206 E808 LDI R16,0x88
207 E113 LDI R17,0x13
208 DE6D RCALL _s_ms
(0018) LcdInit(); //1602初始化
209 DEBC RCALL _LcdInit
(0019) WriteChar(1,1,13,wz); //显示第一行
20A E080 LDI R24,0
20B E091 LDI R25,1
20C 839B STD Y+3,R25
20D 838A STD Y+2,R24
20E E08D LDI R24,0xD
20F E090 LDI R25,0
210 8399 STD Y+1,R25
211 8388 STD Y+0,R24
212 E021 LDI R18,1
213 E001 LDI R16,1
214 DFBA RCALL _WriteChar
(0020) WriteChar(2,3,10,gd); //显示第二行
FILE: <library>
215 E08E LDI R24,0xE
216 E091 LDI R25,1
217 839B STD Y+3,R25
218 838A STD Y+2,R24
219 E08A LDI R24,0xA
21A E090 LDI R25,0
21B 8399 STD Y+1,R25
21C 8388 STD Y+0,R24
21D E023 LDI R18,3
21E E002 LDI R16,2
21F DFAF RCALL _WriteChar
220 9624 ADIW R28,4
221 9508 RET
push_xgsetF00C:
222 937A ST R23,-Y
223 936A ST R22,-Y
224 935A ST R21,-Y
225 934A ST R20,-Y
226 92BA ST R11,-Y
227 92AA ST R10,-Y
228 9508 RET
pop_xgsetF00C:
229 90A9 LD R10,Y+
22A 90B9 LD R11,Y+
22B 9149 LD R20,Y+
22C 9159 LD R21,Y+
22D 9169 LD R22,Y+
22E 9179 LD R23,Y+
22F 9508 RET
push_xgsetF03C:
230 937A ST R23,-Y
231 936A ST R22,-Y
232 935A ST R21,-Y
233 934A ST R20,-Y
234 92DA ST R13,-Y
235 92CA ST R12,-Y
236 92BA ST R11,-Y
237 92AA ST R10,-Y
238 9508 RET
pop_xgsetF03C:
239 90A9 LD R10,Y+
23A 90B9 LD R11,Y+
23B 90C9 LD R12,Y+
23C 90D9 LD R13,Y+
23D 9149 LD R20,Y+
23E 9159 LD R21,Y+
23F 9169 LD R22,Y+
240 9179 LD R23,Y+
241 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -