?? 1602.lst
字號:
__text_start:
__start:
36 E5CF LDI R28,0x5F
37 E0D4 LDI R29,4
38 BFCD OUT 0x3D,R28
39 BFDE OUT 0x3E,R29
3A 51CE SUBI R28,0x1E
3B 40D0 SBCI R29,0
3C EA0A LDI R16,0xAA
3D 8308 STD Y+0,R16
3E 2400 CLR R0
3F E7E0 LDI R30,0x70
40 E0F0 LDI R31,0
41 E010 LDI R17,0
42 38E9 CPI R30,0x89
43 07F1 CPC R31,R17
44 F011 BEQ 0x0047
45 9201 ST R0,Z+
46 CFFB RJMP 0x0042
47 8300 STD Z+0,R16
48 E5EC LDI R30,0x5C
49 E0F0 LDI R31,0
4A E6A0 LDI R26,0x60
4B E0B0 LDI R27,0
4C E010 LDI R17,0
4D E000 LDI R16,0
4E BF0B OUT 0x3B,R16
4F 36EC CPI R30,0x6C
50 07F1 CPC R31,R17
51 F021 BEQ 0x0056
52 95C8 LPM
53 9631 ADIW R30,1
54 920D ST R0,X+
55 CFF9 RJMP 0x004F
56 940E 021C CALL _main
_exit:
58 CFFF RJMP _exit
FILE: D:\我的資源\我的文件\電子技術\AVR\AVR學習\JASON'~2\M16頻率計(10K-5MHz,誤差0.1%以下)(已驗證)\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
59 C002 RJMP 0x005C
5A 5001 SUBI R16,1
5B 4010 SBCI R17,0
5C E081 LDI R24,1
5D E090 LDI R25,0
5E 1780 CP R24,R16
5F 0791 CPC R25,R17
60 F3C8 BCS 0x005A
61 9508 RET
_busy:
temp --> R20
62 934A ST R20,-Y
(0011) }
(0012)
(0013) //查忙
(0014) void busy(void)
(0015) {
(0016) uchar temp;
(0017) PORTB&=~(1<<RS); //RS=0
63 98C5 CBI 0x18,5
(0018) s_ms(20);
64 E104 LDI R16,0x14
65 E010 LDI R17,0
66 DFF2 RCALL _s_ms
(0019) PORTB|=(1<<RW); //RW=1
67 9AC6 SBI 0x18,6
(0020) s_ms(20);
68 E104 LDI R16,0x14
69 E010 LDI R17,0
6A DFEE RCALL _s_ms
6B C01A RJMP 0x0086
(0021) while(temp)
(0022) {
(0023) PORTB|=(1<<EN); //EN=1
6C 9AC7 SBI 0x18,7
(0024) s_ms(20);
6D E104 LDI R16,0x14
6E E010 LDI R17,0
6F DFE9 RCALL _s_ms
(0025) DDRA=0x00; //A口變輸入
70 2422 CLR R2
71 BA2A OUT 0x1A,R2
(0026) PORTA=0xff; //上拉使能
72 EF8F LDI R24,0xFF
73 BB8B OUT 0x1B,R24
(0027) s_ms(20);
74 E104 LDI R16,0x14
75 E010 LDI R17,0
76 DFE2 RCALL _s_ms
(0028) temp = PINA&0x80; //讀取A口
77 B349 IN R20,0x19
78 7840 ANDI R20,0x80
(0029) s_ms(20);
79 E104 LDI R16,0x14
7A E010 LDI R17,0
7B DFDD RCALL _s_ms
(0030) DDRA=0xff;
7C EF8F LDI R24,0xFF
7D BB8A OUT 0x1A,R24
(0031) PORTA=0xff; //A口變輸出
7E BB8B OUT 0x1B,R24
(0032) s_ms(20);
7F E104 LDI R16,0x14
80 E010 LDI R17,0
81 DFD7 RCALL _s_ms
(0033) PORTB&=~(1<<EN); //EN=0
82 98C7 CBI 0x18,7
(0034) s_ms(20);
83 E104 LDI R16,0x14
84 E010 LDI R17,0
85 DFD3 RCALL _s_ms
86 2344 TST R20
87 F721 BNE 0x006C
88 9149 LD R20,Y+
89 9508 RET
_writecom:
com --> R10
8A 92AA ST R10,-Y
8B 2EA0 MOV R10,R16
(0035) }
(0036) }
(0037)
(0038) //寫指令
(0039) void writecom(uchar com)
(0040) {
(0041) busy();
8C DFD5 RCALL _busy
(0042) s_ms(20);
8D E104 LDI R16,0x14
8E E010 LDI R17,0
8F DFC9 RCALL _s_ms
(0043) PORTB&=~(1<<RS); //RS=0
90 98C5 CBI 0x18,5
(0044) s_ms(20);
91 E104 LDI R16,0x14
92 E010 LDI R17,0
93 DFC5 RCALL _s_ms
(0045) PORTB&=~(1<<RW); //RW=0
94 98C6 CBI 0x18,6
(0046) s_ms(20);
95 E104 LDI R16,0x14
96 E010 LDI R17,0
97 DFC1 RCALL _s_ms
(0047) PORTB|=(1<<EN); //EN=1
98 9AC7 SBI 0x18,7
(0048) s_ms(20);
99 E104 LDI R16,0x14
9A E010 LDI R17,0
9B DFBD RCALL _s_ms
(0049) PORTA = com; //輸出指令
9C BAAB OUT 0x1B,R10
(0050) s_ms(20);
9D E104 LDI R16,0x14
9E E010 LDI R17,0
9F DFB9 RCALL _s_ms
(0051) PORTB&=~(1<<EN); //EN=0
A0 98C7 CBI 0x18,7
(0052) s_ms(20);
A1 E104 LDI R16,0x14
A2 E010 LDI R17,0
A3 DFB5 RCALL _s_ms
A4 90A9 LD R10,Y+
A5 9508 RET
(0053) }
(0054)
(0055) //1602初始化
(0056) void LcdInit(void)
(0057) {
(0058) DDRA = 0xff;
_LcdInit:
A6 EF8F LDI R24,0xFF
A7 BB8A OUT 0x1A,R24
(0059) PORTA = 0x00;
A8 2422 CLR R2
A9 BA2B OUT 0x1B,R2
(0060) writecom(0x38);
AA E308 LDI R16,0x38
AB DFDE RCALL _writecom
(0061) s_ms(20);
AC E104 LDI R16,0x14
AD E010 LDI R17,0
AE DFAA RCALL _s_ms
(0062) writecom(0x01);
AF E001 LDI R16,1
B0 DFD9 RCALL _writecom
(0063) s_ms(1000);
B1 EE08 LDI R16,0xE8
B2 E013 LDI R17,3
B3 DFA5 RCALL _s_ms
(0064) s_ms(1000);
B4 EE08 LDI R16,0xE8
B5 E013 LDI R17,3
B6 DFA2 RCALL _s_ms
(0065) s_ms(1000);
B7 EE08 LDI R16,0xE8
B8 E013 LDI R17,3
B9 DF9F RCALL _s_ms
(0066) writecom(0x02);
BA E002 LDI R16,2
BB DFCE RCALL _writecom
(0067) s_ms(20);
BC E104 LDI R16,0x14
BD E010 LDI R17,0
BE DF9A RCALL _s_ms
(0068) writecom(0x06);
BF E006 LDI R16,6
C0 DFC9 RCALL _writecom
(0069) s_ms(20);
C1 E104 LDI R16,0x14
C2 E010 LDI R17,0
C3 DF95 RCALL _s_ms
(0070) writecom(0x0c);
C4 E00C LDI R16,0xC
C5 DFC4 RCALL _writecom
(0071) s_ms(20);
C6 E104 LDI R16,0x14
C7 E010 LDI R17,0
C8 DF90 RCALL _s_ms
(0072) writecom(0x38);
C9 E308 LDI R16,0x38
CA DFBF RCALL _writecom
(0073) s_ms(20);
CB E104 LDI R16,0x14
CC E010 LDI R17,0
CD DF8B RCALL _s_ms
CE 9508 RET
_writedata:
data --> R10
CF 92AA ST R10,-Y
D0 2EA0 MOV R10,R16
(0074) }
(0075)
(0076) //寫數據
(0077) void writedata(uchar data)
(0078) {
(0079) busy();
D1 DF90 RCALL _busy
(0080) s_ms(20);
D2 E104 LDI R16,0x14
D3 E010 LDI R17,0
D4 DF84 RCALL _s_ms
(0081) PORTB|=(1<<RS); //RS=1
D5 9AC5 SBI 0x18,5
(0082) s_ms(20);
D6 E104 LDI R16,0x14
D7 E010 LDI R17,0
D8 DF80 RCALL _s_ms
(0083) PORTB&=~(1<<RW); //RW=0
D9 98C6 CBI 0x18,6
(0084) s_ms(20);
DA E104 LDI R16,0x14
DB E010 LDI R17,0
DC DF7C RCALL _s_ms
(0085) PORTB|=(1<<EN); //EN=1
DD 9AC7 SBI 0x18,7
(0086) s_ms(20);
DE E104 LDI R16,0x14
DF E010 LDI R17,0
E0 DF78 RCALL _s_ms
(0087) PORTA = data; //輸出數據
E1 BAAB OUT 0x1B,R10
(0088) s_ms(20);
E2 E104 LDI R16,0x14
E3 E010 LDI R17,0
E4 DF74 RCALL _s_ms
(0089) PORTB&=~(1<<EN); //EN=0
E5 98C7 CBI 0x18,7
(0090) s_ms(20);
E6 E104 LDI R16,0x14
E7 E010 LDI R17,0
E8 DF70 RCALL _s_ms
E9 90A9 LD R10,Y+
EA 9508 RET
_readdata:
temp --> R10
EB 92AA ST R10,-Y
(0091) }
(0092)
(0093)
(0094) //讀數據
(0095) uchar readdata(void)
(0096) {
(0097) uchar temp;
(0098) busy();
EC DF75 RCALL _busy
(0099) s_ms(20);
ED E104 LDI R16,0x14
EE E010 LDI R17,0
EF DF69 RCALL _s_ms
(0100) PORTB|=(1<<RS); //RS=1
F0 9AC5 SBI 0x18,5
(0101) s_ms(20);
F1 E104 LDI R16,0x14
F2 E010 LDI R17,0
F3 DF65 RCALL _s_ms
(0102) PORTB|=(1<<RW); //RW=1
F4 9AC6 SBI 0x18,6
(0103) s_ms(20);
F5 E104 LDI R16,0x14
F6 E010 LDI R17,0
F7 DF61 RCALL _s_ms
(0104) PORTB|=(1<<EN); //EN=1
F8 9AC7 SBI 0x18,7
(0105) s_ms(20);
F9 E104 LDI R16,0x14
FA E010 LDI R17,0
FB DF5D RCALL _s_ms
(0106) DDRA=0x00; //A端口變輸入
FC 2422 CLR R2
FD BA2A OUT 0x1A,R2
(0107) s_ms(20);
FE E104 LDI R16,0x14
FF E010 LDI R17,0
100 DF58 RCALL _s_ms
(0108) temp = PINA; //讀A端口
101 B2A9 IN R10,0x19
(0109) s_ms(20);
102 E104 LDI R16,0x14
103 E010 LDI R17,0
104 DF54 RCALL _s_ms
(0110) DDRA=0xff; //A端口變輸出
105 EF8F LDI R24,0xFF
106 BB8A OUT 0x1A,R24
(0111) s_ms(20);
107 E104 LDI R16,0x14
108 E010 LDI R17,0
109 DF4F RCALL _s_ms
(0112) PORTB&=~(1<<EN); //EN=0
10A 98C7 CBI 0x18,7
(0113) s_ms(20);
10B E104 LDI R16,0x14
10C E010 LDI R17,0
10D DF4B RCALL _s_ms
(0114) return temp;
10E 2D0A MOV R16,R10
10F 90A9 LD R10,Y+
110 9508 RET
_WriteCGRAM:
t --> R10
i --> R20
pBuffer --> R22
num --> R10
111 940E 0418 CALL push_xgsetF00C
113 01B9 MOVW R22,R18
114 0158 MOVW R10,R16
(0115) }
(0116)
(0117) //=================================================
(0118) // 描述: 寫LCD內部CGRAM函數
(0119) // 入口: ‘num’要寫的數據個數
(0120) // ‘pbuffer’要寫的數據的首地址
(0121) // 出口: 無
(0122) //================================================
(0123) void WriteCGRAM(uint num, const uint *pBuffer)
(0124) {
(0125) uint i,t;
(0126) writecom(0x40);
115 E400 LDI R16,0x40
116 DF73 RCALL _writecom
(0127) PORTB|=(1<<RS);
117 9AC5 SBI 0x18,5
(0128) PORTB&=~(1<<RW);
118 98C6 CBI 0x18,6
(0129) for(i=num;i!=0;i--)
119 01A5 MOVW R20,R10
11A C00A RJMP 0x0125
(0130) {
(0131) t = *pBuffer;
11B 01FB MOVW R30,R22
11C 90A5 LPM R10,Z+
11D 90B4 LPM R11,10(Z)
(0132) PORTB|=(1<<EN);
11E 9AC7 SBI 0x18,7
(0133) PORTA = t;
11F BAAB OUT 0x1B,R10
(0134) PORTB&=~(1<<EN);
120 98C7 CBI 0x18,7
(0135) pBuffer++;
121 5F6E SUBI R22,0xFE
122 4F7F SBCI R23,0xFF
123 5041 SUBI R20,1
124 4050 SBCI R21,0
125 3040 CPI R20,0
126 0745 CPC R20,R21
127 F799 BNE 0x011B
128 940C 041F JMP pop_xgsetF00C
_WriteMenu:
t --> R10
i --> R22
pBuffer --> R20
12A 940E 0418 CALL push_xgsetF00C
12C 01A8 MOVW R20,R16
(0136) }
(0137)
(0138) }
(0139)
(0140) //=================================================
(0141) //描述:寫菜單函數,本程序使用的LCD規格為 16 * 2
(0142) //入口:菜單數組首地址
(0143) //出口:無
(0144) //=================================================
(0145) void WriteMenu(const uchar *pBuffer)
(0146) {
(0147) uchar i,t;
(0148) writecom(0x80); //數據地址
12D E800 LDI R16,0x80
12E DF5B RCALL _writecom
(0149)
(0150) PORTB|=(1<<RS);
12F 9AC5 SBI 0x18,5
(0151) PORTB&=~(1<<RW);
130 98C6 CBI 0x18,6
(0152) s_ms(20);
131 E104 LDI R16,0x14
132 E010 LDI R17,0
133 DF25 RCALL _s_ms
(0153) for(i=0;i<16;i++)
134 2766 CLR R22
135 C00B RJMP 0x0141
(0154) {
(0155) t = *pBuffer;
136 01FA MOVW R30,R20
137 90A4 LPM R10,11(Z)
(0156) PORTA = t;
138 BAAB OUT 0x1B,R10
(0157) PORTB|=(1<<EN);
139 9AC7 SBI 0x18,7
(0158) s_ms(20);
13A E104 LDI R16,0x14
13B E010 LDI R17,0
13C DF1C RCALL _s_ms
(0159) PORTB&=~(1<<EN);
13D 98C7 CBI 0x18,7
(0160) pBuffer++;
13E 5F4F SUBI R20,0xFF
13F 4F5F SBCI R21,0xFF
140 9563 INC R22
141 3160 CPI R22,0x10
142 F398 BCS 0x0136
(0161) }
(0162) writecom(0xC0);
143 EC00 LDI R16,0xC0
144 DF45 RCALL _writecom
(0163)
(0164) PORTB|=(1<<RS);
145 9AC5 SBI 0x18,5
(0165) PORTB&=~(1<<RW);
146 98C6 CBI 0x18,6
(0166) s_ms(20);
147 E104 LDI R16,0x14
148 E010 LDI R17,0
149 DF0F RCALL _s_ms
(0167) for(i=0;i<16;i++)
14A 2766 CLR R22
14B C00B RJMP 0x0157
(0168) {
(0169) t = *pBuffer;
14C 01FA MOVW R30,R20
14D 90A4 LPM R10,11(Z)
(0170) PORTA = t;
14E BAAB OUT 0x1B,R10
(0171) PORTB|=(1<<EN);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -