📄 test.lst
字号:
FF 9543 INC R20
100 3140 CPI R20,0x10
101 F3D0 BCS 0x00FC
102 9149 LD R20,Y+
103 9508 RET
_LCD_write_string:
s --> R20
Y --> R12
X --> R10
104 D220 RCALL push_xgset303C
105 2EC2 MOV R12,R18
106 2EA0 MOV R10,R16
107 814E LDD R20,Y+6
108 815F LDD R21,Y+7
(0116) }
(0117) /*-------------------------------------------------------------
(0118) 函数: 写字符串
(0119) 参数:列---X=0~15,行---Y=0~1 写地址
(0120) s为所要写的字符串
(0121) ---------------------------------------------------------------*/
(0122) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0123) {
(0124) LCD_set_xy(X,Y);
109 2D2C MOV R18,R12
10A 2D0A MOV R16,R10
10B DF8E RCALL _LCD_set_xy
10C C006 RJMP 0x0113
(0125) while(*s)
(0126) {
(0127) LCD_write_char(0,*s);
10D 01FA MOVW R30,R20
10E 940E 0375 CALL 0x0375
110 DF9F RCALL _LCD_write_char
(0128) s++;
111 5F4F SUBI R20,0xFF
112 4F5F SBCI R21,0xFF
113 01FA MOVW R30,R20
114 8020 LDD R2,Z+0
115 2022 TST R2
116 F7B1 BNE 0x010D
117 C214 RJMP pop_xgset303C
_LCD_write_data:
data --> Y,+0
i --> R20
dat --> R14
Y --> R12
X --> R10
118 D1F7 RCALL push_xgset30FC
119 2EC2 MOV R12,R18
11A 2EA0 MOV R10,R16
11B 9724 SBIW R28,4
11C 84EC LDD R14,Y+12
11D 84FD LDD R15,Y+13
(0129) }
(0130) }
(0131)
(0132) /*-------------------------------------------------------------
(0133) 函数: 写数字
(0134) 参数:列---X=0~15,行---Y=0~1 写地址
(0135) dat为所要写的数字
(0136) ---------------------------------------------------------------*/
(0137) void LCD_write_data(unsigned char X,unsigned char Y,int dat)
(0138) {
(0139) //unsigned char fuhao;
(0140) unsigned char data[4];
(0141) unsigned char i;
(0142)
(0143) /*if(dat<0)
(0144) {
(0145) fuhao='-';
(0146) dat=0-dat;
(0147) }
(0148) else
(0149) fuhao=' ';
(0150) data[0]=fuhao;*/
(0151) data[0]=dat/1000+0x30; dat%=1000;
11E EE28 LDI R18,0xE8
11F E033 LDI R19,3
120 0187 MOVW R16,R14
121 D1B4 RCALL div16s
122 01C8 MOVW R24,R16
123 96C0 ADIW R24,0x30
124 8388 STD Y+0,R24
125 EE28 LDI R18,0xE8
126 E033 LDI R19,3
127 0187 MOVW R16,R14
128 D1A9 RCALL mod16s
129 0178 MOVW R14,R16
(0152) data[1]=dat/100+0x30; dat%=100;
12A E624 LDI R18,0x64
12B E030 LDI R19,0
12C D1A9 RCALL div16s
12D 01C8 MOVW R24,R16
12E 96C0 ADIW R24,0x30
12F 8389 STD Y+1,R24
130 E624 LDI R18,0x64
131 E030 LDI R19,0
132 0187 MOVW R16,R14
133 D19E RCALL mod16s
134 0178 MOVW R14,R16
(0153) data[2]=dat/10+0x30;
135 E02A LDI R18,0xA
136 E030 LDI R19,0
137 D19E RCALL div16s
138 01C8 MOVW R24,R16
139 96C0 ADIW R24,0x30
13A 838A STD Y+2,R24
(0154) data[3]=dat%10+0x30;
13B E02A LDI R18,0xA
13C E030 LDI R19,0
13D 0187 MOVW R16,R14
13E D193 RCALL mod16s
13F 01C8 MOVW R24,R16
140 96C0 ADIW R24,0x30
141 838B STD Y+3,R24
(0155)
(0156) LCD_set_xy(X,Y);
142 2D2C MOV R18,R12
143 2D0A MOV R16,R10
144 DF55 RCALL _LCD_set_xy
(0157) for(i=0;i<4;i++)
145 2744 CLR R20
146 C009 RJMP 0x0150
(0158) LCD_write_char(0,data[i]);
147 01CE MOVW R24,R28
148 2FE4 MOV R30,R20
149 27FF CLR R31
14A 0FE8 ADD R30,R24
14B 1FF9 ADC R31,R25
14C 940E 0375 CALL 0x0375
14E DF61 RCALL _LCD_write_char
14F 9543 INC R20
150 3044 CPI R20,4
151 F3A8 BCS 0x0147
152 9624 ADIW R28,4
153 C1B3 RJMP pop_xgset30FC
FILE: D:\mega16_32实验板资料\ICCAVR源程序\twi\pcf8563\pcf8563.h
(0001) /*******************************************
(0002) * PCF8563的I2C(TWI)操作函数 *
(0003) * 文 件 名:pcf8563.h *
(0004) * 函数功能:利用CPU的硬件TWI接口操作 *
(0005) * 设 计:张子凤 *
(0006) * 修改日期:2008年11月11日 *
(0007) * 版 本:V1.0 *
(0008) * 主控芯片:Mega16 *
(0009) *******************************************/
(0010) //全局变量定义
(0011) unsigned char timer[8]; //时钟数据
(0012)
(0013) //写入时间函数
(0014) unsigned char write_tim(unsigned char a)
(0015) {
(0016) sendbyte(a); //发送
_write_tim:
a --> R16
154 B903 OUT 0x03,R16
155 E884 LDI R24,0x84
156 940E 0352 CALL 0x0352
(0017) waitack(); //等待写完成
(0018) if(chkack()!=MT_SLA_ACK)return I2C_ERR; //检查是否正确写入
158 3188 CPI R24,0x18
159 F011 BEQ 0x015C
15A 2700 CLR R16
15B C001 RJMP 0x015D
(0019) else return I2C_CRR;
15C E001 LDI R16,1
15D 9508 RET
(0020) }
(0021)
(0022) //读出时间函数
(0023) unsigned char read_tim(void)
(0024) {
(0025) rcvackbyte(); //接收一字节并返回应答
_read_tim:
15E EC84 LDI R24,0xC4
15F 940E 0352 CALL 0x0352
(0026) waitack(); //等待接收完成
(0027) if(chkack()!=MR_DATA_ACK)return I2C_ERR; //检查是否接收成功
161 3580 CPI R24,0x50
162 F011 BEQ 0x0165
163 2700 CLR R16
164 C001 RJMP 0x0166
(0028) else
(0029) return(TWDR); //读出时钟数据
165 B103 IN R16,0x03
166 9508 RET
_read_timer:
167 92AA ST R10,-Y
168 934A ST R20,-Y
(0030) }
(0031)
(0032) /**********************************
(0033) * 读出数据函数 *
(0034) **********************************/
(0035) unsigned char read_timer(void)
(0036) {
(0037) start(); //启动总线
169 EA84 LDI R24,0xA4
16A 940E 0352 CALL 0x0352
(0038) waitack(); //等待启动完成
(0039) if(chkack()!=START)return I2C_ERR; //检查是否启动成功
16C 3088 CPI R24,0x8
16D F011 BEQ 0x0170
16E 2700 CLR R16
16F C047 RJMP 0x01B7
(0040) write_tim(PCF8563_SLA_W); //发送写地址
170 EA02 LDI R16,0xA2
171 DFE2 RCALL _write_tim
(0041) write_tim(0x02); //写数据地址
172 E002 LDI R16,2
173 DFE0 RCALL _write_tim
(0042)
(0043) start();
174 EA84 LDI R24,0xA4
175 940E 0352 CALL 0x0352
(0044) waitack(); //等待启动完成
(0045) if(chkack()!=RESTART)return I2C_ERR; //检查是否启动成功
177 3180 CPI R24,0x10
178 F011 BEQ 0x017B
179 2700 CLR R16
17A C03C RJMP 0x01B7
(0046) write_tim(PCF8563_SLA_R); //发送读地址
17B EA03 LDI R16,0xA3
17C DFD7 RCALL _write_tim
(0047)
(0048) timer[0]=read_tim()&0x7F; //读出秒数据
17D DFE0 RCALL _read_tim
17E 2F80 MOV R24,R16
17F 778F ANDI R24,0x7F
180 9380 0060 STS timer,R24
(0049) timer[1]=read_tim()&0x7F; //读出分数据
182 DFDB RCALL _read_tim
183 2F80 MOV R24,R16
184 778F ANDI R24,0x7F
185 9380 0061 STS timer+1,R24
(0050) timer[2]=read_tim()&0x3F; //读出时数据
187 DFD6 RCALL _read_tim
188 2F40 MOV R20,R16
189 2F84 MOV R24,R20
18A 738F ANDI R24,0x3F
18B 9380 0062 STS timer+2,R24
(0051) timer[3]=read_tim()&0x3F; //读出日数据
18D DFD0 RCALL _read_tim
18E 2F40 MOV R20,R16
18F 2F84 MOV R24,R20
190 738F ANDI R24,0x3F
191 9380 0063 STS timer+3,R24
(0052) timer[4]=read_tim()&0x07; //读出周数据
193 DFCA RCALL _read_tim
194 2F40 MOV R20,R16
195 2F84 MOV R24,R20
196 7087 ANDI R24,7
197 9380 0064 STS 0x0064,R24
(0053) if(timer[4]==0)timer[4]=7;
199 2388 TST R24
19A F419 BNE 0x019E
19B E087 LDI R24,7
19C 9380 0064 STS 0x0064,R24
(0054) timer[5]=read_tim(); //读出月数据
19E DFBF RCALL _read_tim
19F 2EA0 MOV R10,R16
1A0 92A0 0065 STS 0x0065,R10
(0055) if((timer[5]&0x80)==0)
1A2 FD07 SBRC R16,7
1A3 C004 RJMP 0x01A8
(0056) timer[7]=0x20; //世纪位为0,是21世纪
1A4 E280 LDI R24,0x20
1A5 9380 0067 STS 0x0067,R24
1A7 C003 RJMP 0x01AB
(0057) else
(0058) timer[7]=0x19; //世纪位不为0,是20世纪
1A8 E189 LDI R24,0x19
1A9 9380 0067 STS 0x0067,R24
(0059) timer[5]=timer[5]&0x1F;
1AB 9180 0065 LDS R24,0x0065
1AD 718F ANDI R24,0x1F
1AE 9380 0065 STS 0x0065,R24
(0060) timer[6]=read_tim(); //读出年数据
1B0 DFAD RCALL _read_tim
1B1 2EA0 MOV R10,R16
1B2 92A0 0066 STS 0x0066,R10
(0061) stop();
1B4 E984 LDI R24,0x94
1B5 BF86 OUT 0x36,R24
(0062) return I2C_CRR;
1B6 E001 LDI R16,1
1B7 9149 LD R20,Y+
1B8 90A9 LD R10,Y+
1B9 9508 RET
_write_timer:
dat --> R20
1BA 934A ST R20,-Y
1BB 935A ST R21,-Y
1BC 01A8 MOVW R20,R16
(0063) }
(0064)
(0065) /**********************************
(0066) * 写入时钟函数 *
(0067) **********************************/
(0068) unsigned char write_timer(unsigned char *dat)
(0069) {
(0070) start(); //启动总线
1BD EA84 LDI R24,0xA4
1BE 940E 0352 CALL 0x0352
(0071) waitack(); //等待启动完成
(0072) if(chkack()!=START)return I2C_ERR; //检查是否启动成功
1C0 3088 CPI R24,0x8
1C1 F011 BEQ 0x01C4
1C2 2700 CLR R16
1C3 C020 RJMP 0x01E4
(0073) write_tim(PCF8563_SLA_W); //发送写地址
1C4 EA02 LDI R16,0xA2
1C5 DF8E RCALL _write_tim
(0074) write_tim(0x00); //写数据首地址
1C6 2700 CLR R16
1C7 DF8C RCALL _write_tim
(0075) write_tim(0x20); //写控制/状态寄存器1,暂停计时
1C8 E200 LDI R16,0x20
1C9 DF8A RCALL _write_tim
(0076) write_tim(0x00); //写控制/状态寄存器2
1CA 2700 CLR R16
1CB DF88 RCALL _write_tim
(0077) write_tim(dat[0]); //写秒数据0
1CC 01FA MOVW R30,R20
1CD 8100 LDD R16,Z+0
1CE DF85 RCALL _write_tim
(0078) write_tim(dat[1]); //写分数据
1CF 01FA MOVW R30,R20
1D0 8101 LDD R16,Z+1
1D1 DF82 RCALL _write_tim
(0079) write_tim(dat[2]); //写时数据
1D2 01FA MOVW R30,R20
1D3 8102 LDD R16,Z+2
1D4 DF7F RCALL _write_tim
(0080) write_tim(dat[3]); //写日数据
1D5 01FA MOVW R30,R20
1D6 8103 LDD R16,Z+3
1D7 DF7C RCALL _write_tim
(0081) write_tim(dat[4]); //写周数据
1D8 01FA MOVW R30,R20
1D9 8104 LDD R16,Z+4
1DA DF79 RCALL _write_tim
(0082) write_tim(dat[5]); //写月数据
1DB 01FA MOVW R30,R20
1DC 8105 LDD R16,Z+5
1DD DF76 RCALL _write_tim
(0083) write_tim(dat[6]); //写年数据
1DE 01FA MOVW R30,R20
1DF 8106 LDD R16,Z+6
1E0 DF73 RCALL _write_tim
(0084) stop();
1E1 E984 LDI R24,0x94
1E2 BF86 OUT 0x36,R24
(0085) return I2C_CRR;
1E3 E001 LDI R16,1
1E4 9159 LD R21,Y+
1E5 9149 LD R20,Y+
1E6 9508 RET
(0086) }
(0087)
(0088) /**********************************
(0089) * 启动时钟函数 *
(0090) **********************************/
(0091) unsigned char start_timer(void)
(0092) {
(0093) start(); //启动总线
_start_timer:
1E7 EA84 LDI R24,0xA4
1E8 940E 0352 CALL 0x0352
(0094) waitack(); //等待启动完成
(0095) if(chkack()!=START)return I2C_ERR; //检查是否启动成功
1EA 3088 CPI R24,0x8
1EB F011 BEQ 0x01EE
1EC 2700 CLR R16
1ED C009 RJMP 0x01F7
(0096) write_tim(PCF8563_SLA_W); //发送写地址
1EE EA02 LDI R16,0xA2
1EF DF64 RCALL _write_tim
(0097) write_tim(0x00); //写数据首地址
1F0 2700 CLR R16
1F1 DF62 RCALL _write_tim
(0098) write_tim(0x00); //写控制/状态寄存器1,暂停计时
1F2 2700 CLR R16
1F3 DF60 RCALL _write_tim
(0099) stop();
1F4 E984 LDI R24,0x94
1F5 BF86 OUT 0x36,R24
(0100) return I2C_CRR;
1F6 E001 LDI R16,1
1F7 9508 RET
(0101) }
(0102)
(0103) /**********************************
(0104) * 将时钟数据转换后在LCD上显示 *
(0105) **********************************/
(0106) void timer_lcd(void)
(0107) {
(0108) LCD_set_xy(4,0); //写指令:第1行第4列地址
_timer_lcd:
1F8 2722 CLR R18
1F9 E004 LDI R16,4
1FA DE9F RCALL _LCD_set_xy
(0109)
(0110) LCD_write_char(0,(timer[7]>>4)+0x30);
1FB 9120 0067 LDS R18,0x0067
1FD 940E 033F CALL <created procedures>
1FF DEB0 RCALL _LCD_write_char
(0111) LCD_write_char(0,(timer[7]&0x0f)+0x30);
200 9120 0067 LDS R18,0x0067
202 2733 CLR R19
203 702F ANDI R18,0xF
204 7030 ANDI R19,0
205 940E 034D CALL 0x034D
207 DEA8 RCALL _LCD_write_char
(0112) LCD_write_char(0,(timer[6]>>4)+0x30); //显示年
208 9120 0066 LDS R18,0x0066
20A 940E 033F CALL <created procedures>
20C DEA3 RCALL _LCD_write_char
(0113) LCD_write_char(0,(timer[6]&0x0f)+0x30);
20D 9120 0066 LDS R18,0x0066
20F 2733 CLR R19
210 702F ANDI R18,0xF
211 7030 ANDI R19,0
212 940E 034D CALL 0x034D
214 DE9B RCALL _LCD_write_char
215 940E 0370 CALL 0x0370
(0114) LCD_write_char(0,'/');
217 DE98 RCALL _LCD_write_char
(0115) LCD_write_char(0,(timer[5]>>4)+0x30); //显示月
218 9120 0065 LDS R18,0x0065
21A 940E 033F CALL <created procedures>
21C DE93 RCALL _LCD_write_char
(0116) LCD_write_char(0,(timer[5]&0x0f)+0x30);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -