?? 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 + -