📄 ad_lcd.lst
字号:
__text_start:
__start:
0038 E5CF LDI R28,0x5F
0039 E0D4 LDI R29,4
003A BFCD OUT 0x3D,R28
003B BFDE OUT 0x3E,R29
003C 51C0 SUBI R28,0x10
003D 40D0 SBCI R29,0
003E EA0A LDI R16,0xAA
003F 8308 STD Y+0,R16
0040 2400 CLR R0
0041 E7E7 LDI R30,0x77
0042 E0F0 LDI R31,0
0043 E010 LDI R17,0
0044 37EF CPI R30,0x7F
0045 07F1 CPC R31,R17
0046 F011 BEQ 0x0049
0047 9201 ST R0,Z+
0048 CFFB RJMP 0x0044
0049 8300 STD Z+0,R16
004A E5E8 LDI R30,0x58
004B E0F0 LDI R31,0
004C E6A0 LDI R26,0x60
004D E0B0 LDI R27,0
004E E010 LDI R17,0
004F 36EF CPI R30,0x6F
0050 07F1 CPC R31,R17
0051 F021 BEQ 0x0056
0052 95C8 LPM
0053 9631 ADIW R30,1
0054 920D ST R0,X+
0055 CFF9 RJMP 0x004F
0056 940E00C2 CALL _main
_exit:
0058 CFFF RJMP _exit
_adctoasc:
char_p --> R10
i --> R12
temp --> R14
adc --> R10
0059 940E0206 CALL push_gset5
005B 0158 MOVW R10,R16
FILE: ad_lcd.c
(0001) /******************************************************
(0002) 双龙电子公司http://www.sl.com.cn
(0003) AT90S8535--AD转换演示程序(ICCAVR)
(0004) 作者:詹卫前
(0005) 使用注意:1、应包含头文件slavr.h
(0006) 2、在工程选项中的Additional Lib中填入slavr
(0007) 使用编译器使用附加库文件libslavr.a
(0008) 3、使用SL-AVRAD实验设备
(0009) 接线说明:1、PA.0(PIN40)处接电平指示LED的短路块断开
(0010) 2、A/D和VX之间的短路块闭合
(0011) 3、AREF(PIN32)和AVCC(PIN30)接VCC
(0012) 4、AGND(PIN31)接GND
(0013) *******************************************************/
(0014) #include<iom16v.h>
(0015) #include<slavr.h>
(0016) #include<macros.h>
(0017) unsigned int ad_con;//存放PA0的AD转换结果
(0018) unsigned char adcval[6];//存放电压ASCII码
(0019) /* 将AD结果转换成电压 */
(0020) #define vref 497
(0021) unsigned char * adctoasc(unsigned int adc)
(0022) {
(0023) unsigned int temp;
(0024) unsigned char i;
(0025) unsigned char *char_p;
(0026) temp=(unsigned int)(((unsigned long)((unsigned long)adc*vref))/1024);
005C 0115 MOVW R2,R10
005D 2444 CLR R4
005E 2455 CLR R5
005F EF41 LDI R20,0xF1
0060 E051 LDI R21,1
0061 E060 LDI R22,0
0062 E070 LDI R23,0
0063 925A ST R5,-Y
0064 924A ST R4,-Y
0065 923A ST R3,-Y
0066 922A ST R2,-Y
0067 018A MOVW R16,R20
0068 019B MOVW R18,R22
0069 940E01CC CALL empy32u
006B E08A LDI R24,0xA
006C E090 LDI R25,0
006D 938A ST R24,-Y
006E 940E024A CALL lsr32
0070 0178 MOVW R14,R16
(0027) for(i=0;i<3;i++)
0071 24CC CLR R12
0072 C019 RJMP 0x008C
(0028) {
(0029) adcval[3-i]=temp%10+0x30;
0073 2C2C MOV R2,R12
0074 2433 CLR R3
0075 E0E3 LDI R30,3
0076 E0F0 LDI R31,0
0077 19E2 SUB R30,R2
0078 09F3 SBC R31,R3
0079 E787 LDI R24,0x77
007A E090 LDI R25,0
007B 0FE8 ADD R30,R24
007C 1FF9 ADC R31,R25
007D E02A LDI R18,0xA
007E E030 LDI R19,0
007F 0187 MOVW R16,R14
0080 940E01B0 CALL mod16u
0082 01C8 MOVW R24,R16
0083 96C0 ADIW R24,0x30
0084 8380 STD Z+0,R24
(0030) temp=temp/10;
0085 E02A LDI R18,0xA
0086 E030 LDI R19,0
0087 0187 MOVW R16,R14
0088 940E01B2 CALL div16u
008A 0178 MOVW R14,R16
008B 94C3 INC R12
008C 2D8C MOV R24,R12
008D 3083 CPI R24,3
008E F320 BCS 0x0073
(0031) }
(0032) adcval[0]=adcval[1];
008F 90200078 LDS R2,adcval+1
0091 92200077 STS adcval,R2
(0033) adcval[1]='.';
0093 E28E LDI R24,0x2E
0094 93800078 STS adcval+1,R24
(0034) adcval[4]='V';
0096 E586 LDI R24,0x56
0097 9380007B STS 0x7B,R24
(0035) adcval[5]=0;
0099 2422 CLR R2
009A 9220007C STS 0x7C,R2
(0036) char_p=adcval;
009C E787 LDI R24,0x77
009D E090 LDI R25,0
009E 015C MOVW R10,R24
(0037) return char_p;
009F 018C MOVW R16,R24
00A0 940E0203 CALL pop_gset5
00A2 9508 RET
_adc_isr:
temp --> R16
00A3 922A ST R2,-Y
00A4 923A ST R3,-Y
00A5 930A ST R16,-Y
00A6 931A ST R17,-Y
00A7 93EA ST R30,-Y
00A8 B62F IN R2,0x3F
00A9 922A ST R2,-Y
(0038) }
(0039) /* AD转换程序 */
(0040) #pragma interrupt_handler adc_isr:15
(0041) void adc_isr(void)
(0042) {
(0043) unsigned int temp=0;
00AA 2700 CLR R16
00AB 2711 CLR R17
00AC C002 RJMP 0x00AF
(0044) while(temp<6)
(0045) temp++;
00AD 5F0F SUBI R16,0xFF
00AE 4F1F SBCI R17,0xFF
00AF 3006 CPI R16,6
00B0 E0E0 LDI R30,0
00B1 071E CPC R17,R30
00B2 F3D0 BCS 0x00AD
(0046) ad_con=ADC;
00B3 B024 IN R2,0x04
00B4 B035 IN R3,0x05
00B5 9230007E STS ad_con+1,R3
00B7 9220007D STS ad_con,R2
(0047) ADCSR|=(1<<ADSC);//启动转换
00B9 9A36 SBI 0x06,6
00BA 9029 LD R2,Y+
00BB BE2F OUT 0x3F,R2
00BC 91E9 LD R30,Y+
00BD 9119 LD R17,Y+
00BE 9109 LD R16,Y+
00BF 9039 LD R3,Y+
00C0 9029 LD R2,Y+
00C1 9518 RETI
(0048) }
(0049) //将AD转换结果转换成电压数值,然后在LCD上显示
(0050) void main(void)
(0051) {
(0052) MCUCR=0;
_main:
00C2 2422 CLR R2
00C3 BE25 OUT 0x35,R2
(0053) ADMUX=0x00;//0通道
00C4 B827 OUT 0x07,R2
(0054) ADCSR=(1<<ADEN)|(1<<ADSC)|(1<<ADIF)|(1<<ADIE)|0x06;
00C5 ED8E LDI R24,0xDE
00C6 B986 OUT 0x06,R24
(0055) lcd_init();
00C7 940E015E CALL _lcd_init
(0056) SEI();
00C9 9478 BSET 7
00CA C021 RJMP 0x00EC
(0057) while(1)
(0058) {
(0059) lcd_gotoxy(2,0);
00CB 2722 CLR R18
00CC E002 LDI R16,2
00CD 940E00EE CALL _lcd_gotoxy
(0060) lcd_puts("AD--Converter");
00CF E609 LDI R16,0x69
00D0 E010 LDI R17,0
00D1 940E0196 CALL _lcd_puts
(0061) lcd_gotoxy(2,1);
00D3 E021 LDI R18,1
00D4 E002 LDI R16,2
00D5 940E00EE CALL _lcd_gotoxy
(0062) lcd_puts("Voltage:");
00D7 E600 LDI R16,0x60
00D8 E010 LDI R17,0
00D9 940E0196 CALL _lcd_puts
(0063) lcd_gotoxy(10,1);
00DB E021 LDI R18,1
00DC E00A LDI R16,0xA
00DD 940E00EE CALL _lcd_gotoxy
(0064) lcd_puts(adctoasc(ad_con));
00DF 9100007D LDS R16,ad_con
00E1 9110007E LDS R17,ad_con+1
00E3 DF75 RCALL _adctoasc
00E4 940E0196 CALL _lcd_puts
(0065) delay_ms(500);
00E6 EF04 LDI R16,0xF4
00E7 E011 LDI R17,1
00E8 940E0109 CALL _delay_ms
(0066) lcd_clear();
FILE: <library>
00EA 940E01AA CALL _lcd_clear
00EC CFDE RJMP 0x00CB
00ED 9508 RET
_lcd_gotoxy:
00EE D11D RCALL push_gset2
00EF 2F42 MOV R20,R18
00F0 2F60 MOV R22,R16
00F1 3041 CPI R20,1
00F2 F419 BNE 0x00F6
00F3 2F46 MOV R20,R22
00F4 5440 SUBI R20,0x40
00F5 C002 RJMP 0x00F8
00F6 2F46 MOV R20,R22
00F7 5840 SUBI R20,0x80
00F8 2722 CLR R18
00F9 2733 CLR R19
00FA 2F04 MOV R16,R20
00FB 2711 CLR R17
00FC D02B RCALL _write_lcd
00FD D102 RCALL pop_gset2
00FE 9508 RET
_delay_1ms:
00FF E001 LDI R16,1
0100 E010 LDI R17,0
0101 C002 RJMP 0x0104
0102 5F0F SUBI R16,0xFF
0103 4F1F SBCI R17,0xFF
0104 3706 CPI R16,0x76
0105 E0E4 LDI R30,4
0106 071E CPC R17,R30
0107 F3D0 BCS 0x0102
0108 9508 RET
_delay_ms:
0109 D102 RCALL push_gset2
010A 2F60 MOV R22,R16
010B 2F71 MOV R23,R17
010C 2744 CLR R20
010D 2755 CLR R21
010E C003 RJMP 0x0112
010F DFEF RCALL _delay_1ms
0110 5F4F SUBI R20,0xFF
0111 4F5F SBCI R21,0xFF
0112 1746 CP R20,R22
0113 0757 CPC R21,R23
0114 F3D0 BCS 0x010F
0115 D0EA RCALL pop_gset2
0116 9508 RET
_lcd_port_init:
0117 2422 CLR R2
0118 BA27 OUT 0x17,R2
0119 BA28 OUT 0x18,R2
011A EF8F LDI R24,0xFF
011B BB81 OUT 0x11,R24
011C BB82 OUT 0x12,R24
011D 9508 RET
_delay:
011E 2700 CLR R16
011F 2711 CLR R17
0120 C002 RJMP 0x0123
0121 5F0F SUBI R16,0xFF
0122 4F1F SBCI R17,0xFF
0123 310E CPI R16,0x1E
0124 E0E0 LDI R30,0
0125 071E CPC R17,R30
0126 F3D0 BCS 0x0121
0127 9508 RET
_write_lcd:
0128 D0E3 RCALL push_gset2
0129 2F62 MOV R22,R18
012A 2F40 MOV R20,R16
012B 2422 CLR R2
012C BA27 OUT 0x17,R2
012D BA28 OUT 0x18,R2
012E 9893 CBI 0x12,3
012F 9A94 SBI 0x12,4
0130 9A95 SBI 0x12,5
0131 DFEC RCALL _delay
0132 B386 IN R24,0x16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -