📄 ad_led.lst
字号:
__text_start:
__start:
0019 E5CF LDI R28,0x5F
001A E0D2 LDI R29,2
001B BFCD OUT P3D,R28
001C BFDE OUT P3E,R29
001D 51C0 SUBI R28,0x10
001E 40D0 SBCI R29,0
001F EA0A LDI R16,0xAA
0020 8308 STD R16,0+Y
0021 2400 CLR R0
0022 E6E0 LDI R30,0x60
0023 E0F0 LDI R31,0
0024 E010 LDI R17,0
0025 36E8 CPI R30,0x68
0026 07F1 CPC R31,R17
0027 F011 BEQ 0x002A
0028 9201 ST R0,Z+
0029 CFFB RJMP 0x0025
002A 8300 STD R16,0+Z
002B E3E2 LDI R30,0x32
002C E0F0 LDI R31,0
002D E6A0 LDI R26,0x60
002E E0B0 LDI R27,0
002F E010 LDI R17,0
0030 33E2 CPI R30,0x32
0031 07F1 CPC R31,R17
0032 F021 BEQ 0x0037
0033 95C8 LPM
0034 9631 ADIW R30,1
0035 920D ST R0,X+
0036 CFF9 RJMP 0x0030
0037 D098 RCALL _main
_exit:
0038 CFFF RJMP _exit
FILE: D:\ICC-AVR\examples.sl\AD_8535_LED\ad_led.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<io8535.h>
(0015) #include<slavr.h>
(0016) #include<macros.h>
(0017) /* 七段译码字形表 */
(0018) const unsigned char tabel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
(0019) 0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0020) /* 显示缓冲区 */
(0021) unsigned char ledbuff[6];
(0022) void port_init(void)//端口初始化
(0023) {
(0024) DDRD=0x3f;
_port_init:
0039 E38F LDI R24,0x3F
003A BB81 OUT P11,R24
(0025) DDRB=0xff;
003B EF8F LDI R24,0xFF
003C BB87 OUT P17,R24
(0026) PORTD=0xff;
003D BB82 OUT P12,R24
(0027) PORTB=0xff;
003E BB88 OUT P18,R24
(0028) }
003F 9508 RET
_display:
i --> R20
0040 D0F4 RCALL push_gset1
(0029) void display(void)//六路动态扫描显示电路
(0030) {
(0031) unsigned char i;
(0032) for (i=0;i<6;i++)
0041 2744 CLR R20
0042 C016 RJMP 0x0059
(0033) {
(0034) PORTB=ledbuff[i];//将显示缓冲区数据送PORTB口
0043 E682 LDI R24,0x62
0044 E090 LDI R25,0
0045 2FE4 MOV R30,R20
0046 27FF CLR R31
0047 0FE8 ADD R30,R24
0048 1FF9 ADC R31,R25
0049 8020 LDD R2,0+Z
004A BA28 OUT P18,R2
(0035) PORTD=~(1<<i); //开始显示
004B E001 LDI R16,1
004C 2F14 MOV R17,R20
004D D115 RCALL lsl8
004E 2E20 MOV R2,R16
004F 9420 COM R2
0050 BA22 OUT P12,R2
(0036) delay_1ms(); //每一位显示保持一定时间
0051 D0BD RCALL _delay_1ms
(0037) PORTD|=(1<<i); //关闭显示
0052 E001 LDI R16,1
0053 2F14 MOV R17,R20
0054 D10E RCALL lsl8
0055 B222 IN R2,P12
0056 2A20 OR R2,R16
0057 BA22 OUT P12,R2
(0038) }
0058 9543 INC R20
0059 3046 CPI R20,6
005A F340 BCS 0x0043
(0039) }
005B D0DC RCALL pop_gset1
005C 9508 RET
_adctovol:
char_p --> Y+1
i --> R10
temp --> R12
adc --> R10
005D D0F4 RCALL push_gset4
005E 2EA0 MOV R10,R16
005F 2EB1 MOV R11,R17
(0040) unsigned int ad_con;//存放PA0的AD转换结果
(0041) /* 将AD结果转换成电压 */
(0042) #define vref 497
(0043) void adctovol(unsigned int adc)
(0044) {
(0045) unsigned int temp;
(0046) unsigned char i;
(0047) unsigned char *char_p;
(0048) temp=(unsigned int)(((unsigned long)((unsigned long)adc*vref))/1024);
0060 2C2A MOV R2,R10
0061 2C3B MOV R3,R11
0062 2444 CLR R4
0063 2455 CLR R5
0064 EF41 LDI R20,0xF1
0065 E051 LDI R21,1
0066 E060 LDI R22,0
0067 E070 LDI R23,0
0068 925A ST R5,-Y
0069 924A ST R4,-Y
006A 923A ST R3,-Y
006B 922A ST R2,-Y
006C 2F04 MOV R16,R20
006D 2F15 MOV R17,R21
006E 2F26 MOV R18,R22
006F 2F37 MOV R19,R23
0070 D11D RCALL mpy32u
0071 E08A LDI R24,0xA
0072 E090 LDI R25,0
0073 938A ST R24,-Y
0074 D0E2 RCALL lsr32
0075 2EC0 MOV R12,R16
0076 2ED1 MOV R13,R17
(0049) for(i=0;i<3;i++)
0077 24AA CLR R10
0078 C01D RJMP 0x0096
(0050) {
(0051) ledbuff[i]=tabel[temp%10];
0079 E02A LDI R18,0xA
007A E030 LDI R19,0
007B 2D0C MOV R16,R12
007C 2D1D MOV R17,R13
007D D09B RCALL mod16u
007E 2E20 MOV R2,R16
007F 2E31 MOV R3,R17
0080 E282 LDI R24,0x22
0081 E090 LDI R25,0
0082 0E28 ADD R2,R24
0083 1E39 ADC R3,R25
0084 2DE2 MOV R30,R2
0085 2DF3 MOV R31,R3
0086 95C8 LPM
0087 E682 LDI R24,0x62
0088 E090 LDI R25,0
0089 2DEA MOV R30,R10
008A 27FF CLR R31
008B 0FE8 ADD R30,R24
008C 1FF9 ADC R31,R25
008D 8200 STD R0,0+Z
(0052) temp=temp/10;
008E E02A LDI R18,0xA
008F E030 LDI R19,0
0090 2D0C MOV R16,R12
0091 2D1D MOV R17,R13
0092 D088 RCALL div16u
0093 2EC0 MOV R12,R16
0094 2ED1 MOV R13,R17
(0053) }
0095 94A3 INC R10
0096 2D8A MOV R24,R10
0097 3083 CPI R24,3
0098 F300 BCS 0x0079
(0054) ledbuff[5]=tabel[0x0a];
0099 E28C LDI R24,0x2C
009A E090 LDI R25,0
009B 2FE8 MOV R30,R24
009C 2FF9 MOV R31,R25
009D 95C8 LPM
009E 92000067 STS R0,0x67
(0055) ledbuff[4]=tabel[0x0d];
00A0 E28F LDI R24,0x2F
00A1 E090 LDI R25,0
00A2 2FE8 MOV R30,R24
00A3 2FF9 MOV R31,R25
00A4 95C8 LPM
00A5 92000066 STS R0,0x66
(0056) ledbuff[3]=0x40;
00A7 E480 LDI R24,0x40
00A8 93800065 STS R24,_ledbuff+3
(0057) ledbuff[2]|=0x80;
00AA 91800064 LDS R24,_ledbuff+2
00AC 6880 ORI R24,0x80
00AD 93800064 STS R24,_ledbuff+2
(0058) }
00AF D0A5 RCALL pop_gset4
00B0 9508 RET
_adc_isr:
temp --> R16
00B1 922A ST R2,-Y
00B2 923A ST R3,-Y
00B3 930A ST R16,-Y
00B4 931A ST R17,-Y
00B5 93EA ST R30,-Y
00B6 B62F IN R2,P3F
00B7 922A ST R2,-Y
(0059) /* AD转换程序 */
(0060) #pragma interrupt_handler adc_isr:IT_ADC
(0061) void adc_isr(void)
(0062) {
(0063) unsigned int temp=0;
00B8 2700 CLR R16
00B9 2711 CLR R17
00BA C002 RJMP 0x00BD
(0064) while(temp<6)
(0065) temp++;
00BB 5F0F SUBI R16,0xFF
00BC 4F1F SBCI R17,0xFF
00BD 3006 CPI R16,6
00BE E0E0 LDI R30,0
00BF 071E CPC R17,R30
00C0 F3D0 BCS 0x00BB
(0066) ad_con=ADC;
00C1 B024 IN R2,P04
00C2 B035 IN R3,P05
00C3 92300061 STS R3,_ad_con+1
00C5 92200060 STS R2,_ad_con
(0067) ADCSR|=(1<<ADSC);//启动转换
00C7 9A36 SBI P06,6
(0068) }
00C8 9029 LD R2,Y+
00C9 BE2F OUT P3F,R2
00CA 91E9 LD R30,Y+
00CB 9119 LD R17,Y+
00CC 9109 LD R16,Y+
00CD 9039 LD R3,Y+
00CE 9029 LD R2,Y+
00CF 9518 RETI
(0069) //将AD转换结果转换成电压数值,然后在LCD上显示
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -