📄 ad.lst
字号:
0122 2842 OR R4,R2
0123 2853 OR R5,R3
0124 92500061 STS value+1,R5
0126 92400060 STS value,R4
0128 9029 LD R2,Y+
0129 BE2F OUT 0x3F,R2
012A 9059 LD R5,Y+
012B 9049 LD R4,Y+
012C 9039 LD R3,Y+
012D 9029 LD R2,Y+
012E 9518 RETI
_Bit_display:
Y --> R22
X --> R20
012F 940E0308 CALL push_gset2
0131 2F62 MOV R22,R18
0132 2F40 MOV R20,R16
0133 9721 SBIW R28,1
(0033) }
(0034)
(0035)
(0036) void Bit_display(unsigned char X,unsigned char Y) //位显示函数,将对转换结果的数字量进行“0”或“1”的显示
(0037) {
(0038)
(0039) if(Y)
0134 2366 TST R22
0135 F039 BEQ 0x013D
(0040) LCD_write_char(X,0,'1'); //如果转换结果变量的某一位为“1”,则显示,否则显示“0”
0136 E381 LDI R24,0x31
0137 8388 STD Y+0,R24
0138 2722 CLR R18
0139 2F04 MOV R16,R20
013A 940E00F1 CALL _LCD_write_char
013C C006 RJMP 0x0143
(0041) else
(0042) LCD_write_char(X,0,'0');
013D E380 LDI R24,0x30
013E 8388 STD Y+0,R24
013F 2722 CLR R18
0140 2F04 MOV R16,R20
0141 940E00F1 CALL _LCD_write_char
0143 9621 ADIW R28,1
0144 940E02F9 CALL pop_gset2
0146 9508 RET
_Bit_transfor:
pos --> R20
i --> R22
bits --> R10
datas --> R12
0147 940E0304 CALL push_gset4
(0043) }
(0044)
(0045) void Bit_transfor(void) //对12位数字量的量化和显示函数
(0046) {
(0047) unsigned int datas;
(0048) unsigned int bits=0x0001; //位屏蔽变量,通过移位处理,将得出数字量的每一位值(0或1)
0149 E081 LDI R24,1
014A E090 LDI R25,0
014B 015C MOVW R10,R24
(0049) unsigned char i,pos=10; //显示位置变量,通过循环处理将依次将数字量的每一位显示在LCD上
014C E04A LDI R20,0xA
(0050) init_lcd();
014D 940E00FD CALL _init_lcd
(0051) datas =(value&bits); //最低位独立处理
014F 90C00060 LDS R12,value
0151 90D00061 LDS R13,value+1
0153 20CA AND R12,R10
0154 20DB AND R13,R11
(0052) Bit_display(11,datas);
0155 2D2C MOV R18,R12
0156 E00B LDI R16,0xB
0157 DFD7 RCALL _Bit_display
(0053) bits = bits<<1;
0158 0CAA LSL R10
0159 1CBB ROL R11
(0054) for(i=0;i<=10;i++) //高11位在循环中处理
015A 2766 CLR R22
015B C015 RJMP 0x0171
(0055) {
(0056) datas =(value&bits); //位屏蔽操作
015C 90C00060 LDS R12,value
015E 90D00061 LDS R13,value+1
0160 20CA AND R12,R10
0161 20DB AND R13,R11
(0057) datas = datas>>(i+1);
0162 2F26 MOV R18,R22
0163 2733 CLR R19
0164 5F2F SUBI R18,0xFF
0165 4F3F SBCI R19,0xFF
0166 0186 MOVW R16,R12
0167 940E033E CALL lsr16
0169 0168 MOVW R12,R16
(0058) Bit_display(pos,datas); //位显示操作
016A 2D2C MOV R18,R12
016B 2F04 MOV R16,R20
016C DFC2 RCALL _Bit_display
(0059) bits = bits<<1;
016D 0CAA LSL R10
016E 1CBB ROL R11
(0060) pos--;
016F 954A DEC R20
0170 9563 INC R22
0171 E08A LDI R24,0xA
0172 1786 CP R24,R22
0173 F740 BCC 0x015C
0174 940E02FF CALL pop_gset4
0176 9508 RET
_Analog_display:
data --> R22
X --> R20
0177 940E0308 CALL push_gset2
0179 2F62 MOV R22,R18
017A 2F40 MOV R20,R16
017B 9721 SBIW R28,1
(0061) }
(0062) }
(0063)
(0064)
(0065)
(0066) void Analog_display(unsigned char X,unsigned char data) //对输入模拟量的显示
(0067) {
(0068) switch(data)
017C 2777 CLR R23
017D 3060 CPI R22,0
017E 0767 CPC R22,R23
017F F409 BNE 0x0181
0180 C02E RJMP 0x01AF
0181 3061 CPI R22,1
0182 E0E0 LDI R30,0
0183 077E CPC R23,R30
0184 F409 BNE 0x0186
0185 C030 RJMP 0x01B6
0186 3062 CPI R22,2
0187 E0E0 LDI R30,0
0188 077E CPC R23,R30
0189 F409 BNE 0x018B
018A C032 RJMP 0x01BD
018B 3063 CPI R22,3
018C E0E0 LDI R30,0
018D 077E CPC R23,R30
018E F409 BNE 0x0190
018F C034 RJMP 0x01C4
0190 3064 CPI R22,4
0191 E0E0 LDI R30,0
0192 077E CPC R23,R30
0193 F409 BNE 0x0195
0194 C036 RJMP 0x01CB
0195 3065 CPI R22,5
0196 E0E0 LDI R30,0
0197 077E CPC R23,R30
0198 F409 BNE 0x019A
0199 C038 RJMP 0x01D2
019A 3066 CPI R22,6
019B E0E0 LDI R30,0
019C 077E CPC R23,R30
019D F409 BNE 0x019F
019E C03A RJMP 0x01D9
019F 3067 CPI R22,7
01A0 E0E0 LDI R30,0
01A1 077E CPC R23,R30
01A2 F409 BNE 0x01A4
01A3 C03C RJMP 0x01E0
01A4 3068 CPI R22,0x8
01A5 E0E0 LDI R30,0
01A6 077E CPC R23,R30
01A7 F409 BNE 0x01A9
01A8 C03E RJMP 0x01E7
01A9 3069 CPI R22,0x9
01AA E0E0 LDI R30,0
01AB 077E CPC R23,R30
01AC F409 BNE 0x01AE
01AD C040 RJMP 0x01EE
01AE C045 RJMP 0x01F4
(0069) {
(0070) case 0:LCD_write_char( X, 1, '0'); break;
01AF E380 LDI R24,0x30
01B0 8388 STD Y+0,R24
01B1 E021 LDI R18,1
01B2 2F04 MOV R16,R20
01B3 940E00F1 CALL _LCD_write_char
01B5 C03E RJMP 0x01F4
(0071) case 1:LCD_write_char( X, 1, '1'); break;
01B6 E381 LDI R24,0x31
01B7 8388 STD Y+0,R24
01B8 E021 LDI R18,1
01B9 2F04 MOV R16,R20
01BA 940E00F1 CALL _LCD_write_char
01BC C037 RJMP 0x01F4
(0072) case 2:LCD_write_char( X, 1, '2'); break;
01BD E382 LDI R24,0x32
01BE 8388 STD Y+0,R24
01BF E021 LDI R18,1
01C0 2F04 MOV R16,R20
01C1 940E00F1 CALL _LCD_write_char
01C3 C030 RJMP 0x01F4
(0073) case 3:LCD_write_char( X, 1, '3'); break;
01C4 E383 LDI R24,0x33
01C5 8388 STD Y+0,R24
01C6 E021 LDI R18,1
01C7 2F04 MOV R16,R20
01C8 940E00F1 CALL _LCD_write_char
01CA C029 RJMP 0x01F4
(0074) case 4:LCD_write_char( X, 1, '4'); break;
01CB E384 LDI R24,0x34
01CC 8388 STD Y+0,R24
01CD E021 LDI R18,1
01CE 2F04 MOV R16,R20
01CF 940E00F1 CALL _LCD_write_char
01D1 C022 RJMP 0x01F4
(0075) case 5:LCD_write_char( X, 1, '5'); break;
01D2 E385 LDI R24,0x35
01D3 8388 STD Y+0,R24
01D4 E021 LDI R18,1
01D5 2F04 MOV R16,R20
01D6 940E00F1 CALL _LCD_write_char
01D8 C01B RJMP 0x01F4
(0076) case 6:LCD_write_char( X, 1, '6'); break;
01D9 E386 LDI R24,0x36
01DA 8388 STD Y+0,R24
01DB E021 LDI R18,1
01DC 2F04 MOV R16,R20
01DD 940E00F1 CALL _LCD_write_char
01DF C014 RJMP 0x01F4
(0077) case 7:LCD_write_char( X, 1, '7'); break;
01E0 E387 LDI R24,0x37
01E1 8388 STD Y+0,R24
01E2 E021 LDI R18,1
01E3 2F04 MOV R16,R20
01E4 940E00F1 CALL _LCD_write_char
01E6 C00D RJMP 0x01F4
(0078) case 8:LCD_write_char( X, 1, '8'); break;
01E7 E388 LDI R24,0x38
01E8 8388 STD Y+0,R24
01E9 E021 LDI R18,1
01EA 2F04 MOV R16,R20
01EB 940E00F1 CALL _LCD_write_char
01ED C006 RJMP 0x01F4
(0079) case 9:LCD_write_char( X, 1, '9'); break;
01EE E389 LDI R24,0x39
01EF 8388 STD Y+0,R24
01F0 E021 LDI R18,1
01F1 2F04 MOV R16,R20
01F2 940E00F1 CALL _LCD_write_char
01F4 9621 ADIW R28,1
01F5 940E02F9 CALL pop_gset2
01F7 9508 RET
_Analog_transfor:
x5 --> R20
x4 --> R22
x3 --> R22
x2 --> R22
x1 --> R22
value2 --> R20
result --> R20
01F8 940E0308 CALL push_gset2
01FA 9725 SBIW R28,5
(0080) }
(0081) }
(0082)
(0083)
(0084) void Analog_transfor(void) //在液晶的第二行显示对应的输入模拟电压值
(0085) {
(0086) uint value2;
(0087) uint result;
(0088) uint x1,x2,x3,x4,x5;
(0089) value2 = value; //由于选择的转化方式为右对齐,因此在此处
01FB 91400060 LDS R20,value
01FD 91500061 LDS R21,value+1
(0090) //需要右移2位以取得准确的数字量。
(0091) result=(value2*2.56/1024)*10000; //以下为数字处理部分,可作为AD转换的通用处理模块
01FF E604 LDI R16,0x64
0200 E010 LDI R17,0
0201 940E032A CALL lpm32
0203 933A ST R19,-Y
0204 932A ST R18,-Y
0205 931A ST R17,-Y
0206 930A ST R16,-Y
0207 E600 LDI R16,0x60
0208 E010 LDI R17,0
0209 940E032A CALL lpm32
020B 933A ST R19,-Y
020C 932A ST R18,-Y
020D 931A ST R17,-Y
020E 930A ST R16,-Y
020F E50C LDI R16,0x5C
0210 E010 LDI R17,0
0211 940E032A CALL lpm32
0213 933A ST R19,-Y
0214 932A ST R18,-Y
0215 931A ST R17,-Y
0216 930A ST R16,-Y
0217 018A MOVW R16,R20
0218 9516 LSR R17
0219 9507 ROR R16
021A 940E038D CALL int2fp
021C 933A ST R19,-Y
021D 932A ST R18,-Y
021E 931A ST R17,-Y
021F 930A ST R16,-Y
0220 940E04D6 CALL empy32fs
0222 018A MOVW R16,R20
0223 7001 ANDI R16,1
0224 7010 ANDI R17,0
0225 940E038D CALL int2fp
0227 933A ST R19,-Y
0228 932A ST R18,-Y
0229 931A ST R17,-Y
022A 930A ST R16,-Y
022B 940E03E7 CALL add32fs
022D 940E04D6 CALL empy32fs
022F E508 LDI R16,0x58
0230 E010 LDI R17,0
0231 940E032A CALL lpm32
0233 933A ST R19,-Y
0234 932A ST R18,-Y
0235 931A ST R17,-Y
0236 930A ST R16,-Y
0237 940E0448 CALL div32fs
0239 940E04D9 CALL empy32f
023B 01FE MOVW R30,R28
023C 8301 STD Z+1,R16
023D 8312 STD Z+2,R17
023E 8323 STD Z+3,R18
023F 8334 STD Z+4,R19
0240 01FE MOVW R30,R28
0241 8021 LDD R2,Z+1
0242 8032 LDD R3,Z+2
0243 8043 LDD R4,Z+3
0244 8054 LDD R5,Z+4
0245 925A ST R5,-Y
0246 924A ST R4,-Y
0247 923A ST R3,-Y
0248 922A ST R2,-Y
0249 E504 LDI R16,0x54
024A E010 LDI R17,0
024B 940E032A CALL lpm32
024D 933A ST R19,-Y
024E 932A ST R18,-Y
024F 931A ST R17,-Y
0250 930A ST R16,-Y
0251 940E04A5 CALL cmp32f
0253 F0CC BLT 0x026D
0254 01FE MOVW R30,R28
0255 8021 LDD R2,Z+1
0256 8032 LDD R3,Z+2
0257 8043 LDD R4,Z+3
0258 8054 LDD R5,Z+4
0259 925A ST R5,-Y
025A 924A ST R4,-Y
025B 923A ST R3,-Y
025C 922A ST R2,-Y
025D E504 LDI R16,0x54
025E E010 LDI R17,0
025F 940E032A CALL lpm32
0261 933A ST R19,-Y
0262 932A ST R18,-Y
0263 931A ST R17,-Y
0264 930A ST R16,-Y
0265 940E03F2 CALL sub32f
0267 940E0345 CALL fp2int
0269 01B8 MOVW R22,R16
026A 5060 SUBI R22,0
026B 4870 SBCI R23,0x80
026C C008 RJMP 0x0275
026D 01FE MOVW R30,R28
026E 8101 LDD R16,Z+1
026F 8112 LDD R17,Z+2
0270 8123 LDD R18,Z+3
0271 8134 LDD R19,Z+4
0272 940E0345 CALL fp2int
0274 01B8 MOVW R22,R16
0275 01AB MOVW R20,R22
(0092)
(0093) x1=result/10000; Analog_display(0,x1);
0276 E120 LDI R18,0x10
0277 E237 LDI R19,0x27
0278 018A MOVW R16,R20
0279 940E02DF CALL div16u
027B 01B8 MOVW R22,R16
027C 2F26 MOV R18,R22
027D 2700 CLR R16
027E DEF8 RCALL _Analog_display
(0094) LCD_write_char(1,1,'.');
027F E28E LDI R24,0x2E
0280 8388 STD Y+0,R24
0281 E021 LDI R18,1
0282 E001 LDI R16,1
0283 940E00F1 CALL _LCD_write_char
(0095) x2=(result/1000)%10; Analog_display(2,x2);
0285 EE28 LDI R18,0xE8
0286 E033 LDI R19,3
0287 018A MOVW R16,R20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -