📄 008.lst
字号:
__start:
__text_start:
0035 E5CF LDI R28,0x5F
0036 E0D4 LDI R29,4
0037 BFCD OUT 0x3D,R28
0038 BFDE OUT 0x3E,R29
0039 51C0 SUBI R28,0x10
003A 40D0 SBCI R29,0
003B EA0A LDI R16,0xAA
003C 8308 STD Y+0,R16
003D 2400 CLR R0
003E E7E5 LDI R30,0x75
003F E0F0 LDI R31,0
0040 E010 LDI R17,0
0041 37E6 CPI R30,0x76
0042 07F1 CPC R31,R17
0043 F011 BEQ 0x0046
0044 9201 ST R0,Z+
0045 CFFB RJMP 0x0041
0046 8300 STD Z+0,R16
0047 E5E4 LDI R30,0x54
0048 E0F0 LDI R31,0
0049 E6A0 LDI R26,0x60
004A E0B0 LDI R27,0
004B E010 LDI R17,0
004C 36E9 CPI R30,0x69
004D 07F1 CPC R31,R17
004E F021 BEQ 0x0053
004F 95C8 LPM
0050 9631 ADIW R30,1
0051 920D ST R0,X+
0052 CFF9 RJMP 0x004C
0053 940E0065 CALL _main
_exit:
0055 CFFF RJMP _exit
_delay_ms:
a --> R20
b --> R22
i --> R16
0056 940E0127 CALL push_gset2
FILE: E:\ICCAVR\project\AVRMEG~2\icc\008-AD-LED\main.c
(0001) /*
(0002) 实验八:
(0003) AD转换实验。
(0004) 1、AD转换实验。程序进行周期AD转换,在并转换值显示在数码管上。
(0005) 2、使用内部1 M晶振。
(0006) 3、进行此实验需要插上:JP1的所有8个短路块、JP9(A/D)。
(0007) 4、此实验采用项目化管理,主要文件有ADC、DISP、主程序。
(0008)
(0009) AVR mega16学习板
(0010) www.iccavr.com
(0011) 2006-04-05
(0012) */
(0013)
(0014) #include "iom16v.h"
(0015) #include <macros.h>
(0016)
(0017) extern unsigned char get_ad(void);/*AD采样函数*/
(0018) extern void Disp_Init(void);/*显示初始化*/
(0019) extern unsigned char led_buf[];/*显示缓存*/
(0020)
(0021) /*延时函数,频率1MHz,单位mS*/
(0022) void delay_ms(unsigned char i) {
(0023)
(0024) unsigned char a, b;
(0025) for (a = 1; a < i; a++) {
0058 E041 LDI R20,1
0059 C006 RJMP 0x0060
(0026) for (b = 1; b; b++) {
005A E061 LDI R22,1
005B C001 RJMP 0x005D
005C 9563 INC R22
005D 2366 TST R22
005E F7E9 BNE 0x005C
005F 9543 INC R20
0060 1740 CP R20,R16
0061 F3C0 BCS 0x005A
0062 940E011E CALL pop_gset2
0064 9508 RET
(0027) ;
(0028) }
(0029) }
(0030) }
(0031)
(0032) void main(void) {
(0033)
(0034) unsigned char i;
(0035) DDRA = 0x00; /*方向输入*/
_main:
i --> R20
0065 2422 CLR R2
0066 BA2A OUT 0x1A,R2
(0036) PORTA = 0x7F; /*打开上拉*/
0067 E78F LDI R24,0x7F
0068 BB8B OUT 0x1B,R24
(0037) DDRB = 0xFF; /*方向输出*/
0069 EF8F LDI R24,0xFF
006A BB87 OUT 0x17,R24
(0038) PORTB = 0xFF; /*电平设置*/
006B BB88 OUT 0x18,R24
(0039) DDRC = 0x00;
006C BA24 OUT 0x14,R2
(0040) PORTC = 0xFF;
006D BB85 OUT 0x15,R24
(0041) DDRD = 0x00;
006E BA21 OUT 0x11,R2
(0042) PORTD = 0xFF;
006F BB82 OUT 0x12,R24
(0043)
(0044) delay_ms(200); /*加入延时*/
0070 EC08 LDI R16,0xC8
0071 DFE4 RCALL _delay_ms
(0045) Disp_Init(); /*电平设置*/
0072 940E0093 CALL _Disp_Init
0074 C01C RJMP 0x0091
(0046) while (1) {
(0047) delay_ms(100); /*周期控制*/
0075 E604 LDI R16,0x64
0076 DFDF RCALL _delay_ms
(0048) i = get_ad(); /*获取电压*/
0077 940E00FC CALL _get_ad
0079 2F40 MOV R20,R16
(0049) led_buf[3] = 0; /*数值转换*/
007A 2422 CLR R2
007B 92200073 STS led_buf+3,R2
(0050) led_buf[2] = i / 100;
007D E614 LDI R17,0x64
007E 940E0108 CALL div8u
0080 93000072 STS led_buf+2,R16
(0051) led_buf[1] = (i % 100) / 10;
0082 E614 LDI R17,0x64
0083 2F04 MOV R16,R20
0084 940E0106 CALL mod8u
0086 E01A LDI R17,0xA
0087 940E0108 CALL div8u
0089 93000071 STS led_buf+1,R16
(0052) led_buf[0] = (i % 10);
008B E01A LDI R17,0xA
008C 2F04 MOV R16,R20
008D 940E0106 CALL mod8u
008F 93000070 STS led_buf,R16
0091 CFE3 RJMP 0x0075
0092 9508 RET
FILE: E:\ICCAVR\project\AVRMEG~2\icc\008-AD-LED\disp_2.c
(0001) /*
(0002) 模块说明:
(0003)
(0004) LED数码管中断动态显示程序。
(0005) 1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
(0006) 2、动态调度由片内定时器1中断产生,中断周期为5mS。
(0007) 3、内部1 M晶振,程序采用单任务方式,软件延时。
(0008) 4、此模块文件为实用文件,可直接用于项目中。
(0009) www.iccavr.com
(0010) */
(0011) #include "iom16v.h"
(0012) #include <macros.h>
(0013)
(0014) unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0};
(0015)
(0016) unsigned char led_buf[] = {1, 2, 3, 4, 0}; /*显示信息*/
(0017)
(0018) /*------------------------------------------------------------------*-
(0019)
(0020) Disp_Init()
(0021) 显示初始化
(0022)
(0023) -*------------------------------------------------------------------*/
(0024) void Disp_Init(void) {
(0025)
(0026) /*初始化定时器*/
(0027) OCR1A = 625; /*计数周期为5mS,F=1M*/
_Disp_Init:
0093 E781 LDI R24,0x71
0094 E092 LDI R25,2
0095 BD9B OUT 0x2B,R25
0096 BD8A OUT 0x2A,R24
(0028) TIMSK |= (1 << OCIE1A); /*比较中断A允许*/
0097 B789 IN R24,0x39
0098 6180 ORI R24,0x10
0099 BF89 OUT 0x39,R24
(0029) SREG = 0x80;
009A E880 LDI R24,0x80
009B BF8F OUT 0x3F,R24
(0030) TCCR1A = 0x00;
009C 2422 CLR R2
009D BC2F OUT 0x2F,R2
(0031) TCCR1B = 0x08; /*定时器工作在CTC计数器模式*/
009E E088 LDI R24,0x8
009F BD8E OUT 0x2E,R24
(0032) TCCR1B |= 0x02; /*设置定时器的分频值为8分频*/
00A0 B58E IN R24,0x2E
00A1 6082 ORI R24,2
00A2 BD8E OUT 0x2E,R24
(0033)
(0034) /*SPI接口初始化*/
(0035) DDRB |= (1<<PB5) | (1<<PB7); /* 设置MOSI 和SCK 为输出,其他为输入 */
00A3 B387 IN R24,0x17
00A4 6A80 ORI R24,0xA0
00A5 BB87 OUT 0x17,R24
(0036) SPCR = (1<<SPE) | (1<<MSTR)
00A6 E583 LDI R24,0x53
00A7 B98D OUT 0x0D,R24
(0037) | (1<<SPR1) | (1<<SPR0); /* 使能SPI 主机模式,时钟为fck/128 */
(0038)
(0039) /*中断使能*/
(0040) SEI();
00A8 9478 BSET 7
00A9 9508 RET
_Int_TCCR1A:
temp --> R20
00AA 922A ST R2,-Y
00AB 930A ST R16,-Y
00AC 931A ST R17,-Y
00AD 938A ST R24,-Y
00AE 939A ST R25,-Y
00AF 93EA ST R30,-Y
00B0 93FA ST R31,-Y
00B1 B62F IN R2,0x3F
00B2 922A ST R2,-Y
00B3 940E0129 CALL push_gset1
(0041) }
(0042)
(0043) /*------------------------------------------------------------------*-
(0044)
(0045) Int_TCCR1A()
(0046) LED数码管动态显示函数
(0047)
(0048) 定时器'T1',A组比较中断产生5mS周期性中断
(0049) 在中断里刷新显示
(0050)
(0051) -*------------------------------------------------------------------*/
(0052) #pragma interrupt_handler Int_TCCR1A: 7
(0053) void Int_TCCR1A(void) {
(0054)
(0055) unsigned char temp;
(0056) static unsigned char i;
(0057)
(0058) PORTB &= ~(1 << 4); /*准备锁存*/
00B5 98C4 CBI 0x18,4
(0059) PORTB |= 0x0F;
00B6 B388 IN R24,0x18
00B7 608F ORI R24,0xF
00B8 BB88 OUT 0x18,R24
(0060) PORTB |= (1 << 4); /*锁存数据*/
00B9 9AC4 SBI 0x18,4
(0061) if (i == 3) {
00BA 91800075 LDS R24,i
00BC 3083 CPI R24,3
00BD F409 BNE 0x00BF
(0062) PORTB &= ~(1 << 2);
00BE 98C2 CBI 0x18,2
(0063) }
(0064) if (i == 2) {
00BF 91800075 LDS R24,i
00C1 3082 CPI R24,2
00C2 F409 BNE 0x00C4
(0065) PORTB &= ~(1 << 1);
00C3 98C1 CBI 0x18,1
(0066) }
(0067) if (i == 1) {
00C4 91800075 LDS R24,i
00C6 3081 CPI R24,1
00C7 F409 BNE 0x00C9
(0068) PORTB &= ~(1 << 0);
00C8 98C0 CBI 0x18,0
(0069) }
(0070) if (i == 0) {
00C9 90200075 LDS R2,i
00CB 2022 TST R2
00CC F409 BNE 0x00CE
(0071) PORTB &= ~(1 << 3);
00CD 98C3 CBI 0x18,3
(0072) }
(0073)
(0074) temp = led_buf[i] % 16; /**/
00CE E780 LDI R24,0x70
00CF E090 LDI R25,0
00D0 91E00075 LDS R30,i
00D2 27FF CLR R31
00D3 0FE8 ADD R30,R24
00D4 1FF9 ADC R31,R25
00D5 8100 LDD R16,Z+0
00D6 E110 LDI R17,0x10
00D7 940E0106 CALL mod8u
00D9 2F40 MOV R20,R16
(0075) temp = disp[temp]; /**/
00DA E680 LDI R24,0x60
00DB E090 LDI R25,0
00DC 2FE4 MOV R30,R20
00DD 27FF CLR R31
00DE 0FE8 ADD R30,R24
00DF 1FF9 ADC R31,R25
00E0 8140 LDD R20,Z+0
(0076) SPDR = temp;
00E1 B94F OUT 0x0F,R20
(0077)
(0078) if (i > 3) {
00E2 E083 LDI R24,3
00E3 90200075 LDS R2,i
00E5 1582 CP R24,R2
00E6 F420 BCC 0x00EB
(0079) i = 0;
00E7 2422 CLR R2
00E8 92200075 STS i,R2
(0080) }
00EA C005 RJMP 0x00F0
(0081) else {
(0082) i ++;
00EB 91800075 LDS R24,i
00ED 5F8F SUBI R24,0xFF
00EE 93800075 STS i,R24
(0083) }
00F0 940E012C CALL pop_gset1
00F2 9029 LD R2,Y+
00F3 BE2F OUT 0x3F,R2
00F4 91F9 LD R31,Y+
00F5 91E9 LD R30,Y+
00F6 9199 LD R25,Y+
00F7 9189 LD R24,Y+
00F8 9119 LD R17,Y+
00F9 9109 LD R16,Y+
00FA 9029 LD R2,Y+
00FB 9518 RETI
FILE: E:\ICCAVR\project\AVRMEG~2\icc\008-AD-LED\adc.c
(0001) #include "iom16v.h"
(0002)
(0003) /*ADC采样函数,采样第7通道信号,采样分辨率256*/
(0004) unsigned char get_ad(void) {
(0005)
(0006) unsigned char i;
(0007)
(0008) ADMUX = 0x67; /*基准AVCC、左对齐、通道7*/
_get_ad:
i --> R16
00FC E687 LDI R24,0x67
00FD B987 OUT 0x07,R24
(0009) ADCSRA = 0xC2; /*使能、开启、4分频*/
00FE EC82 LDI R24,0xC2
00FF B986 OUT 0x06,R24
(0010) while(!(ADCSRA & (1 << ADIF))); /*等待*/
0100 9B34 SBIS 0x06,4
0101 CFFE RJMP 0x0100
(0011) i = ADCH;
0102 B105 IN R16,0x05
(0012) ADCSRA &= ~(1 << ADIF); /*清标志*/
0103 9834 CBI 0x06,4
(0013) ADCSRA &= ~(1 << ADEN); /*关闭转换*/
0104 9837 CBI 0x06,7
(0014)
(0015) return i;
FILE: <library>
0105 9508 RET
mod8u:
0106 9468 BSET 6
0107 C001 RJMP xdiv8u
div8u:
0108 94E8 BCLR 6
xdiv8u:
0109 932A ST R18,-Y
010A 92FA ST R15,-Y
010B 92EA ST R14,-Y
010C 24FF CLR R15
010D 24EE CLR R14
010E E120 LDI R18,0x10
010F 0F00 LSL R16
0110 1CFF ROL R15
0111 1CEE ROL R14
0112 16E1 CP R14,R17
0113 F010 BCS 0x0116
0114 1AE1 SUB R14,R17
0115 9503 INC R16
0116 952A DEC R18
0117 F7B9 BNE 0x010F
0118 F40E BRTC 0x011A
0119 2D0E MOV R16,R14
011A 90E9 LD R14,Y+
011B 90F9 LD R15,Y+
011C 9129 LD R18,Y+
011D 9508 RET
pop_gset2:
011E E0E2 LDI R30,2
011F 940C012D JMP pop
push_gset5:
0121 92FA ST R15,-Y
0122 92EA ST R14,-Y
push_gset4:
0123 92DA ST R13,-Y
0124 92CA ST R12,-Y
push_gset3:
0125 92BA ST R11,-Y
0126 92AA ST R10,-Y
push_gset2:
0127 937A ST R23,-Y
0128 936A ST R22,-Y
push_gset1:
0129 935A ST R21,-Y
012A 934A ST R20,-Y
012B 9508 RET
pop_gset1:
012C E0E1 LDI R30,1
pop:
012D 9149 LD R20,Y+
012E 9159 LD R21,Y+
012F FDE0 SBRC R30,0
0130 9508 RET
0131 9169 LD R22,Y+
0132 9179 LD R23,Y+
0133 FDE1 SBRC R30,1
0134 9508 RET
0135 90A9 LD R10,Y+
0136 90B9 LD R11,Y+
0137 FDE2 SBRC R30,2
0138 9508 RET
0139 90C9 LD R12,Y+
013A 90D9 LD R13,Y+
013B FDE3 SBRC R30,3
013C 9508 RET
013D 90E9 LD R14,Y+
013E 90F9 LD R15,Y+
013F 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -