📄 1602_8563_timer.lst
字号:
(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 + -