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

📄 rtc.s

📁 AtMega169芯片连接RTC的测试程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module rtc.c
	.area text(rom, con, rel)
	.dbfile C:\TDdownload\zxy\169demo\169RTC\rtc.c
	.area data(ram, con, rel)
	.dbfile C:\TDdownload\zxy\169demo\169RTC\rtc.c
_i::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile C:\TDdownload\zxy\169demo\169RTC\rtc.c
	.dbsym e i _i i
_j::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile C:\TDdownload\zxy\169demo\169RTC\rtc.c
	.dbsym e j _j i
_k::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile C:\TDdownload\zxy\169demo\169RTC\rtc.c
	.dbsym e k _k i
	.area text(rom, con, rel)
	.dbfile C:\TDdownload\zxy\169demo\169RTC\rtc.c
	.dbfunc e portE_B _portE_B fV
	.even
_portE_B::
	.dbline -1
	.dbline 31
; // **************************************************************
; // *** 		         广 州 天 河 双 龙 电 子 公 司 	            ***
; // ***                   http://www.sl.com.cn                 ***
; // ***                  实验: RTC                            ***
; // ***                  作者:zxy@sl.com.cn                   ***
; // ***                       2006年3月28日                    ***
; // ***         目标MCU:MEGA169    晶振:内部(INT)8MHZ         ***
; // **************************************************************
; //此实验需具备AD转换知识
; //通过按键修改时钟值,S1为选位键,S2为增1,S4为减1
; #include <iom169v.h>
; #include <macros.h>
;  //键值定义,以目标实验板际测取键值范围为准
; #define s1 (adc_old<0x03)                         
; //200h    
; #define s2 ((adc_old>0x180)&&(adc_old<0x220))
; //2a6h            
; #define s3 ((adc_old>0x290)&&(adc_old<0x2CF))
; //2fbh
; #define s4 ((adc_old>0x2D0)&&(adc_old<0x310))
; //326h
; #define s5 ((adc_old>0x310)&&(adc_old<0x345))
; extern const unsigned char seg_table[16];
; extern unsigned char led_buff[3];
; extern void delay_ms(unsigned int time);
; extern void display(void);
; unsigned int adc_rel;//AD转换结果
; unsigned int i=0,j=0,k=0;
; //E、B口初始化
; void portE_B(void)
; {
	.dbline 32
;     DDRE=0xff;//E、B口初始化
	ldi R24,255
	out 0xd,R24
	.dbline 33
; 	  PORTE=0xff;
	out 0xe,R24
	.dbline 34
; 	  DDRB|=0xf0;
	in R24,0x4
	ori R24,240
	out 0x4,R24
	.dbline 35
; 	  PORTD|=0xf0;
	in R24,0xb
	ori R24,240
	out 0xb,R24
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e adc_init _adc_init fV
	.even
_adc_init::
	.dbline -1
	.dbline 39
; }
; //ADC初始化
; void adc_init(void)
; { 
	.dbline 40
;  ADCSRA = 0x00; //设置前,先关闭ADC
	clr R2
	sts 122,R2
	.dbline 41
;  ADMUX =(1<<REFS0)|(1<<MUX0);//选择内部AVCC为基准,单端输入口为ADC0
	ldi R24,65
	sts 124,R24
	.dbline 42
;  ACSR  =(1<<ACD);//关闭模拟比较器,禁止位P148
	ldi R24,128
	out 0x30,R24
	.dbline 43
;  ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//ADC时钟64分频
	ldi R24,206
	sts 122,R24
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e timer2_init _timer2_init fV
	.even
_timer2_init::
	.dbline -1
	.dbline 47
; }
; //定时器初始化
; void timer2_init(void)
; {
	.dbline 48
;  TIMSK2 = 0x00;
	clr R2
	sts 112,R2
	.dbline 49
;  ASSR  = 1<<AS2; //异步时钟
	ldi R24,8
	sts 182,R24
	.dbline 50
;  TCNT2 = 0xE0; //定时时间1秒
	ldi R24,224
	sts 178,R24
	.dbline 51
;  TCCR2A = (1<<CS22)|(1<<CS21)|(1<<CS20); //分频比1024,0x07
	ldi R24,7
	sts 176,R24
	.dbline 52
;  SEI();
	sei
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 76
	jmp _adc_isr
	.area text(rom, con, rel)
	.dbfile C:\TDdownload\zxy\169demo\169RTC\rtc.c
	.area vector(rom, abs)
	.org 20
	jmp _int_isr
	.area text(rom, con, rel)
	.dbfile C:\TDdownload\zxy\169demo\169RTC\rtc.c
	.dbfunc e adc_isr _adc_isr fV
	.even
_adc_isr::
	st -y,R24
	st -y,R25
	in R24,0x3f
	st -y,R24
	.dbline -1
	.dbline 58
; }
; 
; #pragma interrupt_handler adc_isr:20 int_isr:6
; //ADC完成中断  
; void adc_isr(void)
; {
	.dbline 59
;  adc_rel=ADC&0x3ff;
	lds R24,120
	lds R25,120+1
	andi R25,3
	sts _adc_rel+1,R25
	sts _adc_rel,R24
	.dbline 60
;  ADMUX=(1<<REFS0)|(1<<MUX0);//选择内部AVCC为基准
	ldi R24,65
	sts 124,R24
	.dbline 61
;  ADCSRA|=(1<<ADSC);//启动AD转换
	lds R24,122
	ori R24,64
	sts 122,R24
	.dbline -2
L4:
	.dbline 0 ; func end
	ld R24,y+
	out 0x3f,R24
	ld R25,y+
	ld R24,y+
	reti
	.dbend
	.dbfunc e int_isr _int_isr fV
;              n -> <dead>
	.even
_int_isr::
	st -y,R2
	st -y,R3
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 65
; }
; //定时器中断
; void int_isr(void)
; { int n;
	.dbline 66
;   TCNT2 = 0xE0;
	ldi R24,224
	sts 178,R24
	.dbline 67
;   led_buff[0]=seg_table[i];    //个位
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	lds R30,_i
	lds R31,_i+1
	add R30,R24
	adc R31,R25
	lpm R2,Z
	sts _led_buff,R2
	.dbline 68
;   led_buff[1]=seg_table[j];    //十位
	lds R30,_j
	lds R31,_j+1
	add R30,R24
	adc R31,R25
	lpm R2,Z
	sts _led_buff+1,R2
	.dbline 69
;   led_buff[2]=seg_table[k];    //百位
	lds R30,_k
	lds R31,_k+1
	add R30,R24
	adc R31,R25
	lpm R2,Z
	sts _led_buff+2,R2
	.dbline 70
;   i++;
	lds R24,_i
	lds R25,_i+1
	adiw R24,1
	sts _i+1,R25
	sts _i,R24
	.dbline 71
;   if(i==10)                    //十进位
	cpi R24,10
	ldi R30,0
	cpc R25,R30
	brne L8
X0:
	.dbline 72
;      {
	.dbline 73
; 	  i=0;
	clr R2
	clr R3
	sts _i+1,R3
	sts _i,R2
	.dbline 74
; 	  j++;
	lds R24,_j
	lds R25,_j+1
	adiw R24,1
	sts _j+1,R25
	sts _j,R24
	.dbline 75
; 	  if(j==6)                    //六进位
	cpi R24,6
	ldi R30,0
	cpc R25,R30
	brne L10
X1:
	.dbline 76
; 	    {
	.dbline 77
; 		 j=0;
	sts _j+1,R3
	sts _j,R2
	.dbline 78
; 		 k++;
	lds R24,_k
	lds R25,_k+1
	adiw R24,1
	sts _k+1,R25
	sts _k,R24
	.dbline 79
; 		 if(k==10)                  //十进位       
	cpi R24,10
	ldi R30,0
	cpc R25,R30
	brne L12
X2:
	.dbline 80
; 		  {i=0;j=0;k=0;}
	.dbline 80
	sts _i+1,R3
	sts _i,R2
	.dbline 80
	sts _j+1,R3
	sts _j,R2
	.dbline 80
	sts _k+1,R3
	sts _k,R2
	.dbline 80
L12:
	.dbline 81
; 		}
L10:
	.dbline 82
; 	 }
L8:
	.dbline -2
L5:
	.dbline 0 ; func end
	ld R2,y+
	out 0x3f,R2
	ld R31,y+
	ld R30,y+
	ld R25,y+
	ld R24,y+
	ld R3,y+
	ld R2,y+
	reti
	.dbsym l n 1 I
	.dbend
	.dbfunc e keyScan _keyScan fV
;              x -> R20,R21
;              x -> R20,R21
;              x -> R20,R21
;              x -> R20,R21
;              x -> R20,R21
;              x -> R20,R21
	.even
_keyScan::
	st -y,R20
	st -y,R21
	.dbline -1
	.dbline 86
; }
; unsigned int adc_old;
; void keyScan(void)
; {
	.dbline 87
; if(adc_old!=adc_rel)                      //是否有键按下
	lds R2,_adc_rel
	lds R3,_adc_rel+1
	lds R4,_adc_old
	lds R5,_adc_old+1
	cp R4,R2
	cpc R5,R3
	breq L15
X3:
	.dbline 88
; 	       adc_old=adc_rel;               //有键按下,读取键值
	sts _adc_old+1,R3
	sts _adc_old,R2
L15:
	.dbline 89
;            display();             
	xcall _display
	xjmp L18
L17:
	.dbline 91
; 		   while(s1)                      //是否为S1键 
;             { display();
	.dbline 91
	xcall _display
	.dbline 92
; 					    delay_ms(200);              //按键消抖25MS
	ldi R16,200
	ldi R17,0
	xcall _delay_ms
	.dbline 93
; 					    adc_old=adc_rel;            //读取键值
	lds R2,_adc_rel
	lds R3,_adc_rel+1
	sts _adc_old+1,R3
	sts _adc_old,R2
	xjmp L21
L20:
	.dbline 97
; 						
; 				 //**********个位处理
; 					  while(!s1)                    //是否为S1键,不是S1时进入等待状态,并选中个位     
; 					  {
	.dbline 98
; 						  adc_old=adc_rel;             
	lds R2,_adc_rel
	lds R3,_adc_rel+1
	sts _adc_old+1,R3
	sts _adc_old,R2
	.dbline 99
; 					      TIMSK2=0x00;                //屏蔽定时器中断    
	clr R2
	sts 112,R2
	.dbline 101
; 
; 						  PORTE=seg_table[i]&0x7f;    //点亮个位及其小数点
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	lds R30,_i
	lds R31,_i+1
	add R30,R24
	adc R31,R25
	lpm R24,Z
	andi R24,127
	out 0xe,R24
	.dbline 102
; 						  PORTB=0xef;                 //点亮个位      
	ldi R24,239
	out 0x5,R24
	.dbline 103
; 						  delay_ms(1);               
	ldi R16,1
	ldi R17,0
	xcall _delay_ms
	.dbline 104
;                           PORTE=seg_table[j];         //点亮十位              
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	lds R30,_j
	lds R31,_j+1
	add R30,R24
	adc R31,R25
	lpm R2,Z
	out 0xe,R2
	.dbline 105
; 						  PORTB=0XDF;                 //点亮十位        
	ldi R24,223
	out 0x5,R24
	.dbline 106
; 						  delay_ms(1);
	ldi R16,1
	ldi R17,0
	xcall _delay_ms
	.dbline 107
;                           PORTE=seg_table[k];         //点亮百位   
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	lds R30,_k
	lds R31,_k+1
	add R30,R24
	adc R31,R25
	lpm R2,Z
	out 0xe,R2
	.dbline 108
; 						  PORTB=0XBF;                 //点亮百位        
	ldi R24,191
	out 0x5,R24
	.dbline 109
; 						  delay_ms(1);
	ldi R16,1
	ldi R17,0
	xcall _delay_ms
	.dbline 110
; 						  adc_old=adc_rel;            //读取键值       
	lds R2,_adc_rel
	lds R3,_adc_rel+1
	sts _adc_old+1,R3
	sts _adc_old,R2
	.dbline 111
; 						  if(s2)                      //是否为S3 ,如果是S3,个位加1
	lds R2,_adc_old
	lds R3,_adc_old+1
	ldi R24,384
	ldi R25,1
	cp R24,R2
	cpc R25,R3
	brlo X33
	xjmp L23
X33:
X4:
	movw R24,R2
	cpi R24,32
	ldi R30,2
	cpc R25,R30
	brlo X34
	xjmp L23
X34:
X5:
	.dbline 112
; 						   { 
	.dbline 114
; 						   	 int x;
; 						     for(x=50;x>0;x--)        //消抖且保证LED显示正常
	ldi R20,50
	ldi R21,0
L25:
	.dbline 115
; 						     {
	.dbline 116
; 							  PORTE=seg_table[i]&0x7f;
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	lds R30,_i
	lds R31,_i+1
	add R30,R24
	adc R31,R25
	lpm R24,Z
	andi R24,127
	out 0xe,R24
	.dbline 117
; 						      PORTB=0xef;
	ldi R24,239
	out 0x5,R24
	.dbline 118
; 						      delay_ms(1);
	ldi R16,1
	ldi R17,0
	xcall _delay_ms
	.dbline 119
;                               PORTE=seg_table[j];
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	lds R30,_j
	lds R31,_j+1
	add R30,R24
	adc R31,R25
	lpm R2,Z
	out 0xe,R2
	.dbline 120
; 						      PORTB=0XDF;
	ldi R24,223
	out 0x5,R24
	.dbline 121
; 						      delay_ms(1);
	ldi R16,1
	ldi R17,0
	xcall _delay_ms
	.dbline 122
;                               PORTE=seg_table[k];
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	lds R30,_k
	lds R31,_k+1
	add R30,R24
	adc R31,R25
	lpm R2,Z
	out 0xe,R2
	.dbline 123
; 						      PORTB=0XBF;
	ldi R24,191
	out 0x5,R24
	.dbline 124
; 						      delay_ms(1);
	ldi R16,1
	ldi R17,0
	xcall _delay_ms
	.dbline 125
; 							 }
L26:
	.dbline 114
	subi R20,1
	sbci R21,0
	.dbline 114
	clr R2
	clr R3
	cp R2,R20
	cpc R3,R21
	brge X35
	xjmp L25
X35:
X6:
	.dbline 126
; 						    i++;                     //个位加1
	lds R24,_i
	lds R25,_i+1
	adiw R24,1
	sts _i+1,R25
	sts _i,R24
	.dbline 127
; 						    if(i==10)                
	cpi R24,10
	ldi R30,0
	cpc R25,R30
	brne L29
X7:
	.dbline 128
;                               {
	.dbline 129
; 	                              i=0;
	sts _i+1,R3
	sts _i,R2
	.dbline 130
; 	                          }
L29:
	.dbline 131
; 						   }
L23:
	.dbline 132
; 						 if(s4)                       //是否为S4 ,如果是S4,个位减1   
	lds R2,_adc_old
	lds R3,_adc_old+1
	ldi R24,720
	ldi R25,2
	cp R24,R2
	cpc R25,R3
	brlo X36
	xjmp L31
X36:
X8:
	movw R24,R2
	cpi R24,16
	ldi R30,3
	cpc R25,R30
	brlo X37
	xjmp L31
X37:
X9:
	.dbline 133
; 						   {int x;
	.dbline 134
; 						    for(x=50;x>0;x--)  						  //消抖且保证LED显示正常   
	ldi R20,50
	ldi R21,0
L33:
	.dbline 135
; 							  {
	.dbline 136
; 							   PORTE=seg_table[i]&0x7f;            //点亮个位及其小数点      
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	lds R30,_i
	lds R31,_i+1
	add R30,R24
	adc R31,R25
	lpm R24,Z
	andi R24,127
	out 0xe,R24
	.dbline 137
; 						       PORTB=0xef;                         //点亮个位                
	ldi R24,239
	out 0x5,R24
	.dbline 138
; 						       delay_ms(1);                                                  
	ldi R16,1
	ldi R17,0
	xcall _delay_ms
	.dbline 139
;                                PORTE=seg_table[j];                 //点亮十位                
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	lds R30,_j
	lds R31,_j+1
	add R30,R24
	adc R31,R25
	lpm R2,Z
	out 0xe,R2
	.dbline 140
; 						       PORTB=0XDF;                         //点亮十位                
	ldi R24,223
	out 0x5,R24
	.dbline 141
; 						       delay_ms(1);                                                  
	ldi R16,1
	ldi R17,0
	xcall _delay_ms
	.dbline 142
;                                PORTE=seg_table[k];                 //点亮百位                
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	lds R30,_k
	lds R31,_k+1
	add R30,R24
	adc R31,R25
	lpm R2,Z
	out 0xe,R2
	.dbline 143
; 						       PORTB=0XBF;                         //点亮百位                
	ldi R24,191
	out 0x5,R24
	.dbline 144
; 						       delay_ms(1);
	ldi R16,1
	ldi R17,0
	xcall _delay_ms
	.dbline 145
; 							  }
L34:
	.dbline 134
	subi R20,1
	sbci R21,0
	.dbline 134
	clr R2
	clr R3
	cp R2,R20
	cpc R3,R21
	brge X38
	xjmp L33
X38:
X10:
	.dbline 146
; 						    i--;                          //减1
	lds R24,_i
	lds R25,_i+1
	sbiw R24,1
	sts _i+1,R25
	sts _i,R24
	.dbline 147
; 						    if(i==-1)
	cpi R24,255
	ldi R30,255
	cpc R25,R30
	brne L37
X11:
	.dbline 148
;                             {
	.dbline 149
; 	                         i=9;
	ldi R24,9
	ldi R25,0
	sts _i+1,R25
	sts _i,R24
	.dbline 150
; 	                        }
L37:
	.dbline 151
; 						   }
L31:
	.dbline 152
; 						 }
L21:
	.dbline 96
	lds R24,_adc_old
	lds R25,_adc_old+1
	cpi R24,3
	ldi R30,0
	cpc R25,R30
	brlo X39
	xjmp L20
X39:
X12:
	.dbline 153
; 						 delay_ms(200);
	ldi R16,200
	ldi R17,0
	xcall _delay_ms
	.dbline 154
; 						 adc_old=adc_rel;
	lds R2,_adc_rel
	lds R3,_adc_rel+1
	sts _adc_old+1,R3
	sts _adc_old,R2
	xjmp L40
L39:
	.dbline 157
; 					//********十位处理
; 					while(!s1)                         //同上 
; 					  {
	.dbline 158
; 						  adc_old=adc_rel;
	lds R2,_adc_rel
	lds R3,_adc_rel+1
	sts _adc_old+1,R3
	sts _adc_old,R2
	.dbline 159
; 					    TIMSK2=0x00;
	clr R2
	sts 112,R2
	.dbline 160
; 						  PORTE=seg_table[i];                  //点亮个位     
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	lds R30,_i
	lds R31,_i+1
	add R30,R24
	adc R31,R25
	lpm R2,Z
	out 0xe,R2
	.dbline 161
; 						  PORTB=0xef;                          //点亮个位                
	ldi R24,239
	out 0x5,R24
	.dbline 162
; 						  delay_ms(1);                                                   
	ldi R16,1
	ldi R17,0
	xcall _delay_ms
	.dbline 163
;               PORTE=seg_table[j]&0x7f;             //点亮十位及其小数点                    
	ldi R24,<_seg_table

⌨️ 快捷键说明

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