📄 lcd+ad.lst
字号:
__start:
__text_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 940E0231 CALL push_gset5x
005B 0158 MOVW R10,R16
FILE: F:\李鹏飞\sl-avrad-m16\LCD+AD\LCD+AD.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 EF81 LDI R24,0xF1
0060 E091 LDI R25,1
0061 E0A0 LDI R26,0
0062 E0B0 LDI R27,0
0063 925A ST R5,-Y
0064 924A ST R4,-Y
0065 923A ST R3,-Y
0066 922A ST R2,-Y
0067 018C MOVW R16,R24
0068 019D MOVW R18,R26
0069 940E01CD CALL empy32u
006B E08A LDI R24,0xA
006C E090 LDI R25,0
006D 938A ST R24,-Y
006E 940E025A 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 940E01B1 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 940E01B3 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 940E020C CALL pop_gset5x
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)
(0048) ADCSRA|=(1<<ADSC);//启动转换
00B9 9A36 SBI 0x06,6
(0049) }
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
(0050) //将AD转换结果转换成电压数值,然后在LCD上显示
(0051) void main(void)
(0052) {
(0053) MCUCR=0;
_main:
00C2 2422 CLR R2
00C3 BE25 OUT 0x35,R2
(0054) ADMUX=0x01;//0通道
00C4 E081 LDI R24,1
00C5 B987 OUT 0x07,R24
(0055) ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIF)|(1<<ADIE)|0x06;
00C6 ED8E LDI R24,0xDE
00C7 B986 OUT 0x06,R24
(0056) lcd_init();
00C8 940E015F CALL _lcd_init
(0057) SEI();
00CA 9478 BSET 7
00CB C021 RJMP 0x00ED
(0058) while(1)
(0059) {
(0060) lcd_gotoxy(2,0);
00CC 2722 CLR R18
00CD E002 LDI R16,2
00CE 940E00EF CALL _lcd_gotoxy
(0061) lcd_puts("AD--Converter");
00D0 E609 LDI R16,0x69
00D1 E010 LDI R17,0
00D2 940E0197 CALL _lcd_puts
(0062) lcd_gotoxy(2,1);
00D4 E021 LDI R18,1
00D5 E002 LDI R16,2
00D6 940E00EF CALL _lcd_gotoxy
(0063) lcd_puts("Voltage:");
00D8 E600 LDI R16,0x60
00D9 E010 LDI R17,0
00DA 940E0197 CALL _lcd_puts
(0064) lcd_gotoxy(10,1);
00DC E021 LDI R18,1
00DD E00A LDI R16,0xA
00DE 940E00EF CALL _lcd_gotoxy
(0065) lcd_puts(adctoasc(ad_con));
00E0 9100007D LDS R16,_ad_con
00E2 9110007E LDS R17,_ad_con+1
00E4 DF74 RCALL _adctoasc
00E5 940E0197 CALL _lcd_puts
(0066) delay_ms(500);
00E7 EF04 LDI R16,0xF4
00E8 E011 LDI R17,1
00E9 940E010A CALL _delay_ms
(0067) lcd_clear();
00EB 940E01AB CALL _lcd_clear
00ED CFDE RJMP 0x00CC
(0068) }
(0069) }
FILE: <library>
00EE 9508 RET
_lcd_gotoxy:
00EF D136 RCALL push_gset2
00F0 2F42 MOV R20,R18
00F1 2F60 MOV R22,R16
00F2 3041 CPI R20,1
00F3 F419 BNE 0x00F7
00F4 2F46 MOV R20,R22
00F5 5440 SUBI R20,0x40
00F6 C002 RJMP 0x00F9
00F7 2F46 MOV R20,R22
00F8 5840 SUBI R20,0x80
00F9 2722 CLR R18
00FA 2733 CLR R19
00FB 2F04 MOV R16,R20
00FC 2711 CLR R17
00FD D02B RCALL _write_lcd
00FE D0FE RCALL pop_gset2
00FF 9508 RET
_delay_1ms:
0100 E001 LDI R16,1
0101 E010 LDI R17,0
0102 C002 RJMP 0x0105
0103 5F0F SUBI R16,0xFF
0104 4F1F SBCI R17,0xFF
0105 3706 CPI R16,0x76
0106 E0E4 LDI R30,4
0107 071E CPC R17,R30
0108 F3D0 BCS 0x0103
0109 9508 RET
_delay_ms:
010A D11B RCALL push_gset2
010B 2F60 MOV R22,R16
010C 2F71 MOV R23,R17
010D 2744 CLR R20
010E 2755 CLR R21
010F C003 RJMP 0x0113
0110 DFEF RCALL _delay_1ms
0111 5F4F SUBI R20,0xFF
0112 4F5F SBCI R21,0xFF
0113 1746 CP R20,R22
0114 0757 CPC R21,R23
0115 F3D0 BCS 0x0110
0116 D0E6 RCALL pop_gset2
0117 9508 RET
_lcd_port_init:
0118 2422 CLR R2
0119 BA27 OUT 0x17,R2
011A BA28 OUT 0x18,R2
011B EF8F LDI R24,0xFF
011C BB81 OUT 0x11,R24
011D BB82 OUT 0x12,R24
011E 9508 RET
_delay:
011F 2700 CLR R16
0120 2711 CLR R17
0121 C002 RJMP 0x0124
0122 5F0F SUBI R16,0xFF
0123 4F1F SBCI R17,0xFF
0124 310E CPI R16,0x1E
0125 E0E0 LDI R30,0
0126 071E CPC R17,R30
0127 F3D0 BCS 0x0122
0128 9508 RET
_write_lcd:
0129 D0FC RCALL push_gset2
012A 2F62 MOV R22,R18
012B 2F40 MOV R20,R16
012C 2422 CLR R2
012D BA27 OUT 0x17,R2
012E BA28 OUT 0x18,R2
012F 9893 CBI 0x12,3
0130 9A94 SBI 0x12,4
0131 9A95 SBI 0x12,5
0132 DFEC RCALL _delay
0133 B386 IN R24,0x16
0134 7880 ANDI R24,0x80
0135 3880 CPI R24,0x80
0136 F3E1 BEQ 0x0133
0137 9895 CBI 0x12,5
0138 2366 TST R22
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -