📄 num_led.lst
字号:
__text_start:
__start:
001B E5CF LDI R28,0x5F
001C E0D4 LDI R29,4
001D BFCD OUT 0x3D,R28
001E BFDE OUT 0x3E,R29
001F 51C0 SUBI R28,0x10
0020 40D0 SBCI R29,0
0021 EA0A LDI R16,0xAA
0022 8308 STD Y+0,R16
0023 2400 CLR R0
0024 E6EF LDI R30,0x6F
0025 E0F0 LDI R31,0
0026 E010 LDI R17,0
0027 36EF CPI R30,0x6F
0028 07F1 CPC R31,R17
0029 F011 BEQ 0x002C
002A 9201 ST R0,Z+
002B CFFB RJMP 0x0027
002C 8300 STD Z+0,R16
002D E2E6 LDI R30,0x26
002E E0F0 LDI R31,0
002F E6A0 LDI R26,0x60
0030 E0B0 LDI R27,0
0031 E010 LDI R17,0
0032 33E5 CPI R30,0x35
0033 07F1 CPC R31,R17
0034 F021 BEQ 0x0039
0035 95C8 LPM
0036 9631 ADIW R30,1
0037 920D ST R0,X+
0038 CFF9 RJMP 0x0032
0039 D07E RCALL _main
_exit:
003A CFFF RJMP _exit
FILE: C:\DOCUME~1\alf\MYDOCU~1\开发板\调试程序\num_led\num-tiner0.c
(0001) //ICC-AVR application builder : 2005-3-8 下午 04:53:49
(0002) // Target : M8
(0003) // Crystal: 11.059Mhz
(0004)
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007)
(0008) //lednum全局变量
(0009) char lednum = 0;
(0010) char lednum1 = 0;
(0011) char lednum2 = 0;
(0012) char lednum3 = 0;
(0013) char lednum4 = 0;
(0014) //码表
(0015) char num[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
(0016)
(0017)
(0018) void port_init(void)
(0019) {
(0020) PORTB = 0xFF;
_port_init:
003B EF8F LDI R24,0xFF
003C BB88 OUT 0x18,R24
(0021) DDRB = 0xFF;
003D BB87 OUT 0x17,R24
(0022) PORTC = 0x7F; //m103 output only
003E E78F LDI R24,0x7F
003F BB85 OUT 0x15,R24
(0023) DDRC = 0x7F;
0040 BB84 OUT 0x14,R24
(0024) PORTD = 0x00;
0041 2422 CLR R2
0042 BA22 OUT 0x12,R2
(0025) DDRD = 0xFF;
0043 EF8F LDI R24,0xFF
0044 BB81 OUT 0x11,R24
(0026) }
0045 9508 RET
(0027)
(0028) //TIMER0 initialisation - prescale:1024
(0029) // WGM: Normal
(0030) // desired value: 20mSec
(0031) // actual value: 19.908mSec (0.5%)
(0032) void timer0_init(void)
(0033) {
(0034) TCCR0 = 0x00; //stop
_timer0_init:
0046 2422 CLR R2
0047 BE23 OUT 0x33,R2
(0035) TCNT0 = 0x29; //set count
0048 E289 LDI R24,0x29
0049 BF82 OUT 0x32,R24
(0036) TCCR0 = 0x04; //start timer
004A E084 LDI R24,4
004B BF83 OUT 0x33,R24
(0037) }
004C 9508 RET
_timer0_ovf_isr:
004D 922A ST R2,-Y
004E 938A ST R24,-Y
004F 939A ST R25,-Y
0050 B62F IN R2,0x3F
0051 922A ST R2,-Y
(0038)
(0039) #pragma interrupt_handler timer0_ovf_isr:10
(0040) void timer0_ovf_isr(void)
(0041) {
(0042) TCNT0 = 0x29; //reload counter value
0052 E289 LDI R24,0x29
0053 BF82 OUT 0x32,R24
(0043) TCCR0 = 0x04; //start timer
0054 E084 LDI R24,4
0055 BF83 OUT 0x33,R24
(0044)
(0045) PORTB |= 0x30;
0056 B388 IN R24,0x18
0057 6380 ORI R24,0x30
0058 BB88 OUT 0x18,R24
(0046) PORTC |= 0x30;
0059 B385 IN R24,0x15
005A 6380 ORI R24,0x30
005B BB85 OUT 0x15,R24
(0047) if(lednum == 0) //更新PB4数码管;
005C 90200060 LDS R2,0x60
005E 2022 TST R2
005F F429 BNE 0x0065
(0048) { PORTB &= ~0x10;
0060 98C4 CBI 0x18,4
(0049) PORTD = lednum4;
0061 90200064 LDS R2,0x64
0063 BA22 OUT 0x12,R2
(0050) }
0064 C016 RJMP 0x007B
(0051) else if(lednum ==1) //更新PB5数码管;
0065 91800060 LDS R24,0x60
0067 3081 CPI R24,1
0068 F429 BNE 0x006E
(0052) { PORTB &= ~0x20;
0069 98C5 CBI 0x18,5
(0053) PORTD = lednum3;
006A 90200063 LDS R2,0x63
006C BA22 OUT 0x12,R2
(0054) }
006D C00D RJMP 0x007B
(0055) else if(lednum ==2) //更新PC4数码管;
006E 91800060 LDS R24,0x60
0070 3082 CPI R24,2
0071 F429 BNE 0x0077
(0056) { PORTC &= ~0x10;
0072 98AC CBI 0x15,4
(0057) PORTD = lednum2;
0073 90200062 LDS R2,0x62
0075 BA22 OUT 0x12,R2
(0058) }
0076 C004 RJMP 0x007B
(0059) else //更新PC5数码管;
(0060) { PORTC &= ~0x20;
0077 98AD CBI 0x15,5
(0061) PORTD = lednum1;
0078 90200061 LDS R2,0x61
007A BA22 OUT 0x12,R2
(0062) }
(0063)
(0064) lednum++;
007B 91800060 LDS R24,0x60
007D 5F8F SUBI R24,0xFF
007E 93800060 STS 0x60,R24
0080 C005 RJMP 0x0086
(0065) while(lednum >= 4) lednum = lednum - 4;
0081 91800060 LDS R24,0x60
0083 5084 SUBI R24,4
0084 93800060 STS 0x60,R24
0086 91800060 LDS R24,0x60
0088 3084 CPI R24,4
0089 F7B8 BCC 0x0081
(0066)
(0067) }
008A 9029 LD R2,Y+
008B BE2F OUT 0x3F,R2
008C 9199 LD R25,Y+
008D 9189 LD R24,Y+
008E 9029 LD R2,Y+
008F 9518 RETI
(0068)
(0069) //call this routine to initialise all peripherals
(0070) void init_devices(void)
(0071) {
(0072) //stop errant interrupts until set up
(0073) CLI(); //disable all interrupts
_init_devices:
0090 94F8 BCLR 7
(0074) port_init();
0091 DFA9 RCALL _port_init
(0075) timer0_init();
0092 DFB3 RCALL _timer0_init
(0076)
(0077) MCUCR = 0x00;
0093 2422 CLR R2
0094 BE25 OUT 0x35,R2
(0078) GICR = 0x00;
0095 BE2B OUT 0x3B,R2
(0079) TIMSK = 0x01; //timer interrupt sources
0096 E081 LDI R24,1
0097 BF89 OUT 0x39,R24
(0080) SEI(); //re-enable interrupts
0098 9478 BSET 7
(0081) //all peripherals are now initialised
(0082) }
0099 9508 RET
_delay:
j --> R16
i --> R18
z --> R20
009A D063 RCALL push_gset1
(0083)
(0084)
(0085)
(0086)
(0087) //自定义函数
(0088) void delay(void)
(0089) {
(0090) unsigned int i,j,z;
(0091) for(i=0;i<10000;i++);
009B 2722 CLR R18
009C 2733 CLR R19
009D C002 RJMP 0x00A0
009E 5F2F SUBI R18,0xFF
009F 4F3F SBCI R19,0xFF
00A0 3120 CPI R18,0x10
00A1 E2E7 LDI R30,0x27
00A2 073E CPC R19,R30
00A3 F3D0 BCS 0x009E
(0092) { for(j=0;j<10000;j++)
00A4 2700 CLR R16
00A5 2711 CLR R17
00A6 C00B RJMP 0x00B2
(0093) { for(z=0;z<100;z++);}
00A7 2744 CLR R20
00A8 2755 CLR R21
00A9 C002 RJMP 0x00AC
00AA 5F4F SUBI R20,0xFF
00AB 4F5F SBCI R21,0xFF
00AC 3644 CPI R20,0x64
00AD E0E0 LDI R30,0
00AE 075E CPC R21,R30
00AF F3D0 BCS 0x00AA
00B0 5F0F SUBI R16,0xFF
00B1 4F1F SBCI R17,0xFF
00B2 3100 CPI R16,0x10
00B3 E2E7 LDI R30,0x27
00B4 071E CPC R17,R30
00B5 F388 BCS 0x00A7
(0094) }
(0095) }
00B6 D04A RCALL pop_gset1
00B7 9508 RET
(0096)
(0097) void main(void)
(0098) {
(0099) char i;
(0100) init_devices();
_main:
i --> R20
00B8 DFD7 RCALL _init_devices
00B9 C042 RJMP 0x00FC
(0101)
(0102) while(1)
(0103) {
(0104)
(0105) for(i=0;i<=9;i++)
00BA 2744 CLR R20
00BB C00B RJMP 0x00C7
(0106) { lednum1 = num[i];
00BC E685 LDI R24,0x65
00BD E090 LDI R25,0
00BE 2FE4 MOV R30,R20
00BF 27FF CLR R31
00C0 0FE8 ADD R30,R24
00C1 1FF9 ADC R31,R25
00C2 8020 LDD R2,Z+0
00C3 92200061 STS 0x61,R2
(0107) delay();
00C5 DFD4 RCALL _delay
00C6 9543 INC R20
00C7 E089 LDI R24,0x9
00C8 1784 CP R24,R20
00C9 F790 BCC 0x00BC
(0108) }
(0109)
(0110)
(0111) PORTB |= 0x20;//位选2
00CA 9AC5 SBI 0x18,5
(0112) for(i=0;i<=9;i++)
00CB 2744 CLR R20
00CC C00B RJMP 0x00D8
(0113) { lednum2 = num[i];
00CD E685 LDI R24,0x65
00CE E090 LDI R25,0
00CF 2FE4 MOV R30,R20
00D0 27FF CLR R31
00D1 0FE8 ADD R30,R24
00D2 1FF9 ADC R31,R25
00D3 8020 LDD R2,Z+0
00D4 92200062 STS 0x62,R2
(0114) delay();
00D6 DFC3 RCALL _delay
00D7 9543 INC R20
00D8 E089 LDI R24,0x9
00D9 1784 CP R24,R20
00DA F790 BCC 0x00CD
(0115) }
(0116)
(0117)
(0118) PORTC |= 0x10;//位选3
00DB 9AAC SBI 0x15,4
(0119) for(i=0;i<=9;i++)
00DC 2744 CLR R20
00DD C00B RJMP 0x00E9
(0120) { lednum3 = num[i];
00DE E685 LDI R24,0x65
00DF E090 LDI R25,0
00E0 2FE4 MOV R30,R20
00E1 27FF CLR R31
00E2 0FE8 ADD R30,R24
00E3 1FF9 ADC R31,R25
00E4 8020 LDD R2,Z+0
00E5 92200063 STS 0x63,R2
(0121) delay();
00E7 DFB2 RCALL _delay
00E8 9543 INC R20
00E9 E089 LDI R24,0x9
00EA 1784 CP R24,R20
00EB F790 BCC 0x00DE
(0122) }
(0123)
(0124)
(0125)
(0126) for(i=0;i<=9;i++)
00EC 2744 CLR R20
00ED C00B RJMP 0x00F9
(0127) { lednum4 = num[i];
00EE E685 LDI R24,0x65
00EF E090 LDI R25,0
00F0 2FE4 MOV R30,R20
00F1 27FF CLR R31
00F2 0FE8 ADD R30,R24
00F3 1FF9 ADC R31,R25
00F4 8020 LDD R2,Z+0
00F5 92200064 STS 0x64,R2
(0128) delay();
00F7 DFA2 RCALL _delay
00F8 9543 INC R20
00F9 E089 LDI R24,0x9
00FA 1784 CP R24,R20
00FB F790 BCC 0x00EE
00FC CFBD RJMP 0x00BA
(0129) }
(0130)
(0131)
(0132) }
(0133) }
FILE: <library>
00FD 9508 RET
push_gset1:
00FE 935A ST R21,-Y
00FF 934A ST R20,-Y
0100 9508 RET
pop_gset1:
0101 E0E1 LDI R30,1
pop:
0102 9149 LD R20,Y+
0103 9159 LD R21,Y+
0104 FDE0 SBRC R30,0
0105 9508 RET
0106 9169 LD R22,Y+
0107 9179 LD R23,Y+
0108 FDE1 SBRC R30,1
0109 9508 RET
010A 90A9 LD R10,Y+
010B 90B9 LD R11,Y+
010C FDE2 SBRC R30,2
010D 9508 RET
010E 90C9 LD R12,Y+
010F 90D9 LD R13,Y+
0110 FDE3 SBRC R30,3
0111 9508 RET
0112 90E9 LD R14,Y+
0113 90F9 LD R15,Y+
0114 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -