📄 main.lst
字号:
__text_start:
__start:
0067 EFCF LDI R28,0xFF
0068 E1D0 LDI R29,0x10
0069 BFCD OUT 0x3D,R28
006A BFDE OUT 0x3E,R29
006B 51C0 SUBI R28,0x10
006C 40D0 SBCI R29,0
006D EA0A LDI R16,0xAA
006E 8308 STD Y+0,R16
006F 2400 CLR R0
0070 E0E0 LDI R30,0
0071 E0F1 LDI R31,1
0072 E011 LDI R17,1
0073 30E1 CPI R30,1
0074 07F1 CPC R31,R17
0075 F011 BEQ 0x0078
0076 9201 ST R0,Z+
0077 CFFB RJMP 0x0073
0078 8300 STD Z+0,R16
0079 ECEE LDI R30,0xCE
007A E0F0 LDI R31,0
007B E0A0 LDI R26,0
007C E0B1 LDI R27,1
007D E010 LDI R17,0
007E 3CEE CPI R30,0xCE
007F 07F1 CPC R31,R17
0080 F021 BEQ 0x0085
0081 95C8 LPM
0082 9631 ADIW R30,1
0083 920D ST R0,X+
0084 CFF9 RJMP 0x007E
0085 940E0088 CALL _main
_exit:
0087 CFFF RJMP _exit
FILE: F:\芯生光盘资料\范例代码\Interrupt\main.c
(0001) //ICC-AVR application builder : 2007-8-13 15:05:41
(0002) // Target : M128
(0003) // Crystal: 7.3728Mhz
(0004)
(0005) #include <iom128v.h>
(0006) #include <macros.h>
(0007) #include "port.h"
(0008) #include "led.h"
(0009) #include "stdtypes.h"
(0010)
(0011) UNS8 counter;
(0012)
(0013)
(0014) /*call this routine to initialize all peripherals */
(0015) void main(void)
(0016) {
(0017) //stop errant interrupts until set up
(0018) CLI(); //disable all interrupts
_main:
0088 94F8 BCLR 7
(0019) XDIV = 0x00; //xtal divider
0089 2422 CLR R2
008A BE2C OUT 0x3C,R2
(0020) XMCRA = 0x00; //external memory
008B 9220006D STS 0x6D,R2
(0021) port_init();
008D 940E00BB CALL _port_init
(0022) led_init(); //7段数码管显示
008F 940E00E7 CALL _led_init
(0023)
(0024) MCUCR = 0x00;
0091 2422 CLR R2
0092 BE25 OUT 0x35,R2
(0025) EICRA = 0x00; //extended ext ints
0093 9220006A STS 0x6A,R2
(0026) EICRB = 0x00; //extended ext ints
0095 BE2A OUT 0x3A,R2
(0027) EIMSK = 0x01;
0096 E081 LDI R24,1
0097 BF89 OUT 0x39,R24
(0028) TIMSK = 0x00; //timer interrupt sources
0098 BE27 OUT 0x37,R2
(0029) ETIMSK = 0x00; //extended timer interrupt sources
0099 9220007D STS 0x7D,R2
(0030)
(0031) counter=0;
009B 92200100 STS counter,R2
(0032)
(0033)
(0034) SEI(); //re-enable interrupts
009D 9478 BSET 7
(0035) //all peripherals are now initialized
(0036)
(0037)
(0038) for(;;)
(0039) {
(0040) display(counter,0); //普通模式,显示countdata的值,countdata将在timer3定时一秒溢出时改变
009E 2722 CLR R18
009F 91000100 LDS R16,counter
00A1 2711 CLR R17
00A2 940E010D CALL _display
00A4 CFF9 RJMP 0x009E
00A5 9508 RET
_int0_isr:
00A6 922A ST R2,-Y
00A7 938A ST R24,-Y
00A8 939A ST R25,-Y
00A9 B62F IN R2,0x3F
00AA 922A ST R2,-Y
(0041) //display(counter,1); //补零模式,显示countdata的值,countdata将在timer3定时一秒溢出时改变
(0042) }
(0043) }
(0044)
(0045) #pragma interrupt_handler int0_isr:2
(0046) void int0_isr(void)
(0047) {
(0048)
(0049) //external interupt on INT0
(0050) counter++;
00AB 91800100 LDS R24,counter
00AD 5F8F SUBI R24,0xFF
00AE 93800100 STS counter,R24
(0051) if(counter==0xFF)
00B0 3F8F CPI R24,0xFF
00B1 F419 BNE 0x00B5
(0052) {
(0053) counter=0;
00B2 2422 CLR R2
00B3 92200100 STS counter,R2
(0054) }
00B5 9029 LD R2,Y+
00B6 BE2F OUT 0x3F,R2
00B7 9199 LD R25,Y+
00B8 9189 LD R24,Y+
00B9 9029 LD R2,Y+
00BA 9518 RETI
FILE: F:\芯生光盘资料\范例代码\Interrupt\port\port.c
(0001) #include <iom128v.h>
(0002) #include <port.h>
(0003)
(0004)
(0005) void port_init(void)
(0006) {
(0007) PORTA = 0x00;
_port_init:
00BB 2422 CLR R2
00BC BA2B OUT 0x1B,R2
(0008) DDRA = 0x00;
00BD BA2A OUT 0x1A,R2
(0009) PORTB = 0x00;
00BE BA28 OUT 0x18,R2
(0010) DDRB = 0x00;
00BF BA27 OUT 0x17,R2
(0011) PORTC = 0x00;
00C0 BA25 OUT 0x15,R2
(0012) DDRC = 0x00;
00C1 BA24 OUT 0x14,R2
(0013) PORTD = 0x01;//int0
00C2 E081 LDI R24,1
00C3 BB82 OUT 0x12,R24
(0014) DDRD = 0x00;
00C4 BA21 OUT 0x11,R2
(0015) PORTE = 0x00;
00C5 B823 OUT 0x03,R2
(0016) DDRE = 0x00;
00C6 B822 OUT 0x02,R2
(0017) PORTF = 0x00;
00C7 92200062 STS 0x62,R2
(0018) DDRF = 0x00;
00C9 92200061 STS 0x61,R2
(0019) PORTG = 0x00;
00CB 92200065 STS 0x65,R2
(0020) DDRG = 0x00;
00CD 92200064 STS 0x64,R2
00CF 9508 RET
FILE: F:\芯生光盘资料\范例代码\Interrupt\4led\led.c
(0001) /**********************************
(0002) ** file_name led.c **
(0003) ** describe 七段数码管函数 **
(0004) ** auther 芯生 **
(0005) ** Time 2007-12-14 **
(0006) ***********************************/
(0007)
(0008) #include <iom128v.h>
(0009) #include <macros.h>
(0010) #include "stdtypes.h"
(0011) #include "led.h"
(0012)
(0013) //共阳极,LED数据 不显点,亮的段为1,连接为P0~P7对应a~g,dp
(0014) const led_data[16]={
(0015) 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
(0016) 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
(0017) };
(0018)
(0019) /***********************
(0020) **8M时为 1000.25us
(0021) **4M时为 999.5us
(0022) **xtal 为晶振频率,单位为Mhz
(0023) ************************/
(0024) void delay_1ms(void)
(0025) {
(0026) unsigned int i;
(0027) for(i=200;i>0;i--)
_delay_1ms:
i --> R16
00D0 EC08 LDI R16,0xC8
00D1 E010 LDI R17,0
00D2 C002 RJMP 0x00D5
00D3 5001 SUBI R16,1
00D4 4010 SBCI R17,0
00D5 3000 CPI R16,0
00D6 0701 CPC R16,R17
00D7 F7D9 BNE 0x00D3
00D8 9508 RET
_delay_ms:
i --> R20
n --> R22
00D9 940E08E8 CALL push_gset2
00DB 01B8 MOVW R22,R16
(0028) ;
(0029) }
(0030) /***********************
(0031) **毫秒级延时
(0032) ************************/
(0033) void delay_ms(unsigned int n)
(0034) {
(0035) unsigned int i;
(0036) for(i=n;i>0;i--)
00DC 01AB MOVW R20,R22
00DD C003 RJMP 0x00E1
(0037) delay_1ms();
00DE DFF1 RCALL _delay_1ms
00DF 5041 SUBI R20,1
00E0 4050 SBCI R21,0
00E1 3040 CPI R20,0
00E2 0745 CPC R20,R21
00E3 F7D1 BNE 0x00DE
00E4 940E08DC CALL pop_gset2
00E6 9508 RET
(0038) }
(0039)
(0040) /***********************
(0041) ** 初始化对应端口为输出
(0042) ** ABCD 和 abcdefg dpi 共12个IO口
(0043) ** 默认为 PD(4567) 和 PA(012345678)
(0044) ***********************/
(0045) void led_init(void)
(0046) {
(0047) led_ddr = 0xFF; //abcdefg dpi 各位设为输出
_led_init:
00E7 EF8F LDI R24,0xFF
00E8 BB8A OUT 0x1A,R24
(0048) led_contrl_ddr |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d); //ABCD四个控制设为输出
00E9 B381 IN R24,0x11
00EA 6F80 ORI R24,0xF0
00EB BB81 OUT 0x11,R24
(0049)
(0050) //初始化全灭
(0051) led_port = 0xFF;
00EC EF8F LDI R24,0xFF
00ED BB8B OUT 0x1B,R24
(0052) led_contrl_port |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d);
00EE B382 IN R24,0x12
00EF 6F80 ORI R24,0xF0
00F0 BB82 OUT 0x12,R24
00F1 9508 RET
_display_one:
data --> R20
count --> R22
00F2 940E08E8 CALL push_gset2
00F4 2F42 MOV R20,R18
00F5 2F60 MOV R22,R16
(0053) }
(0054)
(0055) /***********************
(0056) ** 显示一位
(0057) ** 输入:count显示在第几位(3210),data 要显示的数(0~f)
(0058) ************************/
(0059) void display_one(UNS8 count, UNS8 data)
(0060) {
(0061)
(0062) led_contrl_port &= ~(1<<count); //选中对应要显示的位,从右至左,4567
00F6 E001 LDI R16,1
00F7 2F16 MOV R17,R22
00F8 940E091E CALL lsl8
00FA 2E20 MOV R2,R16
00FB 9420 COM R2
00FC B232 IN R3,0x12
00FD 2032 AND R3,R2
00FE BA32 OUT 0x12,R3
(0063) led_port = led_data[data]; //显示的数
00FF E082 LDI R24,2
0100 9F84 MUL R24,R20
0101 01F0 MOVW R30,R0
0102 E88C LDI R24,0x8C
0103 E090 LDI R25,0
0104 0FE8 ADD R30,R24
0105 1FF9 ADC R31,R25
0106 9005 LPM R0,Z+
0107 9014 LPM R1,0(Z)
0108 01F0 MOVW R30,R0
0109 BBEB OUT 0x1B,R30
010A 940E08DC CALL pop_gset2
010C 9508 RET
_display:
temp --> R20
mode --> R10
data --> R22
010D 940E08E6 CALL push_gset3
010F 2EA2 MOV R10,R18
0110 01B8 MOVW R22,R16
(0064)
(0065) //如果对位进行了调整,就不在是4567,而是对应的值
(0066) }
(0067)
(0068) /***********************
(0069) ** 显示四位整数
(0070) ** 输入:要显示的四位数data,显示模式mode,1为补零显示模式,默认不显示零
(0071) ** 说明:可以小于四位数,mode=1时 自动补零
(0072) ************************/
(0073) void display(UNS16 data,UNS8 mode)
(0074) {
(0075) UNS8 temp;
(0076) //千位
(0077) if(data>=1000)
0111 3E68 CPI R22,0xE8
0112 E0E3 LDI R30,3
0113 077E CPC R23,R30
0114 F070 BCS 0x0123
(0078) {//补零
(0079) temp=data/1000;
0115 EE28 LDI R18,0xE8
0116 E033 LDI R19,3
0117 018B MOVW R16,R22
0118 940E08C2 CALL div16u
011A 2F40 MOV R20,R16
(0080) display_one(7,temp);
011B 2F24 MOV R18,R20
011C E007 LDI R16,7
011D DFD4 RCALL _display_one
(0081) delay_ms(6); //6ms 是个经验值,刚好无闪烁,并且亮度较高
011E E006 LDI R16,6
011F E010 LDI R17,0
0120 DFB8 RCALL _delay_ms
(0082) led_contrl_port |= (1<<7);
0121 9A97 SBI 0x12,7
(0083)
(0084) }
0122 C00A RJMP 0x012D
(0085) else
(0086) { if(mode==1)
0123 2D8A MOV R24,R10
0124 3081 CPI R24,1
0125 F439 BNE 0x012D
(0087) {
(0088) display_one(7,0);
0126 2722 CLR R18
0127 E007 LDI R16,7
0128 DFC9 RCALL _display_one
(0089) delay_ms(6);
0129 E006 LDI R16,6
012A E010 LDI R17,0
012B DFAD RCALL _delay_ms
(0090) led_contrl_port |= (1<<7);
012C 9A97 SBI 0x12,7
(0091) }
(0092) }
(0093)
(0094) //百位
(0095) if(data>=100)
012D 3664 CPI R22,0x64
012E E0E0 LDI R30,0
012F 077E CPC R23,R30
0130 F090 BCS 0x0143
(0096) {
(0097) temp=(data%1000)/100;
0131 EE28 LDI R18,0xE8
0132 E033 LDI R19,3
0133 018B MOVW R16,R22
0134 940E08C0 CALL mod16u
0136 E624 LDI R18,0x64
0137 E030 LDI R19,0
0138 940E08C2 CALL div16u
013A 2F40 MOV R20,R16
(0098) display_one(6,temp);
013B 2F24 MOV R18,R20
013C E006 LDI R16,6
013D DFB4 RCALL _display_one
(0099) delay_ms(6);
013E E006 LDI R16,6
013F E010 LDI R17,0
0140 DF98 RCALL _delay_ms
(0100) led_contrl_port |= (1<<6);
0141 9A96 SBI 0x12,6
(0101) }
0142 C00A RJMP 0x014D
(0102) else
(0103) {
(0104) if(mode==1)
0143 2D8A MOV R24,R10
0144 3081 CPI R24,1
0145 F439 BNE 0x014D
(0105) {
(0106) display_one(6,0);
0146 2722 CLR R18
0147 E006 LDI R16,6
0148 DFA9 RCALL _display_one
(0107) delay_ms(6);
0149 E006 LDI R16,6
014A E010 LDI R17,0
014B DF8D RCALL _delay_ms
(0108) led_contrl_port |= (1<<6);
014C 9A96 SBI 0x12,6
(0109) }
(0110) }
(0111) //十位
(0112) if(data>=10)
014D 306A CPI R22,0xA
014E E0E0 LDI R30,0
014F 077E CPC R23,R30
0150 F090 BCS 0x0163
(0113) {
(0114) temp=(data%100)/10;
0151 E624 LDI R18,0x64
0152 E030 LDI R19,0
0153 018B MOVW R16,R22
0154 940E08C0 CALL mod16u
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -