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

📄 timer0.lst

📁 protues_atmeg8学习之:timer篇源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    001D E5CF      LDI	R28,0x5F
    001E E0D4      LDI	R29,4
    001F BFCD      OUT	0x3D,R28
    0020 BFDE      OUT	0x3E,R29
    0021 51C0      SUBI	R28,0x10
    0022 40D0      SBCI	R29,0
    0023 EA0A      LDI	R16,0xAA
    0024 8308      STD	Y+0,R16
    0025 2400      CLR	R0
    0026 E6E3      LDI	R30,0x63
    0027 E0F0      LDI	R31,0
    0028 E010      LDI	R17,0
    0029 36E5      CPI	R30,0x65
    002A 07F1      CPC	R31,R17
    002B F011      BEQ	0x002E
    002C 9201      ST	R0,Z+
    002D CFFB      RJMP	0x0029
    002E 8300      STD	Z+0,R16
    002F E3E6      LDI	R30,0x36
    0030 E0F0      LDI	R31,0
    0031 E6A0      LDI	R26,0x60
    0032 E0B0      LDI	R27,0
    0033 E010      LDI	R17,0
    0034 33E9      CPI	R30,0x39
    0035 07F1      CPC	R31,R17
    0036 F021      BEQ	0x003B
    0037 95C8      LPM
    0038 9631      ADIW	R30,1
    0039 920D      ST	R0,X+
    003A CFF9      RJMP	0x0034
    003B D0E8      RCALL	_main
_exit:
    003C CFFF      RJMP	_exit
FILE: F:\Learn\AVR\Pro_Mega8\Timer\Timer0\Delay.h
(0001) //延时1MS
(0002) void delay_1ms(void)
(0003) { 
(0004)     unsigned int i;
(0005)     for(i=1;i<(unsigned int)(1144-2);i++)
_delay_1ms:
  i                    --> R16
    003D E001      LDI	R16,1
    003E E010      LDI	R17,0
    003F C002      RJMP	0x0042
    0040 5F0F      SUBI	R16,0xFF
    0041 4F1F      SBCI	R17,0xFF
    0042 3706      CPI	R16,0x76
    0043 E0E4      LDI	R30,4
    0044 071E      CPC	R17,R30
    0045 F3D0      BCS	0x0040
(0006)         ;
(0007) }
    0046 9508      RET
_delay_ms:
  i                    --> R20
  n                    --> R22
    0047 D148      RCALL	push_gset2
    0048 01B8      MOVW	R22,R16
(0008) 
(0009) //延时nMS
(0010) void delay_ms(unsigned int n)
(0011) {
(0012)     unsigned int i=0;
    0049 2744      CLR	R20
    004A 2755      CLR	R21
    004B C003      RJMP	0x004F
(0013)     while(i<n)
(0014)     {
(0015) 	    delay_1ms();
    004C DFF0      RCALL	_delay_1ms
(0016)         i++;
    004D 5F4F      SUBI	R20,0xFF
    004E 4F5F      SBCI	R21,0xFF
    004F 1746      CP	R20,R22
    0050 0757      CPC	R21,R23
    0051 F3D0      BCS	0x004C
(0017)     }
(0018) } 
    0052 D122      RCALL	pop_gset2
    0053 9508      RET
FILE: F:\Learn\AVR\Pro_Mega8\Timer\Timer0\Timer0.C
(0001) /******************************************/
(0002) //文件名:Timer0.c
(0003) //功能: T/C0和INT0的应用
(0004) //作者:  young
(0005) //时间: 2006.10.1
(0006) //目标MCU:ATmega8   
(0007) //晶振:  8MHZ
(0008) /******************************************/
(0009) #include <iom8v.h>
(0010) #include <macros.h>
(0011) #include "Delay.h"
(0012) 
(0013) unsigned char KeyDown;   //全局变量,用来记录按键按下次数
(0014) unsigned char CountNum;  //记录T/C0中断,每中断一次是1/500S
(0015) unsigned char TimeNum[3]={0, 0, 0}; //记录中断时间,分,秒,百分秒
(0016) 
(0017) //初始化端口
(0018) void Init_Port(void)
(0019) {
(0020) 	DDRB=0xFF;	  //设置B口为输出模式
_Init_Port:
    0054 EF8F      LDI	R24,0xFF
    0055 BB87      OUT	0x17,R24
(0021) 	PORTB=0xFF;	  //置高电平
    0056 BB88      OUT	0x18,R24
(0022) 	DDRC=0x7F;
    0057 E78F      LDI	R24,0x7F
    0058 BB84      OUT	0x14,R24
(0023) 	PORTC=0x7F;
    0059 BB85      OUT	0x15,R24
(0024) 	DDRD|=0x03;
    005A B381      IN	R24,0x11
    005B 6083      ORI	R24,3
    005C BB81      OUT	0x11,R24
(0025) 	PORTD=0xFF;
    005D EF8F      LDI	R24,0xFF
    005E BB82      OUT	0x12,R24
(0026) }
    005F 9508      RET
(0027) 
(0028) //初始化外部中断
(0029) void Init_Int(void)
(0030) {
(0031)     MCUCR|=0x02;  //INT0下降沿触发
_Init_Int:
    0060 B785      IN	R24,0x35
    0061 6082      ORI	R24,2
    0062 BF85      OUT	0x35,R24
(0032) 	GICR|=0x40;   //打开INT0中断
    0063 B78B      IN	R24,0x3B
    0064 6480      ORI	R24,0x40
    0065 BF8B      OUT	0x3B,R24
(0033)     GIFR|=0x40;   //清除INT0中断标志位
    0066 B78A      IN	R24,0x3A
    0067 6480      ORI	R24,0x40
    0068 BF8A      OUT	0x3A,R24
(0034) }
    0069 9508      RET
(0035) 
(0036) //初始化T/C0
(0037) void Init_Timer0(void)
(0038) {
(0039)     TCCR0=0x00;           //T/C0工作于定时方式,先停止T/C0
_Init_Timer0:
    006A 2422      CLR	R2
    006B BE23      OUT	0x33,R2
(0040)     TCNT0=0x06;           //计数初始值6 
    006C E086      LDI	R24,6
    006D BF82      OUT	0x32,R24
(0041)     TIMSK|=(1<<TOIE0);    //开放TOV0中断	
    006E B789      IN	R24,0x39
    006F 6081      ORI	R24,1
    0070 BF89      OUT	0x39,R24
(0042) }
    0071 9508      RET
_Display:
  num                  --> Y+0
  i                    --> R22
  timer                --> R10
    0072 D120      RCALL	push_gset3
    0073 0158      MOVW	R10,R16
    0074 972A      SBIW	R28,0xA
(0043) 
(0044) //显示定时时间
(0045) void Display(unsigned char *timer)
(0046) {
(0047)     unsigned char i=0;	
    0075 2766      CLR	R22
(0048) 	unsigned char num[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 
    0076 E286      LDI	R24,0x26
    0077 E090      LDI	R25,0
    0078 01FE      MOVW	R30,R28
    0079 E00A      LDI	R16,0xA
    007A E010      LDI	R17,0
    007B 93FA      ST	R31,-Y
    007C 93EA      ST	R30,-Y
    007D 939A      ST	R25,-Y
    007E 938A      ST	R24,-Y
    007F D11C      RCALL	asgncblk
(0049) 	                       0x6D, 0x7D, 0x07, 0x7F, 0x6F};
(0050)     //依次显示"00:00.00"
(0051) 	for(i=0; i<6; i++)
    0080 C032      RJMP	0x00B3
(0052)     {		    
(0053) 		 PORTC&=~(1<<i);
    0081 E001      LDI	R16,1
    0082 2F16      MOV	R17,R22
    0083 D112      RCALL	lsl8
    0084 2E20      MOV	R2,R16
    0085 9420      COM	R2
    0086 B235      IN	R3,0x15
    0087 2032      AND	R3,R2
    0088 BA35      OUT	0x15,R3
(0054) 	     switch(i)
    0089 2F46      MOV	R20,R22
    008A 2755      CLR	R21
    008B 3041      CPI	R20,1
    008C E0E0      LDI	R30,0
    008D 075E      CPC	R21,R30
    008E F029      BEQ	0x0094
    008F 3043      CPI	R20,3
    0090 E0E0      LDI	R30,0
    0091 075E      CPC	R21,R30
    0092 F009      BEQ	0x0094
    0093 C00D      RJMP	0x00A1
(0055) 		 {
(0056) 		 case 1:
(0057) 		 case 3:
(0058) 			  PORTB=num[timer[i]]+0x80;
    0094 2FE6      MOV	R30,R22
    0095 27FF      CLR	R31
    0096 0DEA      ADD	R30,R10
    0097 1DFB      ADC	R31,R11
    0098 81E0      LDD	R30,Z+0
    0099 27FF      CLR	R31
    009A 01CE      MOVW	R24,R28
    009B 0FE8      ADD	R30,R24
    009C 1FF9      ADC	R31,R25
    009D 8180      LDD	R24,Z+0
    009E 5880      SUBI	R24,0x80
    009F BB88      OUT	0x18,R24
(0059) 			  break;			
    00A0 C00B      RJMP	0x00AC
(0060) 		 default:	
(0061) 			  PORTB=num[timer[i]];
    00A1 2FE6      MOV	R30,R22
    00A2 27FF      CLR	R31
    00A3 0DEA      ADD	R30,R10
    00A4 1DFB      ADC	R31,R11
    00A5 81E0      LDD	R30,Z+0
    00A6 27FF      CLR	R31
    00A7 01CE      MOVW	R24,R28
    00A8 0FE8      ADD	R30,R24
    00A9 1FF9      ADC	R31,R25
    00AA 8020      LDD	R2,Z+0
    00AB BA28      OUT	0x18,R2
(0062) 			  break;
(0063) 		 }		
(0064) 		 delay_ms(1);
    00AC E001      LDI	R16,1
    00AD E010      LDI	R17,0
    00AE DF98      RCALL	_delay_ms
(0065) 		 PORTC|=0xFF;	
    00AF B385      IN	R24,0x15
    00B0 6F8F      ORI	R24,0xFF
    00B1 BB85      OUT	0x15,R24
    00B2 9563      INC	R22
    00B3 3066      CPI	R22,6
    00B4 F408      BCC	0x00B6
    00B5 CFCB      RJMP	0x0081
(0066)     }
(0067) }
    00B6 962A      ADIW	R28,0xA
    00B7 D0BF      RCALL	pop_gset3
    00B8 9508      RET
_int0_fun:
    00B9 922A      ST	R2,-Y
    00BA 930A      ST	R16,-Y
    00BB 931A      ST	R17,-Y
    00BC 938A      ST	R24,-Y
    00BD 939A      ST	R25,-Y
    00BE 93EA      ST	R30,-Y
    00BF B62F      IN	R2,0x3F
    00C0 922A      ST	R2,-Y
(0068) 
(0069) //INT0中断函数
(0070) #pragma interrupt_handler int0_fun:iv_INT0
(0071) void int0_fun(void)
(0072) {
(0073)     KeyDown++;
    00C1 91800064  LDS	R24,_KeyDown
    00C3 5F8F      SUBI	R24,0xFF
    00C4 93800064  STS	_KeyDown,R24
(0074) 	switch(KeyDown)
    00C6 2F08      MOV	R16,R24
    00C7 2711      CLR	R17
    00C8 3001      CPI	R16,1
    00C9 E0E0      LDI	R30,0
    00CA 071E      CPC	R17,R30
    00CB F029      BEQ	0x00D1
    00CC 3002      CPI	R16,2
    00CD E0E0      LDI	R30,0
    00CE 071E      CPC	R17,R30

⌨️ 快捷键说明

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