外部中断.lst

来自「ICC mega8例子」· LST 代码 · 共 373 行

LST
373
字号
__text_start:
__start:
      1C E5CF      LDI	R28,0x5F
      1D E0D4      LDI	R29,4
      1E BFCD      OUT	0x3D,R28
      1F BFDE      OUT	0x3E,R29
      20 51CE      SUBI	R28,0x1E
      21 40D0      SBCI	R29,0
      22 EA0A      LDI	R16,0xAA
      23 8308      STD	Y+0,R16
      24 2400      CLR	R0
      25 E6E1      LDI	R30,0x61
      26 E0F0      LDI	R31,0
      27 E010      LDI	R17,0
      28 36E1      CPI	R30,0x61
      29 07F1      CPC	R31,R17
      2A F011      BEQ	0x002D
      2B 9201      ST	R0,Z+
      2C CFFB      RJMP	0x0028
      2D 8300      STD	Z+0,R16
      2E E3E6      LDI	R30,0x36
      2F E0F0      LDI	R31,0
      30 E6A0      LDI	R26,0x60
      31 E0B0      LDI	R27,0
      32 E010      LDI	R17,0
      33 E000      LDI	R16,0
      34 BF0B      OUT	0x3B,R16
      35 33E7      CPI	R30,0x37
      36 07F1      CPC	R31,R17
      37 F021      BEQ	0x003C
      38 95C8      LPM
      39 9631      ADIW	R30,1
      3A 920D      ST	R0,X+
      3B CFF9      RJMP	0x0035
      3C D07E      RCALL	_main
_exit:
      3D CFFF      RJMP	_exit
FILE: E:\xiaozhiyong2009\设计资料\项目设计\mega8_C语言常用程序\ICCAVR_mega8_外部中断\外部中断.c
(0001) //ICC-AVR application builder : 2009-3-10 17:06:48
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004) 
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007) unsigned char i=0;
(0008) 
(0009) void port_init(void)
(0010) {
(0011)  PORTB = 0x00;
_port_init:
      3E 2422      CLR	R2
      3F BA28      OUT	0x18,R2
(0012)  DDRB  = 0x00;
      40 BA27      OUT	0x17,R2
(0013)  PORTC = 0x00; //m103 output only
      41 BA25      OUT	0x15,R2
(0014)  DDRC  = 0x00;
      42 BA24      OUT	0x14,R2
(0015)  PORTD = 0x00;
      43 BA22      OUT	0x12,R2
(0016)  DDRD  = 0x00;
      44 BA21      OUT	0x11,R2
      45 9508      RET
(0017) }
(0018) 
(0019) //call this routine to initialize all peripherals
(0020) void init_devices(void)
(0021) {
(0022)  //stop errant interrupts until set up
(0023)  CLI(); //disable all interrupts
_init_devices:
      46 94F8      BCLR	7
(0024)  port_init();
      47 DFF6      RCALL	_port_init
(0025) 
(0026)  MCUCR = 0x00;
      48 2422      CLR	R2
      49 BE25      OUT	0x35,R2
(0027)  GICR  = 0x00;
      4A BE2B      OUT	0x3B,R2
(0028)  TIMSK = 0x00; //timer interrupt sources
      4B BE29      OUT	0x39,R2
(0029)  SEI(); //re-enable interrupts
      4C 9478      BSET	7
      4D 9508      RET
(0030)  //all peripherals are now initialized
(0031) }
(0032) 
(0033) /************************************
(0034) 用    途:微秒级延时程序
(0035) Taget   :mega8
(0036) crystal :8M
(0037) 介    绍:在8M的晶振上进行us级的延时
(0038) 入口参数:
(0039) *************************************/
(0040) void delay_us(int time)
(0041) {
(0042)     do
(0043)     {
(0044)         time--;
_delay_us:
  time                 --> R16
      4E 5001      SUBI	R16,1
      4F 4010      SBCI	R17,0
(0045)     } 
(0046)     while (time > 1);
      50 E081      LDI	R24,1
      51 E090      LDI	R25,0
      52 1780      CP	R24,R16
      53 0791      CPC	R25,R17
      54 F3CC      BLT	0x004E
      55 9508      RET
_show_2_digit:
  i                    --> Y,+1
  digi                 --> R10
      56 92AA      ST	R10,-Y
      57 2EA0      MOV	R10,R16
(0047) }
(0048) 
(0049) 
(0050) /************************************
(0051) 用    途:两位数码管显示一个数
(0052) Taget   :mega8
(0053) crystal :8M
(0054) 介    绍:共阳数码管
(0055) 	  	 1-PC1(片选)
(0056) 		 2-PC0
(0057) 		 -----
(0058) 		 a-PB0(数据)
(0059) 		 b-PB1
(0060) 		 ...
(0061) 		 h-PB6
(0062) 		 DP-PB7
(0063) 入口参数:要显示的数,十进制表示
(0064) *************************************/
(0065) const unsigned char num[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
(0066) 	   			0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0067) void show_2_digit(unsigned char digi)
(0068) {
(0069)  unsigned char i;
(0070)  DDRC=0xff;
      58 EF8F      LDI	R24,0xFF
      59 BB84      OUT	0x14,R24
(0071)  DDRB=0xff;
      5A BB87      OUT	0x17,R24
(0072)  PORTC=0;//关片选
      5B 2422      CLR	R2
      5C BA25      OUT	0x15,R2
(0073)  PORTB=~num[(unsigned char )(digi/10)];//显示十位
      5D E02A      LDI	R18,0xA
      5E E030      LDI	R19,0
      5F 2D0A      MOV	R16,R10
      60 2711      CLR	R17
      61 D066      RCALL	div16s
      62 2FE0      MOV	R30,R16
      63 27FF      CLR	R31
      64 E286      LDI	R24,0x26
      65 E090      LDI	R25,0
      66 0FE8      ADD	R30,R24
      67 1FF9      ADC	R31,R25
      68 9024      LPM	R2,0(Z)
      69 9420      COM	R2
      6A BA28      OUT	0x18,R2
(0074)  PORTC=(0x1<<1);//开十位的显示
      6B E082      LDI	R24,2
      6C BB85      OUT	0x15,R24
(0075)  delay_us(200);
      6D EC08      LDI	R16,0xC8
      6E E010      LDI	R17,0
      6F DFDE      RCALL	_delay_us
(0076)  PORTC=0;//关显示
      70 2422      CLR	R2
      71 BA25      OUT	0x15,R2
(0077)  PORTB=~num[(unsigned char )(digi%10)];//显示个位
      72 E02A      LDI	R18,0xA
      73 E030      LDI	R19,0
      74 2D0A      MOV	R16,R10
      75 2711      CLR	R17
      76 D04D      RCALL	mod16s
      77 2FE0      MOV	R30,R16
      78 27FF      CLR	R31
      79 E286      LDI	R24,0x26
      7A E090      LDI	R25,0
      7B 0FE8      ADD	R30,R24
      7C 1FF9      ADC	R31,R25
      7D 9024      LPM	R2,0(Z)
      7E 9420      COM	R2
      7F BA28      OUT	0x18,R2
(0078)  PORTC=(0x1<<0);//开个位的显示
      80 E081      LDI	R24,1
      81 BB85      OUT	0x15,R24
(0079)  delay_us(200);
      82 EC08      LDI	R16,0xC8
      83 E010      LDI	R17,0
      84 DFC9      RCALL	_delay_us
(0080)  PORTC=0x0;//关显示
      85 2422      CLR	R2
      86 BA25      OUT	0x15,R2
      87 90A9      LD	R10,Y+
      88 9508      RET
(0081) }
(0082) 
(0083) /************************************
(0084) 用    途:打开外部中断
(0085) 介    绍:
(0086) 入口参数:
(0087) 出口参数:
(0088) *************************************/
(0089) void int_init()
(0090) {
(0091)  CLI();
_int_init:
      89 94F8      BCLR	7
(0092)  PORTD|=(1<<PD2)|(1<<PD3);
      8A B382      IN	R24,0x12
      8B 608C      ORI	R24,0xC
      8C BB82      OUT	0x12,R24
(0093)  MCUCR|=(1<<ISC11)|(1<<ISC01);//3-0,外部中断定1,0的控制方式
      8D B785      IN	R24,0x35
      8E 608A      ORI	R24,0xA
      8F BF85      OUT	0x35,R24
(0094)  //MCUCR=3-2,0是低电平中断,1是下(降沿)和上(升沿)中断,2是下中断,3是上中断
(0095)  GICR|=(1<<INT0)|(1<<INT1);//7,6外部中断1,0使能
      90 B78B      IN	R24,0x3B
      91 6C80      ORI	R24,0xC0
      92 BF8B      OUT	0x3B,R24
(0096)  SEI();
      93 9478      BSET	7
      94 9508      RET
_init_0:
      95 938A      ST	R24,-Y
      96 B78F      IN	R24,0x3F
      97 938A      ST	R24,-Y
(0097) }
(0098) 
(0099) /************************************
(0100) 用    途:中断0服务子程序
(0101) 介    绍:
(0102) 入口参数:
(0103) 出口参数:
(0104) *************************************/
(0105) #pragma interrupt_handler init_0:2
(0106) void init_0()
(0107) {
(0108)  i--;
      98 9180 0060 LDS	R24,i
      9A 5081      SUBI	R24,1
      9B 9380 0060 STS	i,R24
(0109)  if (i==0)i=99;
      9D 2388      TST	R24
      9E F419      BNE	0x00A2
      9F E683      LDI	R24,0x63
      A0 9380 0060 STS	i,R24
      A2 9189      LD	R24,Y+
      A3 BF8F      OUT	0x3F,R24
      A4 9189      LD	R24,Y+
      A5 9518      RETI
_init_1:
      A6 922A      ST	R2,-Y
      A7 938A      ST	R24,-Y
      A8 939A      ST	R25,-Y
      A9 B62F      IN	R2,0x3F
      AA 922A      ST	R2,-Y
(0110) }
(0111) 
(0112) /************************************
(0113) 用    途:中断1服务子程序
(0114) 介    绍:
(0115) 入口参数:
(0116) 出口参数:
(0117) *************************************/
(0118) #pragma interrupt_handler init_1:3
(0119) void init_1()
(0120) {
(0121)  i++;
      AB 9180 0060 LDS	R24,i
      AD 5F8F      SUBI	R24,0xFF
      AE 9380 0060 STS	i,R24
(0122)  if (i==100)i=0;
      B0 3684      CPI	R24,0x64
      B1 F419      BNE	0x00B5
      B2 2422      CLR	R2
      B3 9220 0060 STS	i,R2
      B5 9029      LD	R2,Y+
      B6 BE2F      OUT	0x3F,R2
      B7 9199      LD	R25,Y+
      B8 9189      LD	R24,Y+
      B9 9029      LD	R2,Y+
      BA 9518      RETI
(0123) }
(0124) 
(0125) void main()
(0126) {
(0127)  port_init();
_main:
      BB DF82      RCALL	_port_init
(0128)  init_devices();
      BC DF89      RCALL	_init_devices
(0129)  
(0130)  int_init();//中断初始化
      BD DFCB      RCALL	_int_init
      BE C003      RJMP	0x00C2
(0131)  while(1)
(0132)  {
(0133)   show_2_digit(i);
FILE: <library>
      BF 9100 0060 LDS	R16,i
      C1 DF94      RCALL	_show_2_digit
      C2 CFFC      RJMP	0x00BF
      C3 9508      RET
mod16s:
      C4 9468      BSET	6
      C5 92DA      ST	R13,-Y
      C6 2ED1      MOV	R13,R17
      C7 C004      RJMP	0x00CC
div16s:
      C8 94E8      BCLR	6
      C9 92DA      ST	R13,-Y
      CA 2ED1      MOV	R13,R17
      CB 26D3      EOR	R13,R19
      CC FF17      SBRS	R17,7
      CD C004      RJMP	0x00D2
      CE 9510      COM	R17
      CF 9500      COM	R16
      D0 5F0F      SUBI	R16,0xFF
      D1 4F1F      SBCI	R17,0xFF
      D2 FF37      SBRS	R19,7
      D3 C004      RJMP	0x00D8
      D4 9530      COM	R19
      D5 9520      COM	R18
      D6 5F2F      SUBI	R18,0xFF
      D7 4F3F      SBCI	R19,0xFF
      D8 D00B      RCALL	xdiv16u
      D9 FED7      SBRS	R13,7
      DA C004      RJMP	0x00DF
      DB 9510      COM	R17
      DC 9500      COM	R16
      DD 5F0F      SUBI	R16,0xFF
      DE 4F1F      SBCI	R17,0xFF
      DF 90D9      LD	R13,Y+
      E0 9508      RET
mod16u:
      E1 9468      BSET	6
      E2 C001      RJMP	xdiv16u
div16u:
      E3 94E8      BCLR	6
xdiv16u:
      E4 92EA      ST	R14,-Y
      E5 92FA      ST	R15,-Y
      E6 938A      ST	R24,-Y
      E7 24EE      CLR	R14
      E8 24FF      CLR	R15
      E9 E180      LDI	R24,0x10
      EA 0F00      LSL	R16
      EB 1F11      ROL	R17
      EC 1CEE      ROL	R14
      ED 1CFF      ROL	R15
      EE 16E2      CP	R14,R18
      EF 06F3      CPC	R15,R19
      F0 F018      BCS	0x00F4
      F1 1AE2      SUB	R14,R18
      F2 0AF3      SBC	R15,R19
      F3 9503      INC	R16
      F4 958A      DEC	R24
      F5 F7A1      BNE	0x00EA
      F6 F416      BRTC	0x00F9
      F7 2D0E      MOV	R16,R14
      F8 2D1F      MOV	R17,R15
      F9 9189      LD	R24,Y+
      FA 90F9      LD	R15,Y+
      FB 90E9      LD	R14,Y+
      FC 9508      RET

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?