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

📄 timer0.s

📁 protues_atmeg8学习之:timer篇源代码
💻 S
字号:
	.module Timer0.C
	.area text(rom, con, rel)
	.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0/Delay.h
	.dbfunc e delay_1ms _delay_1ms fV
;              i -> R16,R17
	.even
_delay_1ms::
	.dbline -1
	.dbline 3
; /******************************************/
; //文件名:Timer0.c
; //功能: T/C0和INT0的应用
	.dbline 5
; //作者:  young
; //时间: 2006.10.1
	ldi R16,1
	ldi R17,0
	rjmp L5
L2:
	.dbline 6
L3:
	.dbline 5
	subi R16,255  ; offset = 1
	sbci R17,255
L5:
	.dbline 5
	cpi R16,118
	ldi R30,4
	cpc R17,R30
	brlo L2
	.dbline -2
	.dbline 7
; //目标MCU:ATmega8   
; //晶振:  8MHZ
L1:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e delay_ms _delay_ms fV
;              i -> R20,R21
;              n -> R22,R23
	.even
_delay_ms::
	rcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 11
; /******************************************/
; #include <iom8v.h>
; #include <macros.h>
; #include "Delay.h"
	.dbline 12
; 
	clr R20
	clr R21
	rjmp L8
L7:
	.dbline 14
	.dbline 15
	rcall _delay_1ms
	.dbline 16
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 17
L8:
	.dbline 13
; unsigned char KeyDown;   //全局变量,用来记录按键按下次数
	cp R20,R22
	cpc R21,R23
	brlo L7
	.dbline -2
	.dbline 18
; unsigned char CountNum;  //记录T/C0中断,每中断一次是1/500S
; unsigned char TimeNum[3]={0, 0, 0}; //记录中断时间,分,秒,百分秒
; 
; //初始化端口
; void Init_Port(void)
L6:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 22 i
	.dbend
	.area data(ram, con, rel)
	.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0/Delay.h
_TimeNum::
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0/Delay.h
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0/Delay.h
	.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0\Timer0.C
	.dbsym e TimeNum _TimeNum A[3:3]c
	.area text(rom, con, rel)
	.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0\Timer0.C
	.dbfunc e Init_Port _Init_Port fV
	.even
_Init_Port::
	.dbline -1
	.dbline 19
; {
	.dbline 20
; 	DDRB=0xFF;	  //设置B口为输出模式
	ldi R24,255
	out 0x17,R24
	.dbline 21
; 	PORTB=0xFF;	  //置高电平
	out 0x18,R24
	.dbline 22
; 	DDRC=0x7F;
	ldi R24,127
	out 0x14,R24
	.dbline 23
; 	PORTC=0x7F;
	out 0x15,R24
	.dbline 24
; 	DDRD|=0x03;
	in R24,0x11
	ori R24,3
	out 0x11,R24
	.dbline 25
; 	PORTD=0xFF;
	ldi R24,255
	out 0x12,R24
	.dbline -2
	.dbline 26
; }
L10:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Init_Int _Init_Int fV
	.even
_Init_Int::
	.dbline -1
	.dbline 30
; 
; //初始化外部中断
; void Init_Int(void)
; {
	.dbline 31
;     MCUCR|=0x02;  //INT0下降沿触发
	in R24,0x35
	ori R24,2
	out 0x35,R24
	.dbline 32
; 	GICR|=0x40;   //打开INT0中断
	in R24,0x3b
	ori R24,64
	out 0x3b,R24
	.dbline 33
;     GIFR|=0x40;   //清除INT0中断标志位
	in R24,0x3a
	ori R24,64
	out 0x3a,R24
	.dbline -2
	.dbline 34
; }
L11:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Init_Timer0 _Init_Timer0 fV
	.even
_Init_Timer0::
	.dbline -1
	.dbline 38
; 
; //初始化T/C0
; void Init_Timer0(void)
; {
	.dbline 39
;     TCCR0=0x00;           //T/C0工作于定时方式,先停止T/C0
	clr R2
	out 0x33,R2
	.dbline 40
;     TCNT0=0x06;           //计数初始值6 
	ldi R24,6
	out 0x32,R24
	.dbline 41
;     TIMSK|=(1<<TOIE0);    //开放TOV0中断	
	in R24,0x39
	ori R24,1
	out 0x39,R24
	.dbline -2
	.dbline 42
; }
L12:
	.dbline 0 ; func end
	ret
	.dbend
	.area lit(rom, con, rel)
L14:
	.byte 63,6
	.byte 91,'O
	.byte 'f,'m
	.byte 125,7
	.byte 127,'o
	.area text(rom, con, rel)
	.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0\Timer0.C
	.dbfunc e Display _Display fV
;            num -> y+0
;              i -> R22
;          timer -> R10,R11
	.even
_Display::
	rcall push_gset3
	movw R10,R16
	sbiw R28,10
	.dbline -1
	.dbline 46
; 
; //显示定时时间
; void Display(unsigned char *timer)
; {
	.dbline 47
;     unsigned char i=0;	
	clr R22
	.dbline 48
; 	unsigned char num[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 
	ldi R24,<L14
	ldi R25,>L14
	movw R30,R28
	ldi R16,10
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 51
; 	                       0x6D, 0x7D, 0x07, 0x7F, 0x6F};
;     //依次显示"00:00.00"
; 	for(i=0; i<6; i++)
	rjmp L18
L15:
	.dbline 52
;     {		    
	.dbline 53
; 		 PORTC&=~(1<<i);
	ldi R16,1
	mov R17,R22
	rcall lsl8
	mov R2,R16
	com R2
	in R3,0x15
	and R3,R2
	out 0x15,R3
	.dbline 54
; 	     switch(i)
	mov R20,R22
	clr R21
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	breq L22
	cpi R20,3
	ldi R30,0
	cpc R21,R30
	breq L22
	rjmp L19
X0:
	.dbline 55
; 		 {
L22:
	.dbline 58
; 		 case 1:
; 		 case 3:
; 			  PORTB=num[timer[i]]+0x80;
	mov R30,R22
	clr R31
	add R30,R10
	adc R31,R11
	ldd R30,z+0
	clr R31
	movw R24,R28
	add R30,R24
	adc R31,R25
	ldd R24,z+0
	subi R24,128    ; addi 128
	out 0x18,R24
	.dbline 59
; 			  break;			
	rjmp L20
L19:
	.dbline 61
; 		 default:	
; 			  PORTB=num[timer[i]];
	mov R30,R22
	clr R31
	add R30,R10
	adc R31,R11
	ldd R30,z+0
	clr R31
	movw R24,R28
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	out 0x18,R2
	.dbline 62
; 			  break;
L20:
	.dbline 64
	ldi R16,1
	ldi R17,0
	rcall _delay_ms
	.dbline 65
	in R24,0x15
	ori R24,255
	out 0x15,R24
	.dbline 66
L16:
	.dbline 51
	inc R22
L18:
	.dbline 51
	cpi R22,6
	brsh X1
	rjmp L15
X1:
	.dbline -2
	.dbline 67
; 		 }		
; 		 delay_ms(1);
; 		 PORTC|=0xFF;	
;     }
; }
L13:
	adiw R28,10
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym l num 0 A[10:10]c
	.dbsym r i 22 c
	.dbsym r timer 10 pc
	.dbend
	.area vector(rom, abs)
	.org 2
	rjmp _int0_fun
	.area text(rom, con, rel)
	.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0\Timer0.C
	.dbfunc e int0_fun _int0_fun fV
	.even
_int0_fun::
	st -y,R2
	st -y,R16
	st -y,R17
	st -y,R24
	st -y,R25
	st -y,R30
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 72
; 
; //INT0中断函数
; #pragma interrupt_handler int0_fun:iv_INT0
; void int0_fun(void)
; {
	.dbline 73
;     KeyDown++;
	lds R24,_KeyDown
	subi R24,255    ; addi 1
	sts _KeyDown,R24
	.dbline 74
; 	switch(KeyDown)
	mov R16,R24
	clr R17
	cpi R16,1
	ldi R30,0
	cpc R17,R30
	breq L27
	cpi R16,2
	ldi R30,0
	cpc R17,R30
	breq L28
	rjmp L24
X2:
	.dbline 75
; 	{
L27:
	.dbline 77
; 	case 1:
; 	    TCNT0=0x06;      //计数初始值6 
	ldi R24,6
	out 0x32,R24
	.dbline 78
; 		TCCR0=0x03;      //打开T/C0,系统时钟64分频 
	ldi R24,3
	out 0x33,R24
	.dbline 79
; 		break;
	rjmp L25
L28:
	.dbline 81
; 	case 2:
; 		TCCR0=0x00;      //关闭T/C0
	clr R2
	out 0x33,R2
	.dbline 82
; 		break;
	rjmp L25
L24:
	.dbline 84
	clr R2
	sts _TimeNum+2,R2
	sts _TimeNum+1,R2
	sts _TimeNum,R2
	.dbline 85
	sts _KeyDown,R2
	.dbline 86
L25:
	.dbline -2
	.dbline 88
; 	default:
; 		TimeNum[0]=TimeNum[1]=TimeNum[2]=0;//计时清零		
; 		KeyDown=0;
; 		break;		
; 	}
; }
L23:
	ld R2,y+
	out 0x3f,R2
	ld R30,y+
	ld R25,y+
	ld R24,y+
	ld R17,y+
	ld R16,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbend
	.area vector(rom, abs)
	.org 18
	rjmp _timer0_fun
	.area text(rom, con, rel)
	.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0\Timer0.C
	.dbfunc e timer0_fun _timer0_fun fV
	.even
_timer0_fun::
	st -y,R2
	st -y,R24
	st -y,R25
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 93
; 
; //T/C0中断函数
; #pragma interrupt_handler timer0_fun:iv_TIMER0_OVF 
; void timer0_fun(void)
; {
	.dbline 94
;     TCNT0=0x06 ;               //重装计数初始值6    
	ldi R24,6
	out 0x32,R24
	.dbline 95
; 	if(++CountNum==5)           
	lds R24,_CountNum
	subi R24,255    ; addi 1
	mov R2,R24
	sts _CountNum,R2
	cpi R24,5
	brne L32
	.dbline 96
;     {
	.dbline 97
; 	    CountNum=0;            //计数到5次,计数值复位
	clr R2
	sts _CountNum,R2
	.dbline 98
;         TimeNum[2]++;          //秒的百分位加1
	lds R24,_TimeNum+2
	subi R24,255    ; addi 1
	sts _TimeNum+2,R24
	.dbline 99
;         if(TimeNum[2]==100)
	cpi R24,100
	brne L35
	.dbline 100
;         {
	.dbline 101
; 		    TimeNum[2]=0;
	sts _TimeNum+2,R2
	.dbline 102
;             TimeNum[1]++;      //秒进位
	lds R24,_TimeNum+1
	subi R24,255    ; addi 1
	sts _TimeNum+1,R24
	.dbline 103
; 		}
L35:
	.dbline 104
;         if(TimeNum[1]==60)
	lds R24,_TimeNum+1
	cpi R24,60
	brne L40
	.dbline 105
;         {
	.dbline 106
; 		   TimeNum[1]=0;
	clr R2
	sts _TimeNum+1,R2
	.dbline 107
;            TimeNum[0]++;      //分进位
	lds R24,_TimeNum
	subi R24,255    ; addi 1
	sts _TimeNum,R24
	.dbline 108
; 		}             
L40:
	.dbline 109
;         if(TimeNum[0]==60)
	lds R24,_TimeNum
	cpi R24,60
	brne L44
	.dbline 110
;         {
	.dbline 111
; 			TimeNum[0]=0;
	clr R2
	sts _TimeNum,R2
	.dbline 112
; 		}
L44:
	.dbline 113
L32:
	.dbline -2
	.dbline 114
;     }	
; }
L31:
	ld R2,y+
	out 0x3f,R2
	ld R25,y+
	ld R24,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbend
	.area lit(rom, con, rel)
L47:
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.area text(rom, con, rel)
	.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0\Timer0.C
	.dbfunc e main _main fV
;          timer -> y+0
	.even
_main::
	sbiw R28,6
	.dbline -1
	.dbline 118
; 
; //主函数
; void main()
; {
	.dbline 119
;     unsigned char timer[6]={0, 0, 0, 0, 0, 0};
	ldi R24,<L47
	ldi R25,>L47
	movw R30,R28
	ldi R16,6
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 121
; 	
; 	CLI();         //先关闭全局中断
	cli
	.dbline 122
; 	Init_Port();   //初始化端口
	rcall _Init_Port
	.dbline 123
;     Init_Int();    //初始化外部中断	
	rcall _Init_Int
	.dbline 124
;     Init_Timer0(); //初始化T/C0
	rcall _Init_Timer0
	.dbline 126
; 	
; 	KeyDown=0;     //初始化全局变量
	clr R2
	sts _KeyDown,R2
	.dbline 127
; 	CountNum=0;
	sts _CountNum,R2
	.dbline 128
; 	SEI();         //打开全局中断
	sei
	rjmp L49
L48:
	.dbline 130
	.dbline 131
	ldi R17,10
	lds R16,_TimeNum
	rcall div8u
	std y+0,R16
	.dbline 132
	ldi R17,10
	lds R16,_TimeNum
	rcall mod8u
	std y+1,R16
	.dbline 133
	ldi R17,10
	lds R16,_TimeNum+1
	rcall div8u
	std y+2,R16
	.dbline 134
	ldi R17,10
	lds R16,_TimeNum+1
	rcall mod8u
	std y+3,R16
	.dbline 135
	ldi R17,10
	lds R16,_TimeNum+2
	rcall div8u
	std y+4,R16
	.dbline 136
	ldi R17,10
	lds R16,_TimeNum+2
	rcall mod8u
	std y+5,R16
	.dbline 137
	movw R16,R28
	rcall _Display
	.dbline 138
L49:
	.dbline 129
	rjmp L48
X3:
	.dbline -2
	.dbline 139
; 	while (1)
; 	{	           
; 		timer[0]=TimeNum[0]/10;
; 		timer[1]=TimeNum[0]%10;
; 		timer[2]=TimeNum[1]/10;
; 		timer[3]=TimeNum[1]%10;
; 		timer[4]=TimeNum[2]/10;
; 		timer[5]=TimeNum[2]%10;			
; 		Display(timer);          //显示时间
;      }
; }
L46:
	adiw R28,6
	.dbline 0 ; func end
	ret
	.dbsym l timer 0 A[6:6]c
	.dbend
	.area bss(ram, con, rel)
	.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0\Timer0.C
_CountNum::
	.blkb 1
	.dbsym e CountNum _CountNum c
_KeyDown::
	.blkb 1
	.dbsym e KeyDown _KeyDown c

⌨️ 快捷键说明

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