📄 02-8a-11.lst
字号:
__start:
__text_start:
001E EFCF LDI R28,0xFF
001F E0D2 LDI R29,2
0020 BFCD OUT 0x3D,R28
0021 BFDE OUT 0x3E,R29
0022 51C0 SUBI R28,0x10
0023 40D0 SBCI R29,0
0024 EA0A LDI R16,0xAA
0025 8308 STD Y+0,R16
0026 2400 CLR R0
0027 E0E8 LDI R30,0x8
0028 E0F1 LDI R31,1
0029 E011 LDI R17,1
002A 31E0 CPI R30,0x10
002B 07F1 CPC R31,R17
002C F011 BEQ 0x002F
002D 9201 ST R0,Z+
002E CFFB RJMP 0x002A
002F 8300 STD Z+0,R16
0030 E3E4 LDI R30,0x34
0031 E0F0 LDI R31,0
0032 E0A0 LDI R26,0
0033 E0B1 LDI R27,1
0034 E010 LDI R17,0
0035 33EC CPI R30,0x3C
0036 07F1 CPC R31,R17
0037 F021 BEQ 0x003C
0038 95C8 LPM
0039 9631 ADIW R30,1
003A 920D ST R0,X+
003B CFF9 RJMP 0x0035
003C D0B6 RCALL _main
_exit:
003D CFFF RJMP _exit
FILE: D:\xij\demo\demo_diy02-8a\1\C语言\02-8a-11\11.c
(0001) //ICC-AVR application builder : 2005-3-15 10:10:23
(0002) // Target : M48
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom48v.h>
(0006) #include <macros.h>
(0007) unsigned int adc_w;
(0008) unsigned int adc_old,bjz;
(0009) unsigned char ad_high,ad_low;
(0010) unsigned int adc[4]= {0x333,0x266,0x199,0xcc};
(0011) void alarm(void);
(0012)
(0013) /*
(0014) #define adc_4 0x333;
(0015) #define adc_3 0x266;
(0016) #define adc_2 0x199;
(0017) #define adc_1 0xcc;
(0018) */
(0019) void port_init(void)
(0020) {
(0021) PORTB = 0xFF;
_port_init:
003E EF8F LDI R24,0xFF
003F B985 OUT 0x05,R24
(0022) DDRB = 0x07;
0040 E087 LDI R24,7
0041 B984 OUT 0x04,R24
(0023) PORTC = 0x7F; //m103 output only
0042 E78F LDI R24,0x7F
0043 B988 OUT 0x08,R24
(0024) DDRC = 0x00;
0044 2422 CLR R2
0045 B827 OUT 0x07,R2
(0025) PORTD = 0xFF;
0046 EF8F LDI R24,0xFF
0047 B98B OUT 0x0B,R24
(0026) DDRD = 0xFF;
0048 B98A OUT 0x0A,R24
0049 9508 RET
(0027) }
(0028)
(0029) //ADC initialize
(0030) // Conversion time: 13uS
(0031) void adc_init(void)
(0032) {
(0033) ADCSRA = 0x00; //disable adc
_adc_init:
004A 2422 CLR R2
004B 9220007A STS 0x7A,R2
(0034) ADMUX = 0x40; //select adc input 0
004D E480 LDI R24,0x40
004E 9380007C STS 0x7C,R24
(0035) ACSR = 0x80;
0050 E880 LDI R24,0x80
0051 BF80 OUT 0x30,R24
(0036) ADCSRB = 0x00;
0052 9220007B STS 0x7B,R2
(0037) ADCSRA = 0xCB;
0054 EC8B LDI R24,0xCB
0055 9380007A STS 0x7A,R24
0057 9508 RET
_adc_isr:
0058 922A ST R2,-Y
0059 923A ST R3,-Y
005A 938A ST R24,-Y
005B B62F IN R2,0x3F
005C 922A ST R2,-Y
(0038)
(0039) }
(0040)
(0041) #pragma interrupt_handler adc_isr:22
(0042) void adc_isr(void)
(0043) {
(0044) adc_w = ADC;
005D 90200078 LDS R2,0x78
005F 90300079 LDS R3,0x79
0061 9230010F STS adc_w+1,R3
0063 9220010E STS adc_w,R2
(0045) ADMUX = 0x40;
0065 E480 LDI R24,0x40
0066 9380007C STS 0x7C,R24
(0046) ADCSRA = 0xCB;
0068 EC8B LDI R24,0xCB
0069 9380007A STS 0x7A,R24
006B 9029 LD R2,Y+
006C BE2F OUT 0x3F,R2
006D 9189 LD R24,Y+
006E 9039 LD R3,Y+
006F 9029 LD R2,Y+
0070 9518 RETI
(0047) //ad_high = adch;
(0048) //ad_low = adcl;
(0049) //conversion complete, read value (int) using...
(0050) // value=ADCL; //Read 8 low bits first (important)
(0051) // value|=(int)ADCH << 8; //read 2 high bits and shift into top byte
(0052) }
(0053)
(0054) //call this routine to initialize all peripherals
(0055) void init_devices(void)
(0056) {
(0057) //stop errant interrupts until set up
(0058) CLI(); //disable all interrupts
_init_devices:
0071 94F8 BCLR 7
(0059) port_init();
0072 DFCB RCALL _port_init
(0060) adc_init();
0073 DFD6 RCALL _adc_init
(0061)
(0062) MCUCR = 0x00;
0074 2422 CLR R2
0075 BE25 OUT 0x35,R2
(0063) EICRA = 0x00; //extended ext ints
0076 92200069 STS 0x69,R2
(0064) EIMSK = 0x00;
0078 BA2D OUT 0x1D,R2
(0065)
(0066) TIMSK0 = 0x00; //timer 0 interrupt sources
0079 9220006E STS 0x6E,R2
(0067) TIMSK1 = 0x00; //timer 1 interrupt sources
007B 9220006F STS 0x6F,R2
(0068) TIMSK2 = 0x00; //timer 2 interrupt sources
007D 92200070 STS 0x70,R2
(0069)
(0070) PCMSK0 = 0x00; //pin change mask 0
007F 9220006B STS 0x6B,R2
(0071) PCMSK1 = 0x00; //pin change mask 1
0081 9220006C STS 0x6C,R2
(0072) PCMSK2 = 0x00; //pin change mask 2
0083 9220006D STS 0x6D,R2
(0073) PCICR = 0x00; //pin change enable
0085 92200068 STS 0x68,R2
(0074) PRR = 0x00; //power controller
0087 92200064 STS 0x64,R2
(0075) SEI(); //re-enable interrupts
0089 9478 BSET 7
008A 9508 RET
_display:
i --> R20
com --> R22
008B D088 RCALL push_gset2
008C 01B8 MOVW R22,R16
(0076) //all peripherals are now initialized
(0077) }
(0078)
(0079) /*显示函数*/
(0080) void display(unsigned int com)
(0081) {
008D C02F RJMP 0x00BD
(0082) unsigned int i;
(0083) while(bjz != com)
(0084) {
(0085) bjz = com;
008E 9370010B STS bjz+1,R23
0090 9360010A STS bjz,R22
(0086) if(com > adc[1])
0092 90200102 LDS R2,adc+2
0094 90300103 LDS R3,adc+3
0096 1626 CP R2,R22
0097 0637 CPC R3,R23
0098 F468 BCC 0x00A6
(0087) {
(0088) i = com;
0099 01AB MOVW R20,R22
(0089) if(i > adc[0])
009A 90200100 LDS R2,adc
009C 90300101 LDS R3,adc+1
009E 1626 CP R2,R22
009F 0637 CPC R3,R23
00A0 F410 BCC 0x00A3
(0090) {alarm();}
00A1 D039 RCALL _alarm
00A2 C01A RJMP 0x00BD
(0091) else
(0092) PORTB = 0XFB;
00A3 EF8B LDI R24,0xFB
00A4 B985 OUT 0x05,R24
(0093) }
00A5 C017 RJMP 0x00BD
(0094) else
(0095) {
(0096) i = com;
00A6 01AB MOVW R20,R22
(0097) if(i > adc[2])
00A7 90200104 LDS R2,0x104
00A9 90300105 LDS R3,0x105
00AB 1626 CP R2,R22
00AC 0637 CPC R3,R23
00AD F418 BCC 0x00B1
(0098) PORTB = 0XFD;
00AE EF8D LDI R24,0xFD
00AF B985 OUT 0x05,R24
00B0 C00C RJMP 0x00BD
(0099) else
(0100) {
(0101) if(i>adc[3])
00B1 90200106 LDS R2,0x106
00B3 90300107 LDS R3,0x107
00B5 1624 CP R2,R20
00B6 0635 CPC R3,R21
00B7 F418 BCC 0x00BB
(0102) PORTB = 0XFE;
00B8 EF8E LDI R24,0xFE
00B9 B985 OUT 0x05,R24
00BA C002 RJMP 0x00BD
(0103) else
(0104) PORTB = 0XFF;
00BB EF8F LDI R24,0xFF
00BC B985 OUT 0x05,R24
00BD 9020010A LDS R2,bjz
00BF 9030010B LDS R3,bjz+1
00C1 1626 CP R2,R22
00C2 0637 CPC R3,R23
00C3 F651 BNE 0x008E
00C4 D047 RCALL pop_gset2
00C5 9508 RET
(0105) }
(0106) }
(0107) }
(0108) }
(0109)
(0110) void delay_us(int time)
(0111) { //微秒延时
(0112) do
(0113) {
(0114) time--;
_delay_us:
time --> R16
00C6 5001 SUBI R16,1
00C7 4010 SBCI R17,0
(0115) }
(0116) while (time>1);
00C8 E081 LDI R24,1
00C9 E090 LDI R25,0
00CA 1780 CP R24,R16
00CB 0791 CPC R25,R17
00CC F3CC BLT 0x00C6
00CD 9508 RET
_delay_ms:
time --> R20
00CE D047 RCALL push_gset1
00CF 01A8 MOVW R20,R16
(0117) }
(0118)
(0119) void delay_ms(unsigned int time)
(0120) { //毫秒延时
00D0 C005 RJMP 0x00D6
(0121) while(time!=0)
(0122) {
(0123) delay_us(1000);
00D1 EE08 LDI R16,0xE8
00D2 E013 LDI R17,3
00D3 DFF2 RCALL _delay_us
(0124) time--;
00D4 5041 SUBI R20,1
00D5 4050 SBCI R21,0
00D6 3040 CPI R20,0
00D7 0745 CPC R20,R21
00D8 F7C1 BNE 0x00D1
00D9 D03F RCALL pop_gset1
00DA 9508 RET
(0125) }
(0126) }
(0127)
(0128)
(0129) /*报警函数*/
(0130) void alarm(void)
(0131) {
_alarm:
00DB C015 RJMP 0x00F1
(0132) while(1){
(0133) //i=PIND&0x04; //读出PD2口状态
(0134) if(adc_old >= adc[0])
00DC 90200100 LDS R2,adc
00DE 90300101 LDS R3,adc+1
00E0 9040010C LDS R4,adc_old
00E2 9050010D LDS R5,adc_old+1
00E4 1442 CP R4,R2
00E5 0453 CPC R5,R3
00E6 F040 BCS 0x00EF
(0135) {PORTD^=0x08;
00E7 E088 LDI R24,0x8
00E8 B02B IN R2,0x0B
00E9 2628 EOR R2,R24
00EA B82B OUT 0x0B,R2
(0136) delay_ms(100);
00EB E604 LDI R16,0x64
00EC E010 LDI R17,0
00ED DFE0 RCALL _delay_ms
(0137) }
00EE C002 RJMP 0x00F1
(0138) else
(0139) PORTD=0XFF;
00EF EF8F LDI R24,0xFF
00F0 B98B OUT 0x0B,R24
00F1 CFEA RJMP 0x00DC
00F2 9508 RET
(0140) }
(0141) }
(0142)
(0143) void main()
(0144) {
(0145) init_devices();
_main:
00F3 DF7D RCALL _init_devices
00F4 C015 RJMP 0x010A
(0146) while(1){
(0147) if(adc_w != adc_old){
00F5 9020010C LDS R2,adc_old
00F7 9030010D LDS R3,adc_old+1
00F9 9040010E LDS R4,adc_w
00FB 9050010F LDS R5,adc_w+1
00FD 1442 CP R4,R2
00FE 0453 CPC R5,R3
00FF F051 BEQ 0x010A
(0148) adc_old = adc_w;
0100 0112 MOVW R2,R4
0101 9230010D STS adc_old+1,R3
0103 9220010C STS adc_old,R2
(0149) display(adc_old);
FILE: <library>
0105 9100010C LDS R16,adc_old
0107 9110010D LDS R17,adc_old+1
0109 DF81 RCALL _display
010A CFEA RJMP 0x00F5
010B 9508 RET
pop_gset2:
010C E0E2 LDI R30,2
010D C00C RJMP pop
push_gset5:
010E 92FA ST R15,-Y
010F 92EA ST R14,-Y
push_gset4:
0110 92DA ST R13,-Y
0111 92CA ST R12,-Y
push_gset3:
0112 92BA ST R11,-Y
0113 92AA ST R10,-Y
push_gset2:
0114 937A ST R23,-Y
0115 936A ST R22,-Y
push_gset1:
0116 935A ST R21,-Y
0117 934A ST R20,-Y
0118 9508 RET
pop_gset1:
0119 E0E1 LDI R30,1
pop:
011A 9149 LD R20,Y+
011B 9159 LD R21,Y+
011C FDE0 SBRC R30,0
011D 9508 RET
011E 9169 LD R22,Y+
011F 9179 LD R23,Y+
0120 FDE1 SBRC R30,1
0121 9508 RET
0122 90A9 LD R10,Y+
0123 90B9 LD R11,Y+
0124 FDE2 SBRC R30,2
0125 9508 RET
0126 90C9 LD R12,Y+
0127 90D9 LD R13,Y+
0128 FDE3 SBRC R30,3
0129 9508 RET
012A 90E9 LD R14,Y+
012B 90F9 LD R15,Y+
012C 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -