📄 led+ad.lst
字号:
__text_start:
__start:
0032 E5CF LDI R28,0x5F
0033 E0D4 LDI R29,4
0034 BFCD OUT 0x3D,R28
0035 BFDE OUT 0x3E,R29
0036 51C0 SUBI R28,0x10
0037 40D0 SBCI R29,0
0038 EA0A LDI R16,0xAA
0039 8308 STD Y+0,R16
003A 2400 CLR R0
003B E6E0 LDI R30,0x60
003C E0F0 LDI R31,0
003D E010 LDI R17,0
003E 36E8 CPI R30,0x68
003F 07F1 CPC R31,R17
0040 F011 BEQ 0x0043
0041 9201 ST R0,Z+
0042 CFFB RJMP 0x003E
0043 8300 STD Z+0,R16
0044 E6E4 LDI R30,0x64
0045 E0F0 LDI R31,0
0046 E6A0 LDI R26,0x60
0047 E0B0 LDI R27,0
0048 E010 LDI R17,0
0049 36E4 CPI R30,0x64
004A 07F1 CPC R31,R17
004B F021 BEQ 0x0050
004C 95C8 LPM
004D 9631 ADIW R30,1
004E 920D ST R0,X+
004F CFF9 RJMP 0x0049
0050 940E00E7 CALL _main
_exit:
0052 CFFF RJMP _exit
FILE: F:\李鹏飞\sl-avrad-m16\LED+AD\LED+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) /* 七段译码字形表 */
(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:
0053 E38F LDI R24,0x3F
0054 BB81 OUT 0x11,R24
(0025) DDRB=0xff;
0055 EF8F LDI R24,0xFF
0056 BB87 OUT 0x17,R24
(0026) PORTD=0xff;
0057 BB82 OUT 0x12,R24
(0027) PORTB=0xff;
0058 BB88 OUT 0x18,R24
(0028) }
0059 9508 RET
_display:
i --> R10
005A 940E018B CALL push_gset3x
(0029) void display(void)//六路动态扫描显示电路
(0030) {
(0031) unsigned char i;
(0032) for (i=0;i<6;i++)
005C 24AA CLR R10
005D C019 RJMP 0x0077
(0033) {
(0034) PORTB=ledbuff[i];//将显示缓冲区数据送PORTB口
005E E682 LDI R24,0x62
005F E090 LDI R25,0
0060 2DEA MOV R30,R10
0061 27FF CLR R31
0062 0FE8 ADD R30,R24
0063 1FF9 ADC R31,R25
0064 8020 LDD R2,Z+0
0065 BA28 OUT 0x18,R2
(0035) PORTD=~(1<<i); //开始显示
0066 E001 LDI R16,1
0067 2D1A MOV R17,R10
0068 940E01B7 CALL lsl8
006A 2E20 MOV R2,R16
006B 9420 COM R2
006C BA22 OUT 0x12,R2
(0036) delay_1ms(); //每一位显示保持一定时间
006D 940E0126 CALL _delay_1ms
(0037) PORTD|=(1<<i); //关闭显示
006F E001 LDI R16,1
0070 2D1A MOV R17,R10
0071 940E01B7 CALL lsl8
0073 B222 IN R2,0x12
0074 2A20 OR R2,R16
0075 BA22 OUT 0x12,R2
0076 94A3 INC R10
0077 2D8A MOV R24,R10
0078 3086 CPI R24,6
0079 F320 BCS 0x005E
(0038) }
(0039) }
007A 940E017C CALL pop_gset3x
007C 9508 RET
_adctovol:
char_p --> Y+1
i --> R10
temp --> R12
adc --> R10
007D 940E018E CALL push_gset4x
007F 0158 MOVW R10,R16
(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);
0080 0115 MOVW R2,R10
0081 2444 CLR R4
0082 2455 CLR R5
0083 EF81 LDI R24,0xF1
0084 E091 LDI R25,1
0085 E0A0 LDI R26,0
0086 E0B0 LDI R27,0
0087 925A ST R5,-Y
0088 924A ST R4,-Y
0089 923A ST R3,-Y
008A 922A ST R2,-Y
008B 018C MOVW R16,R24
008C 019D MOVW R18,R26
008D 940E014C CALL empy32u
008F E08A LDI R24,0xA
0090 E090 LDI R25,0
0091 938A ST R24,-Y
0092 940E01BD CALL lsr32
0094 0168 MOVW R12,R16
(0049) for(i=0;i<3;i++)
0095 24AA CLR R10
0096 C019 RJMP 0x00B0
(0050) {
(0051) ledbuff[i]=tabel[temp%10];
0097 E02A LDI R18,0xA
0098 E030 LDI R19,0
0099 0186 MOVW R16,R12
009A 940E0130 CALL mod16u
009C 01F8 MOVW R30,R16
009D E584 LDI R24,0x54
009E E090 LDI R25,0
009F 0FE8 ADD R30,R24
00A0 1FF9 ADC R31,R25
00A1 91E4 LPM R30,0(Z)
00A2 E682 LDI R24,0x62
00A3 E090 LDI R25,0
00A4 2DAA MOV R26,R10
00A5 27BB CLR R27
00A6 0FA8 ADD R26,R24
00A7 1FB9 ADC R27,R25
00A8 93EC ST R30,0(X)
(0052) temp=temp/10;
00A9 E02A LDI R18,0xA
00AA E030 LDI R19,0
00AB 0186 MOVW R16,R12
00AC 940E0132 CALL div16u
00AE 0168 MOVW R12,R16
00AF 94A3 INC R10
00B0 2D8A MOV R24,R10
00B1 3083 CPI R24,3
00B2 F320 BCS 0x0097
(0053) }
(0054) ledbuff[5]=tabel[0x0a];
00B3 E5EE LDI R30,0x5E
00B4 E0F0 LDI R31,0
00B5 91E4 LPM R30,0(Z)
00B6 93E00067 STS 0x67,R30
(0055) ledbuff[4]=tabel[0x0d];
00B8 E6E1 LDI R30,0x61
00B9 E0F0 LDI R31,0
00BA 91E4 LPM R30,0(Z)
00BB 93E00066 STS 0x66,R30
(0056) ledbuff[3]=0x40;
00BD E480 LDI R24,0x40
00BE 93800065 STS _ledbuff+3,R24
(0057) ledbuff[2]|=0x80;
00C0 91800064 LDS R24,_ledbuff+2
00C2 6880 ORI R24,0x80
00C3 93800064 STS _ledbuff+2,R24
(0058) }
00C5 940E0188 CALL pop_gset4x
00C7 9508 RET
_adc_isr:
temp --> R16
00C8 922A ST R2,-Y
00C9 923A ST R3,-Y
00CA 930A ST R16,-Y
00CB 931A ST R17,-Y
00CC 93EA ST R30,-Y
00CD B62F IN R2,0x3F
00CE 922A ST R2,-Y
(0059) /* AD转换程序 */
(0060) #pragma interrupt_handler adc_isr:15
(0061) void adc_isr(void)
(0062) {
(0063) unsigned int temp=0;
00CF 2700 CLR R16
00D0 2711 CLR R17
00D1 C002 RJMP 0x00D4
(0064) while(temp<6)
(0065) temp++;
00D2 5F0F SUBI R16,0xFF
00D3 4F1F SBCI R17,0xFF
00D4 3006 CPI R16,6
00D5 E0E0 LDI R30,0
00D6 071E CPC R17,R30
00D7 F3D0 BCS 0x00D2
(0066) ad_con=ADC;
00D8 B024 IN R2,0x04
00D9 B035 IN R3,0x05
00DA 92300061 STS _ad_con+1,R3
00DC 92200060 STS _ad_con,R2
(0067) ADCSR|=(1<<ADSC);//启动转换
00DE 9A36 SBI 0x06,6
(0068) }
00DF 9029 LD R2,Y+
00E0 BE2F OUT 0x3F,R2
00E1 91E9 LD R30,Y+
00E2 9119 LD R17,Y+
00E3 9109 LD R16,Y+
00E4 9039 LD R3,Y+
00E5 9029 LD R2,Y+
00E6 9518 RETI
(0069) //将AD转换结果转换成电压数值,然后在LCD上显示
(0070) void main(void)
(0071) {
(0072) unsigned char i;
(0073) port_init();
_main:
i --> R10
00E7 DF6B RCALL _port_init
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -