📄 1602.lst
字号:
__text_start:
__start:
53 EFCF LDI R28,0xFF
54 E1D0 LDI R29,0x10
55 BFCD OUT 0x3D,R28
56 BFDE OUT 0x3E,R29
57 51CE SUBI R28,0x1E
58 40D0 SBCI R29,0
59 EA0A LDI R16,0xAA
5A 8308 STD Y+0,R16
5B 2400 CLR R0
5C E1E9 LDI R30,0x19
5D E0F1 LDI R31,1
5E E011 LDI R17,1
5F 31E9 CPI R30,0x19
60 07F1 CPC R31,R17
61 F011 BEQ 0x0064
62 9201 ST R0,Z+
63 CFFB RJMP 0x005F
64 8300 STD Z+0,R16
65 E8EC LDI R30,0x8C
66 E0F0 LDI R31,0
67 E0A0 LDI R26,0
68 E0B1 LDI R27,1
69 E010 LDI R17,0
6A E000 LDI R16,0
6B BF0B OUT 0x3B,R16
6C 3AE5 CPI R30,0xA5
6D 07F1 CPC R31,R17
6E F021 BEQ 0x0073
6F 95C8 LPM
70 9631 ADIW R30,1
71 920D ST R0,X+
72 CFF9 RJMP 0x006C
73 940E 028C CALL _main
_exit:
75 CFFF RJMP _exit
FILE: E:\产品\开发板\mega128-board\光盘\实验程序\1602液晶\1602.h
(0001) #define uchar unsigned char
(0002) #define uint unsigned int
(0003)
(0004) #define RS 0
(0005) #define RW 1
(0006) #define EN 2
(0007)
(0008) void s_ms(uint ms)
(0009) {
(0010) for(;ms>1;ms--);
_s_ms:
ms --> R16
76 C002 RJMP 0x0079
77 5001 SUBI R16,1
78 4010 SBCI R17,0
79 E081 LDI R24,1
7A E090 LDI R25,0
7B 1780 CP R24,R16
7C 0791 CPC R25,R17
7D F3C8 BCS 0x0077
7E 9508 RET
_busy:
temp --> R20
7F 934A ST R20,-Y
(0011) }
(0012)
(0013) //查忙
(0014) void busy(void)
(0015) {
(0016) uchar temp;
(0017) s_ms(500);
80 EF04 LDI R16,0xF4
81 E011 LDI R17,1
82 DFF3 RCALL _s_ms
(0018) PORTG&=~(1<<RS); //RS=0
83 9180 0065 LDS R24,0x0065
85 7F8E ANDI R24,0xFE
86 9380 0065 STS 0x0065,R24
(0019) s_ms(500);
88 EF04 LDI R16,0xF4
89 E011 LDI R17,1
8A DFEB RCALL _s_ms
(0020) PORTG|=(1<<RW); //RW=1
8B 9180 0065 LDS R24,0x0065
8D 6082 ORI R24,2
8E 9380 0065 STS 0x0065,R24
(0021) s_ms(500);
90 EF04 LDI R16,0xF4
91 E011 LDI R17,1
92 DFE3 RCALL _s_ms
93 C022 RJMP 0x00B6
(0022) while(temp)
(0023) {
(0024) PORTG|=(1<<EN); //EN=1
94 9180 0065 LDS R24,0x0065
96 6084 ORI R24,4
97 9380 0065 STS 0x0065,R24
(0025) s_ms(500);
99 EF04 LDI R16,0xF4
9A E011 LDI R17,1
9B DFDA RCALL _s_ms
(0026) DDRA=0x00; //A口变输入
9C 2422 CLR R2
9D BA2A OUT 0x1A,R2
(0027) PORTA=0xff; //上拉使能
9E EF8F LDI R24,0xFF
9F BB8B OUT 0x1B,R24
(0028) s_ms(500);
A0 EF04 LDI R16,0xF4
A1 E011 LDI R17,1
A2 DFD3 RCALL _s_ms
(0029) temp = PINA&0x80; //读取A口
A3 B349 IN R20,0x19
A4 7840 ANDI R20,0x80
(0030) s_ms(500);
A5 EF04 LDI R16,0xF4
A6 E011 LDI R17,1
A7 DFCE RCALL _s_ms
(0031) DDRA=0xff;
A8 EF8F LDI R24,0xFF
A9 BB8A OUT 0x1A,R24
(0032) PORTA=0xff; //A口变输出
AA BB8B OUT 0x1B,R24
(0033) s_ms(500);
AB EF04 LDI R16,0xF4
AC E011 LDI R17,1
AD DFC8 RCALL _s_ms
(0034) PORTG&=~(1<<EN); //EN=0
AE 9180 0065 LDS R24,0x0065
B0 7F8B ANDI R24,0xFB
B1 9380 0065 STS 0x0065,R24
(0035) s_ms(500);
B3 EF04 LDI R16,0xF4
B4 E011 LDI R17,1
B5 DFC0 RCALL _s_ms
B6 2344 TST R20
B7 F6E1 BNE 0x0094
B8 9149 LD R20,Y+
B9 9508 RET
_writecom:
com --> R10
BA 92AA ST R10,-Y
BB 2EA0 MOV R10,R16
(0036) }
(0037) }
(0038)
(0039) //写指令
(0040) void writecom(uchar com)
(0041) {
(0042) busy();
BC DFC2 RCALL _busy
(0043) s_ms(500);
BD EF04 LDI R16,0xF4
BE E011 LDI R17,1
BF DFB6 RCALL _s_ms
(0044) PORTG&=~(1<<RS); //RS=0
C0 9180 0065 LDS R24,0x0065
C2 7F8E ANDI R24,0xFE
C3 9380 0065 STS 0x0065,R24
(0045) s_ms(500);
C5 EF04 LDI R16,0xF4
C6 E011 LDI R17,1
C7 DFAE RCALL _s_ms
(0046) PORTG&=~(1<<RW); //RW=0
C8 9180 0065 LDS R24,0x0065
CA 7F8D ANDI R24,0xFD
CB 9380 0065 STS 0x0065,R24
(0047) s_ms(500);
CD EF04 LDI R16,0xF4
CE E011 LDI R17,1
CF DFA6 RCALL _s_ms
(0048) PORTG|=(1<<EN); //EN=1
D0 9180 0065 LDS R24,0x0065
D2 6084 ORI R24,4
D3 9380 0065 STS 0x0065,R24
(0049) s_ms(500);
D5 EF04 LDI R16,0xF4
D6 E011 LDI R17,1
D7 DF9E RCALL _s_ms
(0050) PORTA = com; //输出指令
D8 BAAB OUT 0x1B,R10
(0051) s_ms(500);
D9 EF04 LDI R16,0xF4
DA E011 LDI R17,1
DB DF9A RCALL _s_ms
(0052) PORTG&=~(1<<EN); //EN=0
DC 9180 0065 LDS R24,0x0065
DE 7F8B ANDI R24,0xFB
DF 9380 0065 STS 0x0065,R24
(0053) s_ms(500);
E1 EF04 LDI R16,0xF4
E2 E011 LDI R17,1
E3 DF92 RCALL _s_ms
E4 90A9 LD R10,Y+
E5 9508 RET
(0054) }
(0055)
(0056) //1602初始化
(0057) void LcdInit(void)
(0058) {
(0059) writecom(0x38);
_LcdInit:
E6 E308 LDI R16,0x38
E7 DFD2 RCALL _writecom
(0060) s_ms(1000);
E8 EE08 LDI R16,0xE8
E9 E013 LDI R17,3
EA DF8B RCALL _s_ms
(0061) writecom(0x01);
EB E001 LDI R16,1
EC DFCD RCALL _writecom
(0062) s_ms(10000);
ED E100 LDI R16,0x10
EE E217 LDI R17,0x27
EF DF86 RCALL _s_ms
(0063) s_ms(1000);
F0 EE08 LDI R16,0xE8
F1 E013 LDI R17,3
F2 DF83 RCALL _s_ms
(0064) s_ms(1000);
F3 EE08 LDI R16,0xE8
F4 E013 LDI R17,3
F5 DF80 RCALL _s_ms
(0065) s_ms(1000);
F6 EE08 LDI R16,0xE8
F7 E013 LDI R17,3
F8 DF7D RCALL _s_ms
(0066) s_ms(1000);
F9 EE08 LDI R16,0xE8
FA E013 LDI R17,3
FB DF7A RCALL _s_ms
(0067) s_ms(1000);
FC EE08 LDI R16,0xE8
FD E013 LDI R17,3
FE DF77 RCALL _s_ms
(0068) s_ms(1000);
FF EE08 LDI R16,0xE8
100 E013 LDI R17,3
101 DF74 RCALL _s_ms
(0069) writecom(0x02);
102 E002 LDI R16,2
103 DFB6 RCALL _writecom
(0070) s_ms(1000);
104 EE08 LDI R16,0xE8
105 E013 LDI R17,3
106 DF6F RCALL _s_ms
(0071) writecom(0x06);
107 E006 LDI R16,6
108 DFB1 RCALL _writecom
(0072) s_ms(1000);
109 EE08 LDI R16,0xE8
10A E013 LDI R17,3
10B DF6A RCALL _s_ms
(0073) writecom(0x0c);
10C E00C LDI R16,0xC
10D DFAC RCALL _writecom
(0074) s_ms(1000);
10E EE08 LDI R16,0xE8
10F E013 LDI R17,3
110 DF65 RCALL _s_ms
(0075) writecom(0x38);
111 E308 LDI R16,0x38
112 DFA7 RCALL _writecom
(0076) s_ms(1000);
113 EE08 LDI R16,0xE8
114 E013 LDI R17,3
115 DF60 RCALL _s_ms
116 9508 RET
_writedata:
data --> R10
117 92AA ST R10,-Y
118 2EA0 MOV R10,R16
(0077) }
(0078)
(0079) //写数据
(0080) void writedata(uchar data)
(0081) {
(0082) busy();
119 DF65 RCALL _busy
(0083) s_ms(500);
11A EF04 LDI R16,0xF4
11B E011 LDI R17,1
11C DF59 RCALL _s_ms
(0084) PORTG|=(1<<RS); //RS=1
11D 9180 0065 LDS R24,0x0065
11F 6081 ORI R24,1
120 9380 0065 STS 0x0065,R24
(0085) s_ms(500);
122 EF04 LDI R16,0xF4
123 E011 LDI R17,1
124 DF51 RCALL _s_ms
(0086) PORTG&=~(1<<RW); //RW=0
125 9180 0065 LDS R24,0x0065
127 7F8D ANDI R24,0xFD
128 9380 0065 STS 0x0065,R24
(0087) s_ms(500);
12A EF04 LDI R16,0xF4
12B E011 LDI R17,1
12C DF49 RCALL _s_ms
(0088) PORTG|=(1<<EN); //EN=1
12D 9180 0065 LDS R24,0x0065
12F 6084 ORI R24,4
130 9380 0065 STS 0x0065,R24
(0089) s_ms(500);
132 EF04 LDI R16,0xF4
133 E011 LDI R17,1
134 DF41 RCALL _s_ms
(0090) PORTA = data; //输出数据
135 BAAB OUT 0x1B,R10
(0091) s_ms(500);
136 EF04 LDI R16,0xF4
137 E011 LDI R17,1
138 DF3D RCALL _s_ms
(0092) PORTG&=~(1<<EN); //EN=0
139 9180 0065 LDS R24,0x0065
13B 7F8B ANDI R24,0xFB
13C 9380 0065 STS 0x0065,R24
(0093) s_ms(500);
13E EF04 LDI R16,0xF4
13F E011 LDI R17,1
140 DF35 RCALL _s_ms
141 90A9 LD R10,Y+
142 9508 RET
_readdata:
temp --> R10
143 92AA ST R10,-Y
(0094) }
(0095)
(0096)
(0097) //读数据
(0098) uchar readdata(void)
(0099) {
(0100) uchar temp;
(0101) busy();
144 DF3A RCALL _busy
(0102) s_ms(500);
145 EF04 LDI R16,0xF4
146 E011 LDI R17,1
147 DF2E RCALL _s_ms
(0103) PORTG|=(1<<RS); //RS=1
148 9180 0065 LDS R24,0x0065
14A 6081 ORI R24,1
14B 9380 0065 STS 0x0065,R24
(0104) s_ms(500);
14D EF04 LDI R16,0xF4
14E E011 LDI R17,1
14F DF26 RCALL _s_ms
(0105) PORTG|=(1<<RW); //RW=1
150 9180 0065 LDS R24,0x0065
152 6082 ORI R24,2
153 9380 0065 STS 0x0065,R24
(0106) s_ms(500);
155 EF04 LDI R16,0xF4
156 E011 LDI R17,1
157 DF1E RCALL _s_ms
(0107) PORTG|=(1<<EN); //EN=1
158 9180 0065 LDS R24,0x0065
15A 6084 ORI R24,4
15B 9380 0065 STS 0x0065,R24
(0108) s_ms(500);
15D EF04 LDI R16,0xF4
15E E011 LDI R17,1
15F DF16 RCALL _s_ms
(0109) DDRA=0x00; //A端口变输入
160 2422 CLR R2
161 BA2A OUT 0x1A,R2
(0110) s_ms(500);
162 EF04 LDI R16,0xF4
163 E011 LDI R17,1
164 DF11 RCALL _s_ms
(0111) temp = PINA; //读A端口
165 B2A9 IN R10,0x19
(0112) s_ms(500);
166 EF04 LDI R16,0xF4
167 E011 LDI R17,1
168 DF0D RCALL _s_ms
(0113) DDRA=0xff; //A端口变输出
169 EF8F LDI R24,0xFF
16A BB8A OUT 0x1A,R24
(0114) s_ms(500);
16B EF04 LDI R16,0xF4
16C E011 LDI R17,1
16D DF08 RCALL _s_ms
(0115) PORTG&=~(1<<EN); //EN=0
16E 9180 0065 LDS R24,0x0065
170 7F8B ANDI R24,0xFB
171 9380 0065 STS 0x0065,R24
(0116) s_ms(500);
173 EF04 LDI R16,0xF4
174 E011 LDI R17,1
175 DF00 RCALL _s_ms
(0117) return temp;
176 2D0A MOV R16,R10
177 90A9 LD R10,Y+
178 9508 RET
_WriteCGRAM:
t --> R10
i --> R20
pBuffer --> R22
num --> R10
179 940E 02AD CALL push_xgsetF00C
17B 01B9 MOVW R22,R18
17C 0158 MOVW R10,R16
(0118) }
(0119)
(0120) //=================================================
(0121) // 描述: 写LCD内部CGRAM函数
(0122) // 入口: ‘num’要写的数据个数
(0123) // ‘pbuffer’要写的数据的首地址
(0124) // 出口: 无
(0125) //================================================
(0126) void WriteCGRAM(uint num, const uint *pBuffer)
(0127) {
(0128) uint i,t;
(0129) writecom(0x40);
17D E400 LDI R16,0x40
17E DF3B RCALL _writecom
(0130) PORTG|=(1<<RS);
17F 9180 0065 LDS R24,0x0065
181 6081 ORI R24,1
182 9380 0065 STS 0x0065,R24
(0131) PORTG&=~(1<<RW);
184 9180 0065 LDS R24,0x0065
186 7F8D ANDI R24,0xFD
187 9380 0065 STS 0x0065,R24
(0132) for(i=num;i!=0;i--)
189 01A5 MOVW R20,R10
18A C012 RJMP 0x019D
(0133) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -