📄 testadc.lst
字号:
DE E380 LDI R24,0x30
DF 9380 006E STS LCD_COM,R24
(0130) Write_LCD_Com();//调用写指令子程序
E1 DFA1 RCALL _Write_LCD_Com
(0131) Delay(5);//39uS
E2 E005 LDI R16,5
E3 E010 LDI R17,0
E4 DF72 RCALL _Delay
(0132)
(0133) LCD_COM =0x0C;//显示打开,光标关,反白不显示
E5 E08C LDI R24,0xC
E6 9380 006E STS LCD_COM,R24
(0134) Write_LCD_Com();//调用写指令子程序
E8 DF9A RCALL _Write_LCD_Com
(0135) Delay(5);//39uS
E9 E005 LDI R16,5
EA E010 LDI R17,0
EB DF6B RCALL _Delay
(0136)
(0137) LCD_COM =0x01;//清除屏幕显示,将DDRAM的地址计数器归零
EC E081 LDI R24,1
ED 9380 006E STS LCD_COM,R24
(0138) Write_LCD_Com();//调用写指令子程序
EF DF93 RCALL _Write_LCD_Com
(0139) Delay(5);//39uS
F0 E005 LDI R16,5
F1 E010 LDI R17,0
F2 DF64 RCALL _Delay
(0140)
(0141) LCD_COM =0x06;//DDRAM的地址计数器(AC)加1
F3 E086 LDI R24,6
F4 9380 006E STS LCD_COM,R24
(0142) Write_LCD_Com();//调用写指令子程序
F6 DF8C RCALL _Write_LCD_Com
(0143) Delay(5);//39uS
F7 E005 LDI R16,5
F8 E010 LDI R17,0
F9 DF5D RCALL _Delay
(0144)
(0145) AC_X=1;AC_Y=1;
FA E081 LDI R24,1
FB 9380 006C STS AC_X,R24
FD 9380 006B STS AC_Y,R24
FF 9508 RET
_LCD_Contrl_Cursor:
ON --> R10
100 92AA ST R10,-Y
101 2EA0 MOV R10,R16
(0146) }
(0147)
(0148) void LCD_Contrl_Cursor(uchar ON) //打开游标显示
(0149) {
(0150) if (ON) LCD_COM =0x0F;else LCD_COM=0x0C; //ON:显示打开,光标开,反白显示
102 20AA TST R10
103 F021 BEQ 0x0108
104 E08F LDI R24,0xF
105 9380 006E STS LCD_COM,R24
107 C003 RJMP 0x010B
108 E08C LDI R24,0xC
109 9380 006E STS LCD_COM,R24
(0151) Write_LCD_Com();//调用写指令子程序
10B DF77 RCALL _Write_LCD_Com
(0152) Delay(5);//39uS
10C E005 LDI R16,5
10D E010 LDI R17,0
10E DF48 RCALL _Delay
10F 90A9 LD R10,Y+
110 9508 RET
_DispSetCursor:
y --> R12
x --> R10
111 92AA ST R10,-Y
112 92CA ST R12,-Y
113 2EC2 MOV R12,R18
114 2EA0 MOV R10,R16
(0153) }
(0154)
(0155) void DispSetCursor(uchar x,uchar y) //设置光标到指定位置
(0156) //x:串首字符在LCD屏幕上列的位置(水平位置) 0<=x<=7
(0157) //y:串首字符在LCD屏幕上行的位置(垂直位置) 0<=y<=3
(0158) {
(0159) LCD_COM=CharMap[y][x]; //查表得到DDRAM地址AC
115 E286 LDI R24,0x26
116 E090 LDI R25,0
117 2C2C MOV R2,R12
118 2433 CLR R3
119 0C22 LSL R2
11A 1C33 ROL R3
11B 0C22 LSL R2
11C 1C33 ROL R3
11D 0C22 LSL R2
11E 1C33 ROL R3
11F 0E28 ADD R2,R24
120 1E39 ADC R3,R25
121 2DEA MOV R30,R10
122 27FF CLR R31
123 0DE2 ADD R30,R2
124 1DF3 ADC R31,R3
125 9024 LPM R2,0(Z)
126 9220 006E STS LCD_COM,R2
(0160) Write_LCD_Com();
128 DF5A RCALL _Write_LCD_Com
129 90C9 LD R12,Y+
12A 90A9 LD R10,Y+
12B 9508 RET
_DispHalfWord:
HH --> Y,+1
LASC --> Y,+4
HASC --> Y,+2
y --> R12
x --> R10
12C 92AA ST R10,-Y
12D 92CA ST R12,-Y
12E 2EC2 MOV R12,R18
12F 2EA0 MOV R10,R16
(0161) }
(0162)
(0163) void DispHalfWord(uchar x,uchar y,uchar HASC,uchar LASC) //在指定位置处显示半角ASCII字符
(0164) {
(0165) unsigned int HH;
(0166) LCD_COM=CharMap[y][x]; //查表得到DDRAM地址AC
130 E286 LDI R24,0x26
131 E090 LDI R25,0
132 2C2C MOV R2,R12
133 2433 CLR R3
134 0C22 LSL R2
135 1C33 ROL R3
136 0C22 LSL R2
137 1C33 ROL R3
138 0C22 LSL R2
139 1C33 ROL R3
13A 0E28 ADD R2,R24
13B 1E39 ADC R3,R25
13C 2DEA MOV R30,R10
13D 27FF CLR R31
13E 0DE2 ADD R30,R2
13F 1DF3 ADC R31,R3
140 9024 LPM R2,0(Z)
141 9220 006E STS LCD_COM,R2
(0167) Write_LCD_Com();
143 DF3F RCALL _Write_LCD_Com
(0168)
(0169) LCD_DAT=HASC;
144 800A LDD R0,Y+2
145 9200 006D STS LCD_DAT,R0
(0170) Write_LCD_Data(); //显示ASCII字符
147 DF59 RCALL _Write_LCD_Data
(0171) LCD_DAT=LASC;
148 800C LDD R0,Y+4
149 9200 006D STS LCD_DAT,R0
(0172) Write_LCD_Data(); //显示ASCII字符
14B DF55 RCALL _Write_LCD_Data
14C 90C9 LD R12,Y+
14D 90A9 LD R10,Y+
14E 9508 RET
_PrintS:
Ty --> R10
Tx --> R20
i --> R22
str --> R12
y --> R20
x --> R14
14F D114 RCALL push_xgsetF0FC
150 2F42 MOV R20,R18
151 2EE0 MOV R14,R16
152 9723 SBIW R28,3
153 84CD LDD R12,Y+13
154 84DE LDD R13,Y+14
(0173) }
(0174)
(0175) //**************************************在指定位置处打印ASCII字符串**********************************
(0176) //x:串首字符在LCD屏幕上列的位置(水平位置) 0<=x<=7
(0177) //y:串首字符在LCD屏幕上行的位置(垂直位置) 0<=y<=3
(0178) //*str:存放ASCII字符串的指针
(0179) void PrintS(uchar x,uchar y,uchar *str) //在指定位置打印字符串
(0180) {
(0181) uchar i,Tx,Ty;
(0182) // EA=0;
(0183) Ty=y;Tx=x;
155 2EA4 MOV R10,R20
156 2D4E MOV R20,R14
(0184) for(i=0;str[i]!='\0';i=i+2)
157 2766 CLR R22
158 C015 RJMP 0x016E
(0185) {
(0186) DispHalfWord(Tx,Ty,str[i],str[i+1]);
159 2E26 MOV R2,R22
15A 2433 CLR R3
15B 0C2C ADD R2,R12
15C 1C3D ADC R3,R13
15D 01F1 MOVW R30,R2
15E 8021 LDD R2,Z+1
15F 822A STD Y+2,R2
160 8020 LDD R2,Z+0
161 8228 STD Y+0,R2
162 2D2A MOV R18,R10
163 2F04 MOV R16,R20
164 DFC7 RCALL _DispHalfWord
(0187) Tx++;
165 9543 INC R20
(0188) if (Tx>=8) { Ty=(Ty+1)&0x03;Tx=0; }
166 3048 CPI R20,0x8
167 F028 BCS 0x016D
168 2D8A MOV R24,R10
169 5F8F SUBI R24,0xFF
16A 7083 ANDI R24,3
16B 2EA8 MOV R10,R24
16C 2744 CLR R20
16D 5F6E SUBI R22,0xFE
16E 2FE6 MOV R30,R22
16F 27FF CLR R31
170 0DEC ADD R30,R12
171 1DFD ADC R31,R13
172 8020 LDD R2,Z+0
173 2022 TST R2
174 F721 BNE 0x0159
175 9623 ADIW R28,3
176 C0E2 RJMP pop_xgsetF0FC
_PrintSLen:
Ty --> R10
Tx --> R22
i --> R20
Len --> R12
str --> R14
y --> R22
x --> R20
177 D0EC RCALL push_xgsetF0FC
178 2F62 MOV R22,R18
179 2F40 MOV R20,R16
17A 9723 SBIW R28,3
17B 84ED LDD R14,Y+13
17C 84FE LDD R15,Y+14
17D 84CF LDD R12,Y+15
(0189) }
(0190) // EA=1;
(0191) }
(0192)
(0193)
(0194)
(0195) //**************************************在指定位置打印指定长度字符串**********************************
(0196) //x:串首字符在LCD屏幕上列的位置(水平位置) 0<=x<=7
(0197) //y:串首字符在LCD屏幕上行的位置(垂直位置) 0<=y<=3
(0198) //*str:存放ASCII字符串的指针
(0199) //Len:字符串的长度,字节为单位
(0200) void PrintSLen(uchar x,uchar y,uchar *str,uchar Len) //在指定位置打印字符串
(0201) {
(0202) uchar i,Tx,Ty;
(0203) Ty=y;Tx=x;
17E 2EA6 MOV R10,R22
17F 2F64 MOV R22,R20
(0204) for(i=0;i<Len;i=i+2)
180 2744 CLR R20
181 C025 RJMP 0x01A7
(0205) {
(0206) if((Len-i)==1) DispHalfWord(Tx,Ty,str[i],'\0'); else DispHalfWord(Tx,Ty,str[i],str[i+1]);
182 2D8C MOV R24,R12
183 1B84 SUB R24,R20
184 3081 CPI R24,1
185 F461 BNE 0x0192
186 2422 CLR R2
187 822A STD Y+2,R2
188 2FE4 MOV R30,R20
189 27FF CLR R31
18A 0DEE ADD R30,R14
18B 1DFF ADC R31,R15
18C 8020 LDD R2,Z+0
18D 8228 STD Y+0,R2
18E 2D2A MOV R18,R10
18F 2F06 MOV R16,R22
190 DF9B RCALL _DispHalfWord
191 C00C RJMP 0x019E
192 2E24 MOV R2,R20
193 2433 CLR R3
194 0C2E ADD R2,R14
195 1C3F ADC R3,R15
196 01F1 MOVW R30,R2
197 8021 LDD R2,Z+1
198 822A STD Y+2,R2
199 8020 LDD R2,Z+0
19A 8228 STD Y+0,R2
19B 2D2A MOV R18,R10
19C 2F06 MOV R16,R22
19D DF8E RCALL _DispHalfWord
(0207) Tx++;
19E 9563 INC R22
(0208) if (Tx>=8) { Ty=(Ty+1)&0x03;Tx=0; }
19F 3068 CPI R22,0x8
1A0 F028 BCS 0x01A6
1A1 2D8A MOV R24,R10
1A2 5F8F SUBI R24,0xFF
1A3 7083 ANDI R24,3
1A4 2EA8 MOV R10,R24
1A5 2766 CLR R22
1A6 5F4E SUBI R20,0xFE
1A7 154C CP R20,R12
1A8 F2C8 BCS 0x0182
1A9 9623 ADIW R28,3
1AA C0AE RJMP pop_xgsetF0FC
_DisplayNumChar:
srnum --> R12
tnnum --> R22
hunum --> R20
knnum --> R14
ll --> R22
h --> R10
l --> Y,+13
1AB D07C RCALL push_arg4
1AC D0B7 RCALL push_xgsetF0FC
1AD 2EA2 MOV R10,R18
1AE 9723 SBIW R28,3
1AF 8969 LDD R22,Y+17
1B0 897A LDD R23,Y+18
(0209) }
(0210) // EA=1;
(0211) }
(0212)
(0213)
(0214) void DisplayNumChar(unsigned char l,unsigned char h,unsigned int ll)
(0215) {
(0216) unsigned char knnum,hunum,tnnum,srnum; //百、十、个位
(0217) knnum=ll/1000;
1B1 EE28 LDI R18,0xE8
1B2 E033 LDI R19,3
1B3 018B MOVW R16,R22
1B4 D07A RCALL div16u
1B5 2EE0 MOV R14,R16
(0218) hunum=ll/100-10*knnum; //百位
1B6 E08A LDI R24,0xA
1B7 9D8E MUL R24,R14
1B8 0110 MOVW R2,R0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -