⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lst

📁 单片机中的中断处理模块
💻 LST
📖 第 1 页 / 共 5 页
字号:
__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 + -