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

📄 1602_8563_timer.lst

📁 avr单片机的程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0073) 	   if(timer[4]==0)timer[4]=7;
    01D4 2388      TST	R24
    01D5 F419      BNE	0x01D9
    01D6 E087      LDI	R24,7
    01D7 938000A5  STS	0xA5,R24
(0074) 	timer[5]=read_tim();	  		  //读出月数据
    01D9 DF90      RCALL	_read_tim
    01DA 930000A6  STS	0xA6,R16
(0075) 	   if((timer[5]&0x80)==0)
    01DC FD07      SBRC	R16,7
    01DD C004      RJMP	0x01E2
(0076) 	        timer[7]=0x20;	 		  //世纪位为0,是21世纪
    01DE E280      LDI	R24,0x20
    01DF 938000A8  STS	0xA8,R24
    01E1 C003      RJMP	0x01E5
(0077) 	   else timer[7]=0x19;			  //世纪位不为0,是20世纪
    01E2 E189      LDI	R24,0x19
    01E3 938000A8  STS	0xA8,R24
(0078) 	timer[5]=timer[5]&0x1F;
    01E5 918000A6  LDS	R24,0xA6
    01E7 718F      ANDI	R24,0x1F
    01E8 938000A6  STS	0xA6,R24
(0079) 	timer[6]=read_tim();			  //读出年数据
    01EA DF7F      RCALL	_read_tim
    01EB 930000A7  STS	0xA7,R16
(0080) 	stop();
    01ED E984      LDI	R24,0x94
    01EE BF86      OUT	0x36,R24
(0081) 	return I2C_CRR;
    01EF E001      LDI	R16,1
    01F0 9508      RET
(0082) 	}
(0083) 
(0084) /**********************************
(0085) *          写入时钟函数			  *
(0086) **********************************/
(0087) uchar write_timer(void)
(0088)     {
(0089) 	start();		 	 	          //启动总线
_write_timer:
    01F1 EA84      LDI	R24,0xA4
    01F2 BF86      OUT	0x36,R24
(0090) 	waitack();						  //等待启动完成
    01F3 B626      IN	R2,0x36
    01F4 FE27      SBRS	R2,7
    01F5 CFFD      RJMP	0x01F3
(0091) 	if(chkack()!=START)return I2C_ERR;		  //检查是否启动成功
    01F6 B181      IN	R24,0x01
    01F7 7F88      ANDI	R24,0xF8
    01F8 3088      CPI	R24,0x8
    01F9 F011      BEQ	0x01FC
    01FA 2700      CLR	R16
    01FB C01F      RJMP	0x021B
(0092) 	write_tim(SLA_W);				  //发送写地址
    01FC EA02      LDI	R16,0xA2
    01FD DF5E      RCALL	_write_tim
(0093) 	write_tim(0x00);				  //写数据首地址
    01FE 2700      CLR	R16
    01FF DF5C      RCALL	_write_tim
(0094) 	write_tim(0x20);				  //写控制/状态寄存器1,暂停计时
    0200 E200      LDI	R16,0x20
    0201 DF5A      RCALL	_write_tim
(0095) 	write_tim(0x00);				  //写控制/状态寄存器2
    0202 2700      CLR	R16
    0203 DF58      RCALL	_write_tim
(0096) 	write_tim(0x00);				  //写秒数据为0
    0204 2700      CLR	R16
    0205 DF56      RCALL	_write_tim
(0097) 	write_tim(timer[1]);			  //写分数据
    0206 910000A2  LDS	R16,timer+1
    0208 DF53      RCALL	_write_tim
(0098) 	write_tim(timer[2]);			  //写时数据
    0209 910000A3  LDS	R16,timer+2
    020B DF50      RCALL	_write_tim
(0099) 	write_tim(timer[3]);			  //写日数据
    020C 910000A4  LDS	R16,timer+3
    020E DF4D      RCALL	_write_tim
(0100) 	write_tim(timer[4]);			  //写周数据
    020F 910000A5  LDS	R16,0xA5
    0211 DF4A      RCALL	_write_tim
(0101) 	write_tim(timer[5]);			  //写月数据
    0212 910000A6  LDS	R16,0xA6
    0214 DF47      RCALL	_write_tim
(0102) 	write_tim(timer[6]);			  //写年数据
    0215 910000A7  LDS	R16,0xA7
    0217 DF44      RCALL	_write_tim
(0103) 	stop();
    0218 E984      LDI	R24,0x94
    0219 BF86      OUT	0x36,R24
(0104) 	return I2C_CRR;
    021A E001      LDI	R16,1
    021B 9508      RET
(0105) 	}
(0106) 	
(0107) /**********************************
(0108) *          启动时钟函数			  *
(0109) **********************************/
(0110) uchar start_timer(void)
(0111)     {
(0112) 	start();		 	 	          //启动总线
_start_timer:
    021C EA84      LDI	R24,0xA4
    021D BF86      OUT	0x36,R24
(0113) 	waitack();						  //等待启动完成
    021E B626      IN	R2,0x36
    021F FE27      SBRS	R2,7
    0220 CFFD      RJMP	0x021E
(0114) 	if(chkack()!=START)return I2C_ERR;		  //检查是否启动成功
    0221 B181      IN	R24,0x01
    0222 7F88      ANDI	R24,0xF8
    0223 3088      CPI	R24,0x8
    0224 F011      BEQ	0x0227
    0225 2700      CLR	R16
    0226 C009      RJMP	0x0230
(0115) 	write_tim(SLA_W);				  //发送写地址
    0227 EA02      LDI	R16,0xA2
    0228 DF33      RCALL	_write_tim
(0116) 	write_tim(0x00);				  //写数据首地址
    0229 2700      CLR	R16
    022A DF31      RCALL	_write_tim
(0117) 	write_tim(0x00);				  //写控制/状态寄存器1,暂停计时
    022B 2700      CLR	R16
    022C DF2F      RCALL	_write_tim
(0118) 	stop();
    022D E984      LDI	R24,0x94
    022E BF86      OUT	0x36,R24
(0119) 	return I2C_CRR;
    022F E001      LDI	R16,1
    0230 9508      RET
(0120) 	}
(0121) 
(0122) /**********************************
(0123) *   将时钟数据转换后在LCD上显示	  *
(0124) **********************************/ 
(0125) void timer_lcd(void)
(0126)     {
(0127) 	locate(1,4);			 	 	 //写指令:第1行第4列地址
_timer_lcd:
    0231 E024      LDI	R18,4
    0232 E001      LDI	R16,1
    0233 DEE5      RCALL	_locate
(0128) 
(0129) 	lcd_da((timer[7]>>4)+0x30);
    0234 910000A8  LDS	R16,0xA8
    0236 9502      SWAP	R16
    0237 700F      ANDI	R16,0xF
    0238 5D00      SUBI	R16,0xD0
    0239 DE5E      RCALL	_lcd_da
(0130) 	lcd_da((timer[7]&0x0f)+0x30);
    023A 910000A8  LDS	R16,0xA8
    023C 700F      ANDI	R16,0xF
    023D 5D00      SUBI	R16,0xD0
    023E DE59      RCALL	_lcd_da
(0131) 	lcd_da((timer[6]>>4)+0x30);		 //显示年
    023F 910000A7  LDS	R16,0xA7
    0241 9502      SWAP	R16
    0242 700F      ANDI	R16,0xF
    0243 5D00      SUBI	R16,0xD0
    0244 DE53      RCALL	_lcd_da
(0132) 	lcd_da((timer[6]&0x0f)+0x30);
    0245 910000A7  LDS	R16,0xA7
    0247 700F      ANDI	R16,0xF
    0248 5D00      SUBI	R16,0xD0
    0249 DE4E      RCALL	_lcd_da
(0133) 	lcd_da('/');
    024A E20F      LDI	R16,0x2F
    024B DE4C      RCALL	_lcd_da
(0134) 	lcd_da((timer[5]>>4)+0x30);		 //显示月
    024C 910000A6  LDS	R16,0xA6
    024E 9502      SWAP	R16
    024F 700F      ANDI	R16,0xF
    0250 5D00      SUBI	R16,0xD0
    0251 DE46      RCALL	_lcd_da
(0135) 	lcd_da((timer[5]&0x0f)+0x30);
    0252 910000A6  LDS	R16,0xA6
    0254 700F      ANDI	R16,0xF
    0255 5D00      SUBI	R16,0xD0
    0256 DE41      RCALL	_lcd_da
(0136) 	lcd_da('/');
    0257 E20F      LDI	R16,0x2F
    0258 DE3F      RCALL	_lcd_da
(0137) 	lcd_da((timer[3]>>4)+0x30);		 //显示日
    0259 910000A4  LDS	R16,timer+3
    025B 9502      SWAP	R16
    025C 700F      ANDI	R16,0xF
    025D 5D00      SUBI	R16,0xD0
    025E DE39      RCALL	_lcd_da
(0138) 	lcd_da((timer[3]&0x0f)+0x30);
    025F 910000A4  LDS	R16,timer+3
    0261 700F      ANDI	R16,0xF
    0262 5D00      SUBI	R16,0xD0
    0263 DE34      RCALL	_lcd_da
(0139) 
(0140) 	locate(2,2);			 		 //写指令:第2行地址
    0264 E022      LDI	R18,2
    0265 E002      LDI	R16,2
    0266 DEB2      RCALL	_locate
(0141)    
(0142)    	lcd_da((timer[2]>>4)+0x30);		 //时
    0267 910000A3  LDS	R16,timer+2
    0269 9502      SWAP	R16
    026A 700F      ANDI	R16,0xF
    026B 5D00      SUBI	R16,0xD0
    026C DE2B      RCALL	_lcd_da
(0143) 	lcd_da((timer[2]&0x0f)+0x30);
    026D 910000A3  LDS	R16,timer+2
    026F 700F      ANDI	R16,0xF
    0270 5D00      SUBI	R16,0xD0
    0271 DE26      RCALL	_lcd_da
(0144) 	lcd_da(':');
    0272 E30A      LDI	R16,0x3A
    0273 DE24      RCALL	_lcd_da
(0145) 	lcd_da((timer[1]>>4)+0x30);		 //分
    0274 910000A2  LDS	R16,timer+1
    0276 9502      SWAP	R16
    0277 700F      ANDI	R16,0xF
    0278 5D00      SUBI	R16,0xD0
    0279 DE1E      RCALL	_lcd_da
(0146) 	lcd_da((timer[1]&0x0f)+0x30);
    027A 910000A2  LDS	R16,timer+1
    027C 700F      ANDI	R16,0xF
    027D 5D00      SUBI	R16,0xD0
    027E DE19      RCALL	_lcd_da
(0147) 	lcd_da(':');   
    027F E30A      LDI	R16,0x3A
    0280 DE17      RCALL	_lcd_da
(0148) 	lcd_da((timer[0]>>4)+0x30);		 //秒
    0281 910000A1  LDS	R16,timer
    0283 9502      SWAP	R16
    0284 700F      ANDI	R16,0xF
    0285 5D00      SUBI	R16,0xD0
    0286 DE11      RCALL	_lcd_da
(0149) 	lcd_da((timer[0]&0x0f)+0x30);
    0287 910000A1  LDS	R16,timer
    0289 700F      ANDI	R16,0xF
    028A 5D00      SUBI	R16,0xD0
    028B DE0C      RCALL	_lcd_da
(0150) 
(0151) 	lcd_da(20);						 //时间与星期间留1空格
    028C E104      LDI	R16,0x14
    028D DE0A      RCALL	_lcd_da
(0152) 	lcd_da('W');					 //星期的前导字
    028E E507      LDI	R16,0x57
    028F DE08      RCALL	_lcd_da
(0153) 	lcd_da('e');
    0290 E605      LDI	R16,0x65
    0291 DE06      RCALL	_lcd_da
(0154) 	lcd_da('e');
    0292 E605      LDI	R16,0x65
    0293 DE04      RCALL	_lcd_da
(0155) 	lcd_da('k');
    0294 E60B      LDI	R16,0x6B
    0295 DE02      RCALL	_lcd_da
(0156) 	lcd_da((timer[4]&0x0f)+0x30);	 //星期数据
    0296 910000A5  LDS	R16,0xA5
    0298 700F      ANDI	R16,0xF
    0299 5D00      SUBI	R16,0xD0
    029A DDFD      RCALL	_lcd_da
    029B 9508      RET
(0157) 	}
(0158) 
(0159) //定时器1:每秒从8563中读取4次数据,更新显示
(0160) void timer1_init(void)	       //定时器1初始化:250毫秒定时,预分频256
(0161)     {
(0162) 	TCCR1B = 0x00; 		   	   //停止定时器
_timer1_init:
    029C 2422      CLR	R2
    029D BC2E      OUT	0x2E,R2
(0163) 	TCNT1H = 0x8F;			   //初值高字节
    029E E88F      LDI	R24,0x8F
    029F BD8D      OUT	0x2D,R24
(0164) 	TCNT1L = 0x81;			   //定时初值低字节
    02A0 E881      LDI	R24,0x81
    02A1 BD8C      OUT	0x2C,R24
(0165) 	TCCR1A = 0x00;
    02A2 BC2F      OUT	0x2F,R2
(0166) 	TCCR1B = 0x03; 	 	   	   //启动定时器
    02A3 E083      LDI	R24,3
    02A4 BD8E      OUT	0x2E,R24
    02A5 9508      RET
_timer1_ovf_isr:
    02A6 940E0542  CALL	push_lset
(0167) 	}
(0168) 
(0169) #pragma interrupt_handler timer1_ovf_isr:9
(0170) void timer1_ovf_isr(void) 	   //定时器1中断入口:250MS中断一次
(0171)     {
(0172) 	TCNT1H = 0x8F;			   //重装初值
    02A8 E88F      LDI	R24,0x8F
    02A9 BD8D      OUT	0x2D,R24
(0173) 	TCNT1L = 0x81;   
    02AA E881      LDI	R24,0x81
    02AB BD8C      OUT	0x2C,R24
(0174) 	read_timer();	   	   	   //读出当前时钟
    02AC DEF2      RCALL	_read_timer
(0175) 	timer_lcd();		   	   //显示数据转换
    02AD DF83      RCALL	_timer_lcd
    02AE 940E0559  CALL	pop_lset
    02B0 9518      RETI
_set_xs1:
  i                    --> R20
    02B1 940E052B  CALL	push_gset1
    02B3 2F40      MOV	R20,R16
(0176) 	}
(0177) 
(0178) /**********************************
(0179) *          调整显示函数1		  *
(0180) **********************************/
(0181) void set_xs1(uchar i)
(0182)     {
(0183) 	lcd_da((timer[i]>>4)+0x30);		 //显示数据
    02B4 EA81      LDI	R24,0xA1
    02B5 E090      LDI	R25,0
    02B6 2FE4      MOV	R30,R20
    02B7 27FF      CLR	R31
    02B8 0FE8      ADD	R30,R24
    02B9 1FF9      ADC	R31,R25
    02BA 8100      LDD	R16,Z+0
    02BB 9502      SWAP	R16
    02BC 700F      ANDI	R16,0xF
    02BD 5D00      SUBI	R16,0xD0
    02BE DDD9      RCALL	_lcd_da
(0184) 	lcd_da((timer[i]&0x0f)+0x30);
    02BF EA81      LDI	R24,0xA1
    02C0 E090      LDI	R25,0
    02C1 2FE4      MOV	R30,R20
    02C2 27FF      CLR	R31
    02C3 0FE8      ADD	R30,R24
    02C4 1FF9      ADC	R31,R25
    02C5 8100      LDD	R16,Z+0
    02C6 700F      ANDI	R16,0xF
    02C7 5D00      SUBI	R16,0xD0
    02C8 DDCF      RCALL	_lcd_da
    02C9 940E052E  CALL	pop_gset1
    02CB 9508      RET
_set_xs2:
  data                 --> R20
    02CC 940E052B  CALL	push_gset1
    02CE 2F40      MOV	R20,R16
(0185) 	}
(0186) 
(0187) /**********************************
(0188) *          调整显示函数2		  *
(0189) **********************************/
(0190) void set_xs2(uchar data)
(0191)     {
(0192) 	lcd_da((data>>4)+0x30);		 //显示数据
    02CF 2F04      MOV	R16,R20
    02D0 9502      SWAP	R16
    02D1 700F      ANDI	R16,0xF
    02D2 5D00      SUBI	R16,0xD0
    02D3 DDC4      RCALL	_lcd_da
(0193) 	lcd_da((data&0x0f)+0x30);
    02D4 2F04      MOV	R16,R20
    02D5 700F      ANDI	R16,0xF
    02D6 5D00      SUBI	R16,0xD0
    02D7 DDC0      RCALL	_lcd_da
(0194) 	lcd(0x20);
    02D8 E200      LDI	R16,0x20
    02D9 DE57      RCALL	_lcd
    02DA 940E052E  CALL	pop_gset1
    02DC 9508      RET
_main:
  set_time             --> R22
  set_bh               --> Y+2
  set_flag             --> Y+1
  a1                   --> Y+0
  a                    --> R20
    02DD 9725      SBIW	R28,5
(0195) 	}
(0196) 
(0197) /**********************************
(0198) *           程序主函数		      *
(0199) **********************************/
(0200) void main(void)
(0201)     {
(0202) 	uchar set_flag=0;			   //调整与正常工作标志
    02DE 2400      CLR	R0
    02DF 8209      STD	Y+1,R0
(0203) 	uchar set_time;				   //调整数据类型标志
(0204) 	uchar set_bh=0;				   //调整变化标志
    02E0 820A      STD	Y+2,R0
(0205) 	uchar a,a1;
(0206) 	
(0207) 	port_init();
    02E1 DD8A      RCALL	_port_init
(0208) 	LED_ON;			  			   //开LCD背光
    02E2 9AC3      SBI	0x18,3
(0209) 	lcd_init();
    02E3 DE12      RCALL	_lcd_init
(0210) 	delay_ms(500);
    02E4 EF04      LDI	R16,0xF4

⌨️ 快捷键说明

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