📄 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 0200 CALL _main
_exit:
75 CFFF RJMP _exit
FILE: D:\16实验程序\1602液晶\1602.h
(0001) #define uchar unsigned char
(0002) #define uint unsigned int
(0003)
(0004) #define RS 5
(0005) #define RW 6
(0006) #define EN 7
(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) PORTA&=~(1<<RS); //RS=0
83 98DD CBI 0x1B,5
(0019) s_ms(500);
84 EF04 LDI R16,0xF4
85 E011 LDI R17,1
86 DFEF RCALL _s_ms
(0020) PORTA|=(1<<RW); //RW=1
87 9ADE SBI 0x1B,6
(0021) s_ms(500);
88 EF04 LDI R16,0xF4
89 E011 LDI R17,1
8A DFEB RCALL _s_ms
8B C01A RJMP 0x00A6
(0022) while(temp)
(0023) {
(0024) PORTA|=(1<<EN); //EN=1
8C 9ADF SBI 0x1B,7
(0025) s_ms(500);
8D EF04 LDI R16,0xF4
8E E011 LDI R17,1
8F DFE6 RCALL _s_ms
(0026) DDRD=0x00; //A口变输入
90 2422 CLR R2
91 BA21 OUT 0x11,R2
(0027) PORTD=0xff; //上拉使能
92 EF8F LDI R24,0xFF
93 BB82 OUT 0x12,R24
(0028) s_ms(500);
94 EF04 LDI R16,0xF4
95 E011 LDI R17,1
96 DFDF RCALL _s_ms
(0029) temp = PIND&0x80; //读取A口
97 B340 IN R20,0x10
98 7840 ANDI R20,0x80
(0030) s_ms(500);
99 EF04 LDI R16,0xF4
9A E011 LDI R17,1
9B DFDA RCALL _s_ms
(0031) DDRD=0xff;
9C EF8F LDI R24,0xFF
9D BB81 OUT 0x11,R24
(0032) PORTD=0xff; //A口变输出
9E BB82 OUT 0x12,R24
(0033) s_ms(500);
9F EF04 LDI R16,0xF4
A0 E011 LDI R17,1
A1 DFD4 RCALL _s_ms
(0034) PORTA&=~(1<<EN); //EN=0
A2 98DF CBI 0x1B,7
(0035) s_ms(500);
A3 EF04 LDI R16,0xF4
A4 E011 LDI R17,1
A5 DFD0 RCALL _s_ms
A6 2344 TST R20
A7 F721 BNE 0x008C
A8 9149 LD R20,Y+
A9 9508 RET
_writecom:
com --> R10
AA 92AA ST R10,-Y
AB 2EA0 MOV R10,R16
(0036) }
(0037) }
(0038)
(0039) //写指令
(0040) void writecom(uchar com)
(0041) {
(0042) busy();
AC DFD2 RCALL _busy
(0043) s_ms(500);
AD EF04 LDI R16,0xF4
AE E011 LDI R17,1
AF DFC6 RCALL _s_ms
(0044) PORTA&=~(1<<RS); //RS=0
B0 98DD CBI 0x1B,5
(0045) s_ms(500);
B1 EF04 LDI R16,0xF4
B2 E011 LDI R17,1
B3 DFC2 RCALL _s_ms
(0046) PORTA&=~(1<<RW); //RW=0
B4 98DE CBI 0x1B,6
(0047) s_ms(500);
B5 EF04 LDI R16,0xF4
B6 E011 LDI R17,1
B7 DFBE RCALL _s_ms
(0048) PORTA|=(1<<EN); //EN=1
B8 9ADF SBI 0x1B,7
(0049) s_ms(500);
B9 EF04 LDI R16,0xF4
BA E011 LDI R17,1
BB DFBA RCALL _s_ms
(0050) PORTD = com; //输出指令
BC BAA2 OUT 0x12,R10
(0051) s_ms(500);
BD EF04 LDI R16,0xF4
BE E011 LDI R17,1
BF DFB6 RCALL _s_ms
(0052) PORTA&=~(1<<EN); //EN=0
C0 98DF CBI 0x1B,7
(0053) s_ms(500);
C1 EF04 LDI R16,0xF4
C2 E011 LDI R17,1
C3 DFB2 RCALL _s_ms
C4 90A9 LD R10,Y+
C5 9508 RET
(0054) }
(0055)
(0056) //1602初始化
(0057) void LcdInit(void)
(0058) {
(0059) DDRD = 0xff;
_LcdInit:
C6 EF8F LDI R24,0xFF
C7 BB81 OUT 0x11,R24
(0060) PORTD = 0x00;
C8 2422 CLR R2
C9 BA22 OUT 0x12,R2
(0061) writecom(0x38);
CA E308 LDI R16,0x38
CB DFDE RCALL _writecom
(0062) s_ms(1000);
CC EE08 LDI R16,0xE8
CD E013 LDI R17,3
CE DFA7 RCALL _s_ms
(0063) writecom(0x01);
CF E001 LDI R16,1
D0 DFD9 RCALL _writecom
(0064) s_ms(1000);
D1 EE08 LDI R16,0xE8
D2 E013 LDI R17,3
D3 DFA2 RCALL _s_ms
(0065) s_ms(1000);
D4 EE08 LDI R16,0xE8
D5 E013 LDI R17,3
D6 DF9F RCALL _s_ms
(0066) s_ms(1000);
D7 EE08 LDI R16,0xE8
D8 E013 LDI R17,3
D9 DF9C RCALL _s_ms
(0067) s_ms(1000);
DA EE08 LDI R16,0xE8
DB E013 LDI R17,3
DC DF99 RCALL _s_ms
(0068) s_ms(1000);
DD EE08 LDI R16,0xE8
DE E013 LDI R17,3
DF DF96 RCALL _s_ms
(0069) s_ms(1000);
E0 EE08 LDI R16,0xE8
E1 E013 LDI R17,3
E2 DF93 RCALL _s_ms
(0070) s_ms(1000);
E3 EE08 LDI R16,0xE8
E4 E013 LDI R17,3
E5 DF90 RCALL _s_ms
(0071) writecom(0x02);
E6 E002 LDI R16,2
E7 DFC2 RCALL _writecom
(0072) s_ms(1000);
E8 EE08 LDI R16,0xE8
E9 E013 LDI R17,3
EA DF8B RCALL _s_ms
(0073) writecom(0x06);
EB E006 LDI R16,6
EC DFBD RCALL _writecom
(0074) s_ms(1000);
ED EE08 LDI R16,0xE8
EE E013 LDI R17,3
EF DF86 RCALL _s_ms
(0075) writecom(0x0c);
F0 E00C LDI R16,0xC
F1 DFB8 RCALL _writecom
(0076) s_ms(1000);
F2 EE08 LDI R16,0xE8
F3 E013 LDI R17,3
F4 DF81 RCALL _s_ms
(0077) writecom(0x38);
F5 E308 LDI R16,0x38
F6 DFB3 RCALL _writecom
(0078) s_ms(1000);
F7 EE08 LDI R16,0xE8
F8 E013 LDI R17,3
F9 DF7C RCALL _s_ms
FA 9508 RET
_writedata:
data --> R10
FB 92AA ST R10,-Y
FC 2EA0 MOV R10,R16
(0079) }
(0080)
(0081) //写数据
(0082) void writedata(uchar data)
(0083) {
(0084) busy();
FD DF81 RCALL _busy
(0085) s_ms(500);
FE EF04 LDI R16,0xF4
FF E011 LDI R17,1
100 DF75 RCALL _s_ms
(0086) PORTA|=(1<<RS); //RS=1
101 9ADD SBI 0x1B,5
(0087) s_ms(500);
102 EF04 LDI R16,0xF4
103 E011 LDI R17,1
104 DF71 RCALL _s_ms
(0088) PORTA&=~(1<<RW); //RW=0
105 98DE CBI 0x1B,6
(0089) s_ms(500);
106 EF04 LDI R16,0xF4
107 E011 LDI R17,1
108 DF6D RCALL _s_ms
(0090) PORTA|=(1<<EN); //EN=1
109 9ADF SBI 0x1B,7
(0091) s_ms(500);
10A EF04 LDI R16,0xF4
10B E011 LDI R17,1
10C DF69 RCALL _s_ms
(0092) PORTD = data; //输出数据
10D BAA2 OUT 0x12,R10
(0093) s_ms(500);
10E EF04 LDI R16,0xF4
10F E011 LDI R17,1
110 DF65 RCALL _s_ms
(0094) PORTA&=~(1<<EN); //EN=0
111 98DF CBI 0x1B,7
(0095) s_ms(500);
112 EF04 LDI R16,0xF4
113 E011 LDI R17,1
114 DF61 RCALL _s_ms
115 90A9 LD R10,Y+
116 9508 RET
_readdata:
temp --> R10
117 92AA ST R10,-Y
(0096) }
(0097)
(0098)
(0099) //读数据
(0100) uchar readdata(void)
(0101) {
(0102) uchar temp;
(0103) busy();
118 DF66 RCALL _busy
(0104) s_ms(500);
119 EF04 LDI R16,0xF4
11A E011 LDI R17,1
11B DF5A RCALL _s_ms
(0105) PORTA|=(1<<RS); //RS=1
11C 9ADD SBI 0x1B,5
(0106) s_ms(500);
11D EF04 LDI R16,0xF4
11E E011 LDI R17,1
11F DF56 RCALL _s_ms
(0107) PORTA|=(1<<RW); //RW=1
120 9ADE SBI 0x1B,6
(0108) s_ms(500);
121 EF04 LDI R16,0xF4
122 E011 LDI R17,1
123 DF52 RCALL _s_ms
(0109) PORTA|=(1<<EN); //EN=1
124 9ADF SBI 0x1B,7
(0110) s_ms(500);
125 EF04 LDI R16,0xF4
126 E011 LDI R17,1
127 DF4E RCALL _s_ms
(0111) DDRD=0x00; //A端口变输入
128 2422 CLR R2
129 BA21 OUT 0x11,R2
(0112) s_ms(500);
12A EF04 LDI R16,0xF4
12B E011 LDI R17,1
12C DF49 RCALL _s_ms
(0113) temp = PIND; //读A端口
12D B2A0 IN R10,0x10
(0114) s_ms(500);
12E EF04 LDI R16,0xF4
12F E011 LDI R17,1
130 DF45 RCALL _s_ms
(0115) DDRD=0xff; //A端口变输出
131 EF8F LDI R24,0xFF
132 BB81 OUT 0x11,R24
(0116) s_ms(500);
133 EF04 LDI R16,0xF4
134 E011 LDI R17,1
135 DF40 RCALL _s_ms
(0117) PORTA&=~(1<<EN); //EN=0
136 98DF CBI 0x1B,7
(0118) s_ms(500);
137 EF04 LDI R16,0xF4
138 E011 LDI R17,1
139 DF3C RCALL _s_ms
(0119) return temp;
13A 2D0A MOV R16,R10
13B 90A9 LD R10,Y+
13C 9508 RET
_WriteCGRAM:
t --> R10
i --> R20
pBuffer --> R22
num --> R10
13D 940E 0222 CALL push_xgsetF00C
13F 01B9 MOVW R22,R18
140 0158 MOVW R10,R16
(0120) }
(0121)
(0122) //=================================================
(0123) // 描述: 写LCD内部CGRAM函数
(0124) // 入口: ‘num’要写的数据个数
(0125) // ‘pbuffer’要写的数据的首地址
(0126) // 出口: 无
(0127) //================================================
(0128) void WriteCGRAM(uint num, const uint *pBuffer)
(0129) {
(0130) uint i,t;
(0131) writecom(0x40);
141 E400 LDI R16,0x40
142 DF67 RCALL _writecom
(0132) PORTA|=(1<<RS);
143 9ADD SBI 0x1B,5
(0133) PORTA&=~(1<<RW);
144 98DE CBI 0x1B,6
(0134) for(i=num;i!=0;i--)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -