📄 ds1302.lst
字号:
01D0 3A05 CPI R16,0xA5
01D1 F411 BNE 0x01D4
(0230) {
(0231) exist=TRUE; //如果读取值与写入值相等,返回TRUE
01D2 E041 LDI R20,1
(0232) }
01D3 C001 RJMP 0x01D5
(0233) else
(0234) {
(0235) exist=FALSE; //如果读取值与写入值不相等,返回FALSE
01D4 2744 CLR R20
(0236) }
(0237) return exist;
01D5 2F04 MOV R16,R20
01D6 940E02BA CALL pop_gset1
01D8 9508 RET
(0238) }
(0239) /*******************************************
(0240) 函数名称: DS1302_init
(0241) 功 能: 初始化DS1302
(0242) 参 数: 无
(0243) 返回值 : 无
(0244) /********************************************/
(0245) void DS1302_init(void)
(0246) {
(0247) DS1302_writeD(C_WP|WR,UPROTECT); //写入写允许命令
_DS1302_init:
01D9 2722 CLR R18
01DA E80E LDI R16,0x8E
01DB DF70 RCALL _DS1302_writeD
(0248) DS1302_writeD(C_SEC|WR,CLK_START); //启动振荡器,DS1302开始工作
01DC 2722 CLR R18
01DD E800 LDI R16,0x80
01DE DF6D RCALL _DS1302_writeD
(0249) DS1302_writeD(C_WP|WR,PROTECT); //控制命令,WP位为1,不允许写操作
01DF E820 LDI R18,0x80
01E0 E80E LDI R16,0x8E
(0250) }
01E1 CF6A RJMP _DS1302_writeD
_BCD_ASCII:
ptasc --> R20
BCD --> R22
01E2 940E02CE CALL push_gset2
01E4 01A9 MOVW R20,R18
01E5 2F60 MOV R22,R16
(0251) /*******************************************
(0252) 函数名称: BCD_ASCII
(0253) 功 能: 将压缩BCD码转换成ascii码
(0254) 参 数: BCD--将要转换的压缩BCD码
(0255) ptasc--转换后的ASCII码数组指针
(0256) 返回值 : 无
(0257) /********************************************/
(0258) void BCD_ASCII(uchar BCD,uchar ptasc[])
(0259) {
(0260) ptasc[0]=BCD/16|0x30; //0X58 35 38 //转换十位
01E6 E110 LDI R17,0x10
01E7 2F06 MOV R16,R22
01E8 940E0295 CALL div8u
01EA 2F80 MOV R24,R16
01EB 6380 ORI R24,0x30
01EC 01FA MOVW R30,R20
01ED 8380 STD R24,0+Z
(0261) ptasc[1]=BCD&0x0F|0x30; //转换个位
01EE 2F86 MOV R24,R22
01EF 708F ANDI R24,0xF
01F0 6380 ORI R24,0x30
01F1 8381 STD R24,1+Z
(0262) }
01F2 940E02D6 CALL pop_gset2
01F4 9508 RET
_Disp_time:
line1 --> Y+11
line2 --> Y+2
asc --> Y+0
i --> R20
time --> R22
01F5 940E02CE CALL push_gset2
01F7 01B8 MOVW R22,R16
01F8 9766 SBIW R28,0x16
(0263) /*******************************************
(0264) 函数名称: Disp_time
(0265) 功 能: 在1602液晶上显示当前时间(第1行格式:年-月-日 星期;第2行格式:时-分-秒)
(0266) 参 数: time[]--时间数组
(0267) 返回值 : 无
(0268) /********************************************/
(0269) void Disp_time(uchar time[])
(0270) {
(0271) uchar i,asc[2];
(0272) uchar line1[11]={0,0,'-',0,0,'-',0,0,' ',0,'\0'};//显示第1行的字符数组
01F9 E680 LDI R24,0x60
01FA E090 LDI R25,0
01FB 01FE MOVW R30,R28
01FC 963B ADIW R30,0xB
01FD E00B LDI R16,0xB
01FE E010 LDI R17,0
01FF 93FA ST R31,-Y
0200 93EA ST R30,-Y
0201 939A ST R25,-Y
0202 938A ST R24,-Y
0203 940E02DC CALL asgncblk
(0273) uchar line2[9]={0,0,':',0,0,':',0,0,'\0'}; //显示第2行的字符数组
0205 E68B LDI R24,0x6B
0206 E090 LDI R25,0
0207 01FE MOVW R30,R28
0208 9632 ADIW R30,2
0209 E009 LDI R16,0x9
020A E010 LDI R17,0
020B 93FA ST R31,-Y
020C 93EA ST R30,-Y
020D 939A ST R25,-Y
020E 938A ST R24,-Y
020F 940E02DC CALL asgncblk
(0274) for(i=0;i<3;i++) //为第2行的字符数组赋值
0211 2744 CLR R20
0212 C01E RJMP 0x0231
(0275) {
(0276) BCD_ASCII(time[2-i],asc);
0213 019E MOVW R18,R28
0214 2E24 MOV R2,R20
0215 2433 CLR R3
0216 E0E2 LDI R30,2
0217 E0F0 LDI R31,0
0218 19E2 SUB R30,R2
0219 09F3 SBC R31,R3
021A 0FE6 ADD R30,R22
021B 1FF7 ADC R31,R23
021C 8100 LDD R16,0+Z
021D DFC4 RCALL _BCD_ASCII
(0277) line2[i*3]=asc[0];
021E E083 LDI R24,3
021F 9F84 MUL R24,R20
0220 01F0 MOVW R30,R0
0221 01CE MOVW R24,R28
0222 9602 ADIW R24,2
0223 0FE8 ADD R30,R24
0224 1FF9 ADC R31,R25
0225 8028 LDD R2,0+Y
0226 8220 STD R2,0+Z
(0278) line2[i*3+1]=asc[1];
0227 E083 LDI R24,3
0228 9F84 MUL R24,R20
0229 01F0 MOVW R30,R0
022A 01CE MOVW R24,R28
022B 9603 ADIW R24,3
022C 0FE8 ADD R30,R24
022D 1FF9 ADC R31,R25
022E 8029 LDD R2,1+Y
022F 8220 STD R2,0+Z
0230 9543 INC R20
0231 3043 CPI R20,3
0232 F300 BCS 0x0213
(0279) }
(0280) BCD_ASCII(time[6],asc); //为第1行的年赋值
0233 019E MOVW R18,R28
0234 01FB MOVW R30,R22
0235 8106 LDD R16,6+Z
0236 DFAB RCALL _BCD_ASCII
(0281) line1[0]=asc[0];
0237 8028 LDD R2,0+Y
0238 862B STD R2,11+Y
(0282) line1[1]=asc[1];
0239 8029 LDD R2,1+Y
023A 862C STD R2,12+Y
(0283) BCD_ASCII(time[4],asc); //为第1行的月赋值
023B 019E MOVW R18,R28
023C 01FB MOVW R30,R22
023D 8104 LDD R16,4+Z
023E DFA3 RCALL _BCD_ASCII
(0284) line1[3]=asc[0];
023F 8028 LDD R2,0+Y
0240 862E STD R2,14+Y
(0285) line1[4]=asc[1];
0241 8029 LDD R2,1+Y
0242 862F STD R2,15+Y
(0286) BCD_ASCII(time[3],asc); //为第1行的日赋值
0243 019E MOVW R18,R28
0244 01FB MOVW R30,R22
0245 8103 LDD R16,3+Z
0246 DF9B RCALL _BCD_ASCII
(0287) line1[6]=asc[0];
0247 8028 LDD R2,0+Y
0248 8A29 STD R2,17+Y
(0288) line1[7]=asc[1];
0249 8029 LDD R2,1+Y
024A 8A2A STD R2,18+Y
(0289) BCD_ASCII(time[5],asc); //为第1行的星期赋值
024B 019E MOVW R18,R28
024C 01FB MOVW R30,R22
024D 8105 LDD R16,5+Z
024E DF93 RCALL _BCD_ASCII
(0290) line1[9]=asc[1];
024F 8029 LDD R2,1+Y
0250 8A2C STD R2,20+Y
(0291)
(0292) while(LCD1602_readBF());
0251 DE5A RCALL _LCD1602_readBF
0252 2300 TST R16
0253 F7E9 BNE 0x0251
(0293) LCD1602_gotoXY(1,2); //第1行从第3个位置开始显示
0254 E022 LDI R18,2
0255 E001 LDI R16,1
0256 DE63 RCALL _LCD1602_gotoXY
(0294) LCD1602_sendstr("20"); //将07年显示为2007的形式
0257 E600 LDI R16,0x60
0258 E010 LDI R17,0
0259 DE3C RCALL _LCD1602_sendstr
(0295) LCD1602_sendstr(line1); //第1行显示
025A 018E MOVW R16,R28
025B 5F05 SUBI R16,0xF5
025C 4F1F SBCI R17,0xFF
025D DE38 RCALL _LCD1602_sendstr
(0296) while(LCD1602_readBF());
025E DE4D RCALL _LCD1602_readBF
025F 2300 TST R16
0260 F7E9 BNE 0x025E
(0297) LCD1602_gotoXY(2,4); //第2行从第5个位置开始显示
0261 E024 LDI R18,4
0262 E002 LDI R16,2
0263 DE56 RCALL _LCD1602_gotoXY
(0298) LCD1602_sendstr(line2); //第2行显示
0264 018E MOVW R16,R28
0265 5F0E SUBI R16,0xFE
0266 4F1F SBCI R17,0xFF
0267 DE2E RCALL _LCD1602_sendstr
(0299) }
0268 9666 ADIW R28,0x16
0269 940E02D6 CALL pop_gset2
026B 9508 RET
_main:
dis_y --> Y+1
dis_x --> Y+1
shift --> Y+1
setdat --> Y+1
setadd --> Y+1
settime --> Y+7
gettime --> Y+0
026C 972E SBIW R28,0xE
(0300) /*******************************************
(0301) 函数名称: main
(0302) 功 能: 1. 在1602液晶上显示当前时间 2.可以设置时间(M1-M9为数字0-9,M13为设置模式和显示模式选择,M14为当前设置位选择)
(0303) 参 数: 无
(0304) 返回值 : 无
(0305) /********************************************/
(0306) void main(void)
(0307) {
(0308)
(0309)
(0310) uchar setadd,setdat,shift; //setadd指定将当前数值送入DS1302的哪个寄存器
(0311) //setdat是当前设置的数值,即被送入DS1302指定寄存器的数
(0312) //shift来实现十位和各位的设置相互独立(因为十位和个位是在一个寄存器里的)
(0313) uchar dis_x,dis_y; //存储1602液晶当前光标的位置
(0314) uchar settime[7]={0x50,0x59,0x23,0x01,0x01,0x06,0x07};//设置的秒,分,时,日,月,星期,年
026D E784 LDI R24,0x74
026E E090 LDI R25,0
026F 01FE MOVW R30,R28
0270 9637 ADIW R30,7
0271 E007 LDI R16,7
0272 E010 LDI R17,0
0273 93FA ST R31,-Y
0274 93EA ST R30,-Y
0275 939A ST R25,-Y
0276 938A ST R24,-Y
0277 940E02DC CALL asgncblk
(0315) uchar gettime[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};//保存当前时间的数组
0279 E78B LDI R24,0x7B
027A E090 LDI R25,0
027B 01FE MOVW R30,R28
027C E007 LDI R16,7
027D E010 LDI R17,0
027E 93FA ST R31,-Y
027F 93EA ST R30,-Y
0280 939A ST R25,-Y
0281 938A ST R24,-Y
0282 940E02DC CALL asgncblk
(0316) LCD1602_initial(); //初始化1602液晶
0284 DE4B RCALL _LCD1602_initial
(0317) DS1302_portinit(); //初始化DS1302的三根数据线
0285 DE8F RCALL _DS1302_portinit
(0318) DS1302_init(); //启动振荡器,DS1302开始工作
0286 DF52 RCALL _DS1302_init
(0319) DS1302_setT(settime); //设置初始时间
0287 018E MOVW R16,R28
0288 5F09 SUBI R16,0xF9
0289 4F1F SBCI R17,0xFF
028A DEFD RCALL _DS1302_setT
028B C004 RJMP 0x0290
(0320) while(1) //以下程序完成显示和设置时间
(0321) {
(0322) DS1302_getT(gettime); //获得当前时间
028C 018E MOVW R16,R28
028D DF1A RCALL _DS1302_getT
(0323)
(0324) Disp_time(gettime); //显示当前时间
028E 018E MOVW R16,R28
028F DF65 RCALL _Disp_time
0290 CFFB RJMP 0x028C
(0325) }
(0326) }
FILE: <library>
0291 962E ADIW R28,0xE
0292 9508 RET
mod8u:
0293 9468 BSET 6
0294 C001 RJMP xdiv8u
div8u:
0295 94E8 BCLR 6
xdiv8u:
0296 932A ST R18,-Y
0297 92FA ST R15,-Y
0298 24FF CLR R15
0299 E028 LDI R18,0x8
029A 0F00 LSL R16
029B 1CFF ROL R15
029C 16F1 CP R15,R17
029D F010 BCS 0x02A0
029E 1AF1 SUB R15,R17
029F 9503 INC R16
02A0 952A DEC R18
02A1 F7C1 BNE 0x029A
02A2 F40E BRTC 0x02A4
02A3 2D0F MOV R16,R15
02A4 90F9 LD R15,Y+
02A5 9129 LD R18,Y+
02A6 9508 RET
empy16s:
02A7 920A ST R0,-Y
02A8 921A ST R1,-Y
02A9 938A ST R24,-Y
02AA 939A ST R25,-Y
02AB 9F02 MUL R16,R18
02AC 01C0 MOVW R24,R0
02AD 9F12 MUL R17,R18
02AE 0D90 ADD R25,R0
02AF 9F03 MUL R16,R19
02B0 0D90 ADD R25,R0
02B1 018C MOVW R16,R24
02B2 9199 LD R25,Y+
02B3 9189 LD R24,Y+
02B4 9019 LD R1,Y+
02B5 9009 LD R0,Y+
02B6 9508 RET
push_gset1:
02B7 935A ST R21,-Y
02B8 934A ST R20,-Y
02B9 9508 RET
pop_gset1:
02BA E0E1 LDI R30,1
pop:
02BB 9149 LD R20,Y+
02BC 9159 LD R21,Y+
02BD FDE0 SBRC R30,0
02BE 9508 RET
02BF 9169 LD R22,Y+
02C0 9179 LD R23,Y+
02C1 FDE1 SBRC R30,1
02C2 9508 RET
02C3 90A9 LD R10,Y+
02C4 90B9 LD R11,Y+
02C5 FDE2 SBRC R30,2
02C6 9508 RET
02C7 90C9 LD R12,Y+
02C8 90D9 LD R13,Y+
02C9 FDE3 SBRC R30,3
02CA 9508 RET
02CB 90E9 LD R14,Y+
02CC 90F9 LD R15,Y+
02CD 9508 RET
push_gset2:
02CE 937A ST R23,-Y
02CF 936A ST R22,-Y
02D0 940C02B7 JMP push_gset1
push_gset3:
02D2 92BA ST R11,-Y
02D3 92AA ST R10,-Y
02D4 940C02CE JMP push_gset2
pop_gset2:
02D6 E0E2 LDI R30,2
02D7 940C02BB JMP pop
pop_gset3:
02D9 E0E4 LDI R30,4
02DA 940C02BB JMP pop
asgncblk:
02DC 93AA ST R26,-Y
02DD 93BA ST R27,-Y
02DE 93EA ST R30,-Y
02DF 93FA ST R31,-Y
02E0 920A ST R0,-Y
02E1 81AF LDD R26,7+Y
02E2 85B8 LDD R27,8+Y
02E3 81ED LDD R30,5+Y
02E4 81FE LDD R31,6+Y
02E5 3000 CPI R16,0
02E6 0701 CPC R16,R17
02E7 F031 BEQ 0x02EE
02E8 95C8 LPM
02E9 920D ST R0,X+
02EA 9631 ADIW R30,1
02EB 5001 SUBI R16,1
02EC 4010 SBCI R17,0
02ED CFF7 RJMP 0x02E5
02EE 9009 LD R0,Y+
02EF 91F9 LD R31,Y+
02F0 91E9 LD R30,Y+
02F1 91B9 LD R27,Y+
02F2 91A9 LD R26,Y+
02F3 9624 ADIW R28,4
02F4 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -