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

📄 keyled.s

📁 avr单片机入门小程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module keyled.c
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\按键显示\keyled.c
	.dbfile C:\DOCUME~1\Administrator\桌面\按键显示\delay.h
	.dbfunc e delay_1ms _delay_1ms fV
;              i -> R16,R17
	.even
_delay_1ms::
	.dbline -1
	.dbline 7
; /* 1MHz 下延时程序*/
; 
; #ifndef DELAY_H_H
; #define DELAY_H_H
; 
; void delay_1ms()             //1ms 延时
; {
	.dbline 13
;   unsigned int i;
;  /*
;   for(i=1;i<140;i++)   //1MHz
;   ;
;   */
;   for(i=1331;i>0;i--)   // 8MHz
	ldi R16,1331
	ldi R17,5
	xjmp L5
L2:
	.dbline 14
; ;
L3:
	.dbline 13
	subi R16,1
	sbci R17,0
L5:
	.dbline 13
	cpi R16,0
	cpc R16,R17
	brne L2
X0:
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e delay _delay fV
;              i -> R20,R21
;              n -> R10,R11
	.even
_delay::
	xcall push_xgset300C
	movw R10,R16
	.dbline -1
	.dbline 19
; 
; }
; 
; void delay(unsigned int n)
; {
	.dbline 20
;  unsigned int i=0;
	clr R20
	clr R21
	.dbline 21
;  for(i=0;i<n;i++)
	xjmp L10
L7:
	.dbline 22
;  delay_1ms();
	xcall _delay_1ms
L8:
	.dbline 21
	subi R20,255  ; offset = 1
	sbci R21,255
L10:
	.dbline 21
	cp R20,R10
	cpc R21,R11
	brlo L7
X1:
	.dbline -2
L6:
	.dbline 0 ; func end
	xjmp pop_xgset300C
	.dbsym r i 20 i
	.dbsym r n 10 i
	.dbend
	.area lit(rom, con, rel)
_seg_table::
	.byte 192,249
	.byte 164,176
	.byte 153,146
	.byte 130,248
	.byte 128,144
	.byte 136,131
	.byte 198,161
	.byte 134,142
	.dbfile C:\DOCUME~1\Administrator\桌面\按键显示\keyled.c
	.dbsym e seg_table _seg_table A[16:16]kc
	.area vector(rom, abs)
	.org 64
	jmp _timer0_com_isr
	.area lit(rom, con, rel)
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\按键显示\keyled.c
	.dbfunc e display _display fV
;              j -> <dead>
;              i -> R20
;              k -> R20
	.even
_display::
	st -y,R20
	.dbline -1
	.dbline 19
; /*跑表和计时  
;   8MHz   */
; #include <iom128v.h>
; #include <macros.h>
; #include "delay.h"
; unsigned char  temp;
; unsigned char timer2;     //the num of 5ms
; unsigned int  timer200;  // the num of  1s
; unsigned char work_state; //to set the timer or clock,0表示计时,1表示跑表
; unsigned char time_change; //to sign the state of change
; unsigned char clock_start; // 跑表开始信号,0表示开始,1 表示暂停
; unsigned char time[4]; //array of time
; unsigned char clock[4]; //array of watch
; const unsigned char seg_table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
; 	0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
; #pragma interrupt_handler timer0_com_isr:17  //timer0 compare interrupt
; 
; void display()
; {
	.dbline 21
;  unsigned char i,j,k;
;  DDRA=0xff;
	ldi R24,255
	out 0x1a,R24
	.dbline 22
;  PORTA=0xff;
	out 0x1b,R24
	.dbline 23
;  DDRC=0xff;
	out 0x14,R24
	.dbline 24
;  PORTC=0xff;
	out 0x15,R24
	.dbline 26
;  
;  if(work_state==0)    //计时显示
	lds R2,_work_state
	tst R2
	breq X15
	xjmp L12
X15:
X2:
	.dbline 27
; { 
	.dbline 28
;  if(time_change==0x00)   // normal 
	lds R2,_time_change
	tst R2
	brne L14
X3:
	.dbline 29
;   {for(i=0;i<4;i++)
	.dbline 29
	clr R20
	xjmp L19
L16:
	.dbline 30
;    {
	.dbline 31
;    PORTA=seg_table[time[i]];
	ldi R24,<_time
	ldi R25,>_time
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R30,z+0
	clr R31
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	add R30,R24
	adc R31,R25
	elpm R2,Z
	out 0x1b,R2
	.dbline 32
;    PORTC=~(1<<(i+4));
	mov R17,R20
	subi R17,252    ; addi 4
	ldi R16,1
	xcall lsl8
	mov R2,R16
	com R2
	out 0x15,R2
	.dbline 33
;    delay_1ms();
	xcall _delay_1ms
	.dbline 34
;    PORTC|=0xf0;
	in R24,0x15
	ori R24,240
	out 0x15,R24
	.dbline 35
;    }
L17:
	.dbline 29
	inc R20
L19:
	.dbline 29
	cpi R20,4
	brlo L16
X4:
	.dbline 36
;    }
	xjmp L15
L14:
	.dbline 37
;  else if(time_change==0x01)  // change second 
	lds R24,_time_change
	cpi R24,1
	breq X16
	xjmp L20
X16:
X5:
	.dbline 38
;        {
	.dbline 39
; 	    if(timer200<100)  //正常显示
	lds R24,_timer200
	lds R25,_timer200+1
	cpi R24,100
	ldi R30,0
	cpc R25,R30
	brsh L22
X6:
	.dbline 40
;          {
	.dbline 41
; 		  for(i=0;i<4;i++)
	clr R20
	xjmp L27
L24:
	.dbline 42
;           {
	.dbline 43
;             PORTA=seg_table[time[i]];
	ldi R24,<_time
	ldi R25,>_time
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R30,z+0
	clr R31
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	add R30,R24
	adc R31,R25
	elpm R2,Z
	out 0x1b,R2
	.dbline 44
;             PORTC=~(1<<(i+4));
	mov R17,R20
	subi R17,252    ; addi 4
	ldi R16,1
	xcall lsl8
	mov R2,R16
	com R2
	out 0x15,R2
	.dbline 45
;             delay_1ms();
	xcall _delay_1ms
	.dbline 46
;             PORTC|=0xf0;
	in R24,0x15
	ori R24,240
	out 0x15,R24
	.dbline 47
; 		  }
L25:
	.dbline 41
	inc R20
L27:
	.dbline 41
	cpi R20,4
	brlo L24
X7:
	.dbline 48
; 	   }
	xjmp L21
L22:
	.dbline 50
; 	   else      //只显示分
;         {for(i=2;i<4;i++)
	.dbline 50
	ldi R20,2
	xjmp L31
L28:
	.dbline 51
;          {
	.dbline 52
;             PORTA=seg_table[time[i]];
	ldi R24,<_time
	ldi R25,>_time
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R30,z+0
	clr R31
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	add R30,R24
	adc R31,R25
	elpm R2,Z
	out 0x1b,R2
	.dbline 53
;             PORTC=~(1<<(i+4));
	mov R17,R20
	subi R17,252    ; addi 4
	ldi R16,1
	xcall lsl8
	mov R2,R16
	com R2
	out 0x15,R2
	.dbline 54
;             delay_1ms();
	xcall _delay_1ms
	.dbline 55
;             PORTC|=0xc0;
	in R24,0x15
	ori R24,192
	out 0x15,R24
	.dbline 56
; 		  }
L29:
	.dbline 50
	inc R20
L31:
	.dbline 50
	cpi R20,4
	brlo L28
X8:
	.dbline 57
; 		  }
	.dbline 58
; 	 }
	xjmp L21
L20:
	.dbline 59
; 	  else if(time_change==0x02) //正常显示
	lds R24,_time_change
	cpi R24,2
	breq X17
	xjmp L32
X17:
X9:
	.dbline 60
; 	   {  if(timer200<100)
	.dbline 60
	lds R24,_timer200
	lds R25,_timer200+1
	cpi R24,100
	ldi R30,0
	cpc R25,R30
	brsh L34
X10:
	.dbline 61
; 	     {
	.dbline 62
; 		 { for(i=0;i<4;i++)
	.dbline 62
	clr R20
	xjmp L39
L36:
	.dbline 63
;            {
	.dbline 64
;             PORTA=seg_table[time[i]];
	ldi R24,<_time
	ldi R25,>_time
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R30,z+0
	clr R31
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	add R30,R24
	adc R31,R25
	elpm R2,Z
	out 0x1b,R2
	.dbline 65
;             PORTC=~(1<<(i+4));
	mov R17,R20
	subi R17,252    ; addi 4
	ldi R16,1
	xcall lsl8
	mov R2,R16
	com R2
	out 0x15,R2
	.dbline 66
;             delay_1ms();
	xcall _delay_1ms
	.dbline 67
;             PORTC|=0xf0;
	in R24,0x15
	ori R24,240
	out 0x15,R24
	.dbline 68
; 		  }
L37:
	.dbline 62
	inc R20
L39:
	.dbline 62
	cpi R20,4
	brlo L36
X11:
	.dbline 69
; 		  }
	.dbline 70
; 		  }
	xjmp L35
L34:
	.dbline 72
; 		else                  //只显示秒
; 		for(i=0;i<2;i++)
	clr R20
	xjmp L43
L40:
	.dbline 73
; 		 {
	.dbline 74
; 		   PORTA=seg_table[time[i]];
	ldi R24,<_time
	ldi R25,>_time
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R30,z+0
	clr R31
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	add R30,R24
	adc R31,R25
	elpm R2,Z
	out 0x1b,R2
	.dbline 75
;             PORTC=~(1<<(i+4));
	mov R17,R20
	subi R17,252    ; addi 4
	ldi R16,1
	xcall lsl8
	mov R2,R16
	com R2
	out 0x15,R2
	.dbline 76
;             delay_1ms();
	xcall _delay_1ms
	.dbline 77
;             PORTC|=0x30;
	in R24,0x15
	ori R24,48
	out 0x15,R24
	.dbline 78
; 		 }
L41:
	.dbline 72
	inc R20
L43:
	.dbline 72
	cpi R20,2
	brlo L40
X12:
L35:
	.dbline 79
; 		 }
L32:
L21:
L15:
	.dbline 80
;  }
L12:
	.dbline 83
; //}
;  //if(clock_start==0x00)    //跑表显示,当跑表已经启动时
;   if(work_state==1)
	lds R24,_work_state
	cpi R24,1
	brne L44
X13:
	.dbline 85
;   //{for(j=0;j<5;j++)
;    {
	.dbline 86
;     for(k=0;k<4;k++)
	clr R20
	xjmp L49
L46:
	.dbline 87
;     {
	.dbline 88
;     PORTA=seg_table[clock[k]];
	ldi R24,<_clock
	ldi R25,>_clock
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R30,z+0
	clr R31
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	add R30,R24
	adc R31,R25
	elpm R2,Z
	out 0x1b,R2
	.dbline 89
;     PORTC=~(1<<(k+4));
	mov R17,R20
	subi R17,252    ; addi 4
	ldi R16,1
	xcall lsl8
	mov R2,R16
	com R2
	out 0x15,R2
	.dbline 90
;     delay_1ms();
	xcall _delay_1ms
	.dbline 91
;     PORTC|=0xf0;
	in R24,0x15
	ori R24,240
	out 0x15,R24
	.dbline 92
;    }
L47:
	.dbline 86
	inc R20
L49:
	.dbline 86
	cpi R20,4
	brlo L46
X14:
	.dbline 93
;   }
L44:
	.dbline -2
L11:
	.dbline 0 ; func end
	ld R20,y+
	ret
	.dbsym l j 1 c
	.dbsym r i 20 c
	.dbsym r k 20 c
	.dbend
	.dbfunc e timer0_com_isr _timer0_com_isr fV
	.even
_timer0_com_isr::
	st -y,R0
	st -y,R1
	st -y,R2
	st -y,R3
	st -y,R4
	st -y,R5
	st -y,R6
	st -y,R7
	st -y,R8
	st -y,R9
	st -y,R16
	st -y,R17
	st -y,R18
	st -y,R19
	st -y,R24
	st -y,R25
	st -y,R26
	st -y,R27
	st -y,R30
	st -y,R31
	in R0,0x3f
	st -y,R0
	.dbline -1
	.dbline 97
; //}
; }
; void timer0_com_isr()  /* 2 ms*/
; {
	.dbline 98
;  TIFR=0xff;
	ldi R24,255
	out 0x36,R24
	.dbline 100
; // timer2++;     //10 ms
;  timer200++;   //1 s,因为没有暂停的说法,所以一直加
	lds R24,_timer200
	lds R25,_timer200+1
	adiw R24,1
	sts _timer200+1,R25
	sts _timer200,R24
	.dbline 102
; //TCNT0=0x05;
; TCNT0=0xd7;
	ldi R24,215
	out 0x32,R24
	.dbline 103
;  if(timer200==200)   //计时  1s 
	lds R24,_timer200
	lds R25,_timer200+1
	cpi R24,200
	ldi R30,0
	cpc R25,R30
	brne L51
X18:
	.dbline 104
;  {
	.dbline 105
;     timer200=0;
	clr R2
	clr R3
	sts _timer200+1,R3
	sts _timer200,R2
	.dbline 106
;   	time[0]++;
	lds R24,_time
	subi R24,255    ; addi 1
	sts _time,R24
	.dbline 107
; 	if(time[0]==10)  // second 个位 
	cpi R24,10
	brne L53
X19:
	.dbline 108
; 	{
	.dbline 109
; 	 time[0]=0;
	sts _time,R2
	.dbline 110
;      time[1]++;
	lds R24,_time+1
	subi R24,255    ; addi 1
	sts _time+1,R24
	.dbline 111
; 	 if(time[1]==6)  //second 十位
	cpi R24,6
	brne L56
X20:
	.dbline 112
; 	  {
	.dbline 113
; 	   time[1]=0;
	sts _time+1,R2
	.dbline 114
; 	   time[2]++;
	lds R24,_time+2
	subi R24,255    ; addi 1
	sts _time+2,R24
	.dbline 115
; 	    if(time[2]==10) // 分个位
	cpi R24,10
	brne L61
X21:
	.dbline 116
; 		 {
	.dbline 117
; 		  time[2]=0;
	sts _time+2,R2
	.dbline 118
; 		  time[3]++;
	lds R24,_time+3
	subi R24,255    ; addi 1
	sts _time+3,R24
	.dbline 119
; 		  if(time[3]==6)
	cpi R24,6
	brne L66
X22:
	.dbline 120
; 		  time[3]=0;
	sts _time+3,R2
L66:
	.dbline 121
; 		  time[2]=0;
	clr R2
	sts _time+2,R2
	.dbline 122
;   		  time[1]=0;
	sts _time+1,R2
	.dbline 123
;   		  time[0]=0;
	sts _time,R2
	.dbline 124
; 		 } //time[2]
L61:
	.dbline 125
; 	  }  //time[1]
L56:
	.dbline 126
; 	}  //time[0]
L53:
	.dbline 128
; 	
;  }   // 1s
L51:
	.dbline 130
;  
;  if(work_state==0x01&&clock_start==0) //跑表
	lds R24,_work_state
	cpi R24,1
	brne L72
X23:
	lds R2,_clock_start
	tst R2
	brne L72
X24:
	.dbline 131
;  {
	.dbline 132
;   timer2++;
	lds R24,_timer2
	subi R24,255    ; addi 1
	sts _timer2,R24
	.dbline 133
;   if(timer2==0x02)
	cpi R24,2
	brne L74
X25:
	.dbline 134
;   {timer2=0;
	.dbline 134
	clr R2
	sts _timer2,R2
	.dbline 135
;   clock[0]++;
	lds R24,_clock
	subi R24,255    ; addi 1
	sts _clock,R24
	.dbline 136
;   if(clock[0]==10)
	cpi R24,10
	brne L76
X26:
	.dbline 137
;   {
	.dbline 138
;    clock[0]=0;
	sts _clock,R2
	.dbline 139
;    clock[1]++;
	lds R24,_clock+1

⌨️ 快捷键说明

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