📄 1602_8563_timer.lst
字号:
0115 E005 LDI R16,5
0116 E010 LDI R17,0
0117 DF6D RCALL _delay_ms
0118 9508 RET
_locate:
x --> R20
b --> R22
a --> R10
0119 940E0527 CALL push_gset3
011B 2F62 MOV R22,R18
011C 2EA0 MOV R10,R16
(0105) }
(0106)
(0107) //定位指令函数
(0108) void locate(uchar a,uchar b)
(0109) {
(0110) uchar x;
(0111) if(a==1)
011D 2D8A MOV R24,R10
011E 3081 CPI R24,1
011F F419 BNE 0x0123
(0112) x=0x80+b-1;
0120 2F46 MOV R20,R22
0121 5840 SUBI R20,0x80
0122 5041 SUBI R20,1
(0113) if(a==2)
0123 2D8A MOV R24,R10
0124 3082 CPI R24,2
0125 F419 BNE 0x0129
(0114) x=0xC0+b-1;
0126 2F46 MOV R20,R22
0127 5440 SUBI R20,0x40
0128 5041 SUBI R20,1
(0115) lcd_comm(x);
0129 2F04 MOV R16,R20
012A DF92 RCALL _lcd_comm
(0116) delay_ms(5);
012B E005 LDI R16,5
012C E010 LDI R17,0
012D DF57 RCALL _delay_ms
012E 940E0520 CALL pop_gset3
0130 9508 RET
_lcd:
i --> R20
0131 940E052B CALL push_gset1
0133 2F40 MOV R20,R16
(0117) }
(0118)
(0119) //显示函数
(0120) void lcd(uchar i)
(0121) {
(0122) lcd_da(i);
0134 2F04 MOV R16,R20
0135 DF62 RCALL _lcd_da
0136 940E052E CALL pop_gset1
0138 9508 RET
_xs_lcd:
s --> R20
0139 940E052B CALL push_gset1
013B 01A8 MOVW R20,R16
(0123) }
(0124)
(0125) /***********************************
(0126) * 在第一行显示ID头函数 *
(0127) * 入 口:1显示ID1,2显示ID2 *
(0128) ***********************************/
(0129) void xs_lcd(char *s)
(0130) {
013C C005 RJMP 0x0142
(0131) while(*s)
(0132) {
(0133) lcd(*s);
013D 01FA MOVW R30,R20
013E 8100 LDD R16,Z+0
013F DFF1 RCALL _lcd
(0134) s++;
0140 5F4F SUBI R20,0xFF
0141 4F5F SBCI R21,0xFF
0142 01FA MOVW R30,R20
0143 8020 LDD R2,Z+0
0144 2022 TST R2
0145 F7B9 BNE 0x013D
0146 940E052E CALL pop_gset1
0148 9508 RET
(0135) }
(0136) }
(0137)
(0138) /***********************************
(0139) * 显示广告语函数 *
(0140) * tonghe *
(0141) * Tel:028-82834946 *
(0142) ***********************************/
(0143) void tonghe(void)
(0144) {
(0145) cls();
_tonghe:
0149 DFC9 RCALL _cls
(0146) locate(1,5); //写指令:第1行地址
014A E025 LDI R18,5
014B E001 LDI R16,1
014C DFCC RCALL _locate
(0147) xs_lcd("TONGHE");
014D E90A LDI R16,0x9A
014E E010 LDI R17,0
014F DFE9 RCALL _xs_lcd
(0148) locate(2,1); //写指令:第2行地址
0150 E021 LDI R18,1
0151 E002 LDI R16,2
0152 DFC6 RCALL _locate
(0149) xs_lcd("Tel:028-82834946");
0153 E809 LDI R16,0x89
0154 E010 LDI R17,0
0155 DFE3 RCALL _xs_lcd
0156 9508 RET
FILE: D:\PCF8563\1602_time\TWI_8563.h
(0001) /*******************************************
(0002) * PCF8563的I2C(TWI)操作函数 *
(0003) * 文 件 名:TWI_8563.h *
(0004) * 函数功能:利用CPU的硬件TWI接口操作 *
(0005) * 设 计:铜河 *
(0006) * 修改日期:2007年04月09日 *
(0007) * 版 本:V1.0 *
(0008) * 主控芯片:Mega16 *
(0009) *******************************************/
(0010) #include <iom16v.h>
(0011) #include <macros.h>
(0012) //宏定义
(0013) //状态寄存器TWSR各种状态定义
(0014) //主模式启动状态
(0015) #define START 0x08 //启动总线
(0016) #define RESTART 0x10 //重新启动总线
(0017)
(0018) //主发送模式各种状态
(0019) #define MT_SLA_ACK 0x18 //SLA_W写地址已发送,收到应答位
(0020) #define MT_SLA_NACK 0x20 //SLA_W写地址已发送,收到非应答位
(0021) #define MT_DATA_ACK 0x28 //写入数据已发送,收到应答位
(0022) #define MT_DATA_NACK 0x30 //写入数据已发送,收到应答位
(0023) #define MT_ARB_LOST 0x38 //SLA_W或数据仲裁失败
(0024)
(0025) //主接收模式各种状态
(0026) #define MR_ARB_LOST 0x38 //
(0027) #define MR_SLA_ACK 0x40 //SLA_R已发送,收到应答位
(0028) #define MR_SLA_NACK 0x48 //SLA_R已发送,收到非应答位
(0029) #define MR_DATA_ACK 0x50 //接收到数据,应答位已返回
(0030) #define MR_DATA_NACK 0x58 //接收到数据,非应答位已返回
(0031)
(0032) #define SLA_W 0xA2 //PCF8563写从地址
(0033) #define SLA_R 0xA3 //PCF8563读从地址
(0034)
(0035) #define start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
(0036) #define stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
(0037) #define waitack() {while(!(TWCR&(1<<TWINT)));}
(0038) #define chkack() (TWSR&0xf8) //check ack
(0039) #define sendack() (TWCR|=(1<<TWEA))
(0040) #define sendnack() (TWCR&=~(1<<TWEA))
(0041) #define sendbyte(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}
(0042) #define rcvnckbyte() (TWCR=(1<<TWINT)|(1<<TWEN))
(0043) #define rcvackbyte() (TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA))
(0044)
(0045) /* I2C Config */
(0046) #define I2C_ERR 0
(0047) #define I2C_CRR 1
(0048)
(0049) //简化宏定义
(0050) #define uchar unsigned char
(0051) #define uint unsigned int
(0052)
(0053)
(0054) //TWI初始化
(0055) void Twi_Init(void)
(0056) {
(0057) TWBR=14;
_Twi_Init:
0157 E08E LDI R24,0xE
0158 B980 OUT 0x00,R24
(0058) TWSR=0;
0159 2422 CLR R2
015A B821 OUT 0x01,R2
015B 9508 RET
(0059) }
(0060)
(0061) //写入时间函数
(0062) uchar write_tim(uchar a)
(0063) {
(0064) sendbyte(a); //发送
_write_tim:
a --> R16
015C B903 OUT 0x03,R16
015D E884 LDI R24,0x84
015E BF86 OUT 0x36,R24
(0065) waitack(); //等待写完成
015F B626 IN R2,0x36
0160 FE27 SBRS R2,7
0161 CFFD RJMP 0x015F
(0066) if(chkack()!=MT_SLA_ACK)return I2C_ERR; //检查是否正确写入
0162 B181 IN R24,0x01
0163 7F88 ANDI R24,0xF8
0164 3188 CPI R24,0x18
0165 F011 BEQ 0x0168
0166 2700 CLR R16
0167 C001 RJMP 0x0169
(0067) else return I2C_CRR;
0168 E001 LDI R16,1
0169 9508 RET
(0068) }
(0069) //读出时间函数
(0070) uchar read_tim(void)
(0071) {
(0072) rcvackbyte(); //接收一字节并返回应答
_read_tim:
016A EC84 LDI R24,0xC4
016B BF86 OUT 0x36,R24
(0073) waitack(); //等待接收完成
016C B626 IN R2,0x36
016D FE27 SBRS R2,7
016E CFFD RJMP 0x016C
(0074) if(chkack()!=MR_DATA_ACK)return I2C_ERR; //检查是否接收成功
016F B181 IN R24,0x01
0170 7F88 ANDI R24,0xF8
0171 3580 CPI R24,0x50
0172 F011 BEQ 0x0175
0173 2700 CLR R16
0174 C001 RJMP 0x0176
(0075) // return I2C_ERR;
(0076) else
(0077) return(TWDR); //读出时钟数据
0175 B103 IN R16,0x03
0176 9508 RET
_spk:
a --> R10
n --> R20
i --> R22
0177 940E0527 CALL push_gset3
0179 2F42 MOV R20,R18
017A 2F60 MOV R22,R16
FILE: D:\PCF8563\1602_time\1602_8563.c
(0001) /*************************************
(0002) * PCF8563时钟程序 *
(0003) * 文 件 名:1602_8563.c *
(0004) * 建立日期:2007年07月04日 *
(0005) * 设 计:铜河 *
(0006) * 修改日期:2007年07月08日 *
(0007) * 版 本:V22.02 *
(0008) * 主控芯片:Mega16L *
(0009) * 工作频率:7.3728MHz *
(0010) *************************************/
(0011) #include <iom16v.h>
(0012) #include <macros.h>
(0013) #include <stdio.h>
(0014) #include <D:\PCF8563\1602_time\timer_io.h>
(0015) #include <D:\PCF8563\1602_time\delay.h>
(0016) #include <D:\PCF8563\1602_time\lcd1602_4h.h>
(0017) #include <D:\PCF8563\1602_time\TWI_8563.h>
(0018)
(0019) //数据简化宏定义
(0020) #define uchar unsigned char
(0021) #define uint unsigned int
(0022)
(0023) //全局变量定义
(0024) uchar timer[8]; //时钟数据
(0025)
(0026) /**********************************
(0027) * 蜂鸣器发声函数 *
(0028) * 函数功能:蜂鸣器发出声响 *
(0029) * 入 口:n 声次数 *
(0030) * i 声时长,i*10ms *
(0031) * 返 回:无 *
(0032) * 发声频率:固定1KHz 无源 *
(0033) **********************************/
(0034) void spk(uchar i,uchar n)
(0035) {
(0036) uint a;
(0037) for(;n;n--)
017B C01E RJMP 0x019A
(0038) {
(0039) a=i*10; //计算每声响的长度:MS
017C E08A LDI R24,0xA
017D 9F86 MUL R24,R22
017E 0150 MOVW R10,R0
(0040) for(;a;a--)
017F C011 RJMP 0x0191
(0041) {
(0042) delay_us(500); //响声频率为1KHZ
0180 EF04 LDI R16,0xF4
0181 E011 LDI R17,1
0182 DEF8 RCALL _delay_us
(0043) SPK_TG;
0183 E480 LDI R24,0x40
0184 B222 IN R2,0x12
0185 2628 EOR R2,R24
0186 BA22 OUT 0x12,R2
(0044) delay_us(500);
0187 EF04 LDI R16,0xF4
0188 E011 LDI R17,1
0189 DEF1 RCALL _delay_us
(0045) SPK_TG;
018A E480 LDI R24,0x40
018B B222 IN R2,0x12
018C 2628 EOR R2,R24
018D BA22 OUT 0x12,R2
018E 01C5 MOVW R24,R10
018F 9701 SBIW R24,1
0190 015C MOVW R10,R24
0191 20AA TST R10
0192 F769 BNE 0x0180
0193 20BB TST R11
0194 F759 BNE 0x0180
(0046) }
(0047) SPK_OFF; //响完关闭蜂鸣器
0195 9896 CBI 0x12,6
(0048) delay_ms(100); //每声响之间隔100MS
0196 E604 LDI R16,0x64
0197 E010 LDI R17,0
0198 DEEC RCALL _delay_ms
0199 954A DEC R20
019A 2344 TST R20
019B F701 BNE 0x017C
019C 940E0520 CALL pop_gset3
019E 9508 RET
(0049) }
(0050) }
(0051)
(0052) /**********************************
(0053) * 读出数据函数 *
(0054) **********************************/
(0055) uchar read_timer(void)
(0056) {
(0057) start(); //启动总线
_read_timer:
019F EA84 LDI R24,0xA4
01A0 BF86 OUT 0x36,R24
(0058) waitack(); //等待启动完成
01A1 B626 IN R2,0x36
01A2 FE27 SBRS R2,7
01A3 CFFD RJMP 0x01A1
(0059) if(chkack()!=START)return I2C_ERR; //检查是否启动成功
01A4 B181 IN R24,0x01
01A5 7F88 ANDI R24,0xF8
01A6 3088 CPI R24,0x8
01A7 F011 BEQ 0x01AA
01A8 2700 CLR R16
01A9 C046 RJMP 0x01F0
(0060) write_tim(SLA_W); //发送写地址
01AA EA02 LDI R16,0xA2
01AB DFB0 RCALL _write_tim
(0061) write_tim(0x02); //写数据地址
01AC E002 LDI R16,2
01AD DFAE RCALL _write_tim
(0062)
(0063) start();
01AE EA84 LDI R24,0xA4
01AF BF86 OUT 0x36,R24
(0064) waitack(); //等待启动完成
01B0 B626 IN R2,0x36
01B1 FE27 SBRS R2,7
01B2 CFFD RJMP 0x01B0
(0065) if(chkack()!=RESTART)return I2C_ERR; //检查是否启动成功
01B3 B181 IN R24,0x01
01B4 7F88 ANDI R24,0xF8
01B5 3180 CPI R24,0x10
01B6 F011 BEQ 0x01B9
01B7 2700 CLR R16
01B8 C037 RJMP 0x01F0
(0066) write_tim(SLA_R); //发送读地址
01B9 EA03 LDI R16,0xA3
01BA DFA1 RCALL _write_tim
(0067)
(0068) timer[0]=read_tim()&0x7F; //读出秒数据
01BB DFAE RCALL _read_tim
01BC 2F80 MOV R24,R16
01BD 778F ANDI R24,0x7F
01BE 938000A1 STS timer,R24
(0069) timer[1]=read_tim()&0x7F; //读出分数据
01C0 DFA9 RCALL _read_tim
01C1 2F80 MOV R24,R16
01C2 778F ANDI R24,0x7F
01C3 938000A2 STS timer+1,R24
(0070) timer[2]=read_tim()&0x3F; //读出时数据
01C5 DFA4 RCALL _read_tim
01C6 2F80 MOV R24,R16
01C7 738F ANDI R24,0x3F
01C8 938000A3 STS timer+2,R24
(0071) timer[3]=read_tim()&0x3F; //读出日数据
01CA DF9F RCALL _read_tim
01CB 2F80 MOV R24,R16
01CC 738F ANDI R24,0x3F
01CD 938000A4 STS timer+3,R24
(0072) timer[4]=read_tim()&0x07; //读出周数据
01CF DF9A RCALL _read_tim
01D0 2F80 MOV R24,R16
01D1 7087 ANDI R24,7
01D2 938000A5 STS 0xA5,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -