📄 time-1302.s
字号:
; DDRA &= ~(1<<DDA4); //数据脚改为输入
cbi 0x1a,4
.dbline 219
; NOP();
nop
.dbline 220
; for (i=0;i<8;i++)
clr R20
rjmp L45
L42:
.dbline 221
.dbline 222
rcall _OutputByte
ldi R24,<_buf_read
ldi R25,>_buf_read
mov R30,R20
clr R31
add R30,R24
adc R31,R25
std z+0,R16
.dbline 223
L43:
.dbline 220
inc R20
L45:
.dbline 220
cpi R20,8
brlo L42
.dbline 224
; {
; buf_read[i]=OutputByte();
; }
; PORTA &= ~(1<<PA5); //RST=0
cbi 0x1b,5
.dbline -2
L41:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e write_pc232 _write_pc232 fV
; i -> R20
.even
_write_pc232::
rcall push_gset1
mov R20,R16
.dbline -1
.dbline 235
; }
;
; /********************************************************
; 子程序名: write_pc232()
; 功 能: 串口发送一个字节
; 输入参数: /
; 输出参数: /
; 描 述: 把数据发送出去先发送再检测,发完后,才离开
; ********************************************************/
; void write_pc232(uchar i)
; {
L47:
.dbline 236
L48:
.dbline 236
; while(!(UCSRA&(1<<UDRE))); //1字节发送完毕?
sbis 0xb,5
rjmp L47
.dbline 237
; UDR = i; //发送一个字符数据
out 0xc,R20
.dbline 238
; DelaymS (10);
ldi R16,10
ldi R17,0
rcall _DelaymS
.dbline -2
L46:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e mcu_Init _mcu_Init fV
.even
_mcu_Init::
.dbline -1
.dbline 248
; }
; /************************************************
; 函 数 名: mcu_Init()
; 功 能: 单片机初始化函数
; 输入参数: /
; 输出参数: /
; 描 述: 相关口方向的设置等
; ***********************************************/
; void mcu_Init(void)
; {
.dbline 249
; DDRC = 0xff; //PC口为推挽1输出,段码
ldi R24,255
out 0x14,R24
.dbline 250
; DDRD = 0xff; //PD口为推挽1输出,位码,PD7为485DE脚。
out 0x11,R24
.dbline 251
; DDRA = 0xff; //PA口接DS1302
out 0x1a,R24
.dbline -2
L50:
.dbline 0 ; func end
ret
.dbend
.dbfunc e usart_Init _usart_Init fV
.even
_usart_Init::
.dbline -1
.dbline 261
; }
; /********************************************************
; 子程序名: usart_Init()
; 功 能: 串口初始化
; 输入参数: /
; 输出参数: /
; 描 述: /
; ********************************************************/
; void usart_Init (void)
; {
.dbline 262
; UBRRL=51; //波特率寄存器,UART:9600bps,8.000MHz
ldi R24,51
out 0x9,R24
.dbline 263
; UCSRB = (1<<RXEN)|(1<<TXEN); //UART控制寄存器,RXD&TXD使能
ldi R24,24
out 0xa,R24
.dbline -2
L51:
.dbline 0 ; func end
ret
.dbend
.dbfunc e spk _spk fV
; i -> R20
.even
_spk::
rcall push_gset1
mov R20,R16
.dbline -1
.dbline 273
; }
; /************************************************
; 函 数 名: spk()
; 功 能: 蜂鸣器鸣叫一声函数
; 输入参数:
; 输出参数:
; 描 述: /
; ***********************************************/
; void spk (uchar i)
; {
.dbline 274
; DDRA |= (1<<2); //DDRA2为输出。
sbi 0x1a,2
.dbline 275
; PORTA &= ~(1<<PA2); //蜂鸣器响
cbi 0x1b,2
.dbline 276
; DelaymS (i); //延迟
mov R16,R20
clr R17
rcall _DelaymS
.dbline 277
; PORTA |= (1<<PA2); //蜂鸣器关闭
sbi 0x1b,2
.dbline -2
L52:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e data_conversion _data_conversion fV
.even
_data_conversion::
.dbline -1
.dbline 288
; }
; /********************************************************
; 子程序名: data_conversion()
; 输入参数: 数据转换程序
; 输出参数: /
; 描 述: /1302读出的数据是BCD码形式,必须进行数制转换。
; 数据格式: 秒 分 时 日 月 星期 年 写保护字节
; 显示格式: 秒秒 分分 时时 日日 月月 年年 辅助
; ********************************************************/
; void data_conversion (void)
; {
.dbline 289
; buf_time[29] = (buf_read[0] & 0x0f) + '0'; //秒的低位
lds R24,_buf_read
andi R24,15
subi R24,208 ; addi 48
sts _buf_time+29,R24
.dbline 290
; buf_time[28] = (buf_read[0] >> 4 ) + '0'; //秒的高位
lds R24,_buf_read
swap R24
andi R24,#0x0F
subi R24,208 ; addi 48
sts _buf_time+28,R24
.dbline 292
;
; buf_time[26] = (buf_read[1] & 0x0f) + '0'; //分的低位
lds R24,_buf_read+1
andi R24,15
subi R24,208 ; addi 48
sts _buf_time+26,R24
.dbline 293
; buf_time[25] = (buf_read[1] >> 4 ) + '0'; //分的高位
lds R24,_buf_read+1
swap R24
andi R24,#0x0F
subi R24,208 ; addi 48
sts _buf_time+25,R24
.dbline 295
;
; buf_time[23] = (buf_read[2] & 0x0f) + '0'; //时的低位
lds R24,_buf_read+2
andi R24,15
subi R24,208 ; addi 48
sts _buf_time+23,R24
.dbline 296
; buf_time[22] = (buf_read[2] >> 4 ) + '0'; //时的高位
lds R24,_buf_read+2
swap R24
andi R24,#0x0F
subi R24,208 ; addi 48
sts _buf_time+22,R24
.dbline 298
;
; buf_time[14] = (buf_read[3] & 0x0f) + '0'; //日的低位
lds R24,_buf_read+3
andi R24,15
subi R24,208 ; addi 48
sts _buf_time+14,R24
.dbline 299
; buf_time[13] = (buf_read[3] >> 4 ) + '0'; //日的高位
lds R24,_buf_read+3
swap R24
andi R24,#0x0F
subi R24,208 ; addi 48
sts _buf_time+13,R24
.dbline 301
;
; buf_time[11] = (buf_read[4] & 0x0f) + '0'; //月的高位
lds R24,_buf_read+4
andi R24,15
subi R24,208 ; addi 48
sts _buf_time+11,R24
.dbline 302
; buf_time[10] = (buf_read[4] >> 4 ) + '0'; //月的高位
lds R24,_buf_read+4
swap R24
andi R24,#0x0F
subi R24,208 ; addi 48
sts _buf_time+10,R24
.dbline 304
;
; buf_time[8] = (buf_read[6] & 0x0f) + '0'; //年的高位
lds R24,_buf_read+6
andi R24,15
subi R24,208 ; addi 48
sts _buf_time+8,R24
.dbline 305
; buf_time[7] = (buf_read[6] >> 4 ) + '0'; //年的高位
lds R24,_buf_read+6
swap R24
andi R24,#0x0F
subi R24,208 ; addi 48
sts _buf_time+7,R24
.dbline -2
L53:
.dbline 0 ; func end
ret
.dbend
.area lit(rom, con, rel)
L77:
.byte 32,32,189,241,204,236,181,196,200,213,198,218,202,199,163,186
L78:
.byte 32,32,181,177,199,176,181,196,202,177,188,228,202,199,163,186
.area text(rom, con, rel)
.dbfile E:\iccavr代码\实验6_实时时钟DS1302\time-1302.c
.dbfunc e out_data_pc232 _out_data_pc232 fV
; time2 -> y+16
; time1 -> y+0
; i -> R20
.even
_out_data_pc232::
rcall push_gset1
sbiw R28,32
.dbline -1
.dbline 315
; }
; /********************************************************
; 子程序名: out_data_pc232()
; 功 能: 串口发送时间数据到PC,
; 输入参数: /
; 输出参数: /
; 描 述: 包括"当前的温度是:xxx.xx摄氏度",此程序借助LCD的显示缓冲区
; ********************************************************/
; void out_data_pc232(void)
; {
.dbline 317
; uchar i;
; uchar time1[16]=" 今天的日期是:";
ldi R24,<L77
ldi R25,>L77
movw R30,R28
ldi R16,16
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 318
; uchar time2[16]=" 当前的时间是:";
ldi R24,<L78
ldi R25,>L78
movw R30,R28
adiw R30,16
ldi R16,16
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 320
;
; for(i=0;i<16;i++) //向串口发送数据
clr R20
rjmp L82
L79:
.dbline 321
.dbline 322
movw R24,R28
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
rcall _write_pc232
.dbline 323
L80:
.dbline 320
inc R20
L82:
.dbline 320
cpi R20,16
brlo L79
.dbline 324
; {
; write_pc232(time1[i]);
; }
; write_pc232('2'); //年
ldi R16,50
rcall _write_pc232
.dbline 325
; write_pc232('0');
ldi R16,48
rcall _write_pc232
.dbline 326
; write_pc232(buf_time[7]);
lds R16,_buf_time+7
rcall _write_pc232
.dbline 327
; write_pc232(buf_time[8]);
lds R16,_buf_time+8
rcall _write_pc232
.dbline 328
; write_pc232('-');
ldi R16,45
rcall _write_pc232
.dbline 329
; write_pc232(buf_time[10]); //月
lds R16,_buf_time+10
rcall _write_pc232
.dbline 330
; write_pc232(buf_time[11]);
lds R16,_buf_time+11
rcall _write_pc232
.dbline 331
; write_pc232('-');
ldi R16,45
rcall _write_pc232
.dbline 332
; write_pc232(buf_time[13]); //日
lds R16,_buf_time+13
rcall _write_pc232
.dbline 333
; write_pc232(buf_time[14]);
lds R16,_buf_time+14
rcall _write_pc232
.dbline 335
;
; for(i=0;i<16;i++) //向串口发送数据
clr R20
rjmp L92
L89:
.dbline 336
.dbline 337
movw R24,R28
adiw R24,16
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
rcall _write_pc232
.dbline 338
L90:
.dbline 335
inc R20
L92:
.dbline 335
cpi R20,16
brlo L89
.dbline 339
; {
; write_pc232(time2[i]);
; }
; write_pc232(buf_time[22]); //时
lds R16,_buf_time+22
rcall _write_pc232
.dbline 340
; write_pc232(buf_time[23]);
lds R16,_buf_time+23
rcall _write_pc232
.dbline 341
; write_pc232(':');
ldi R16,58
rcall _write_pc232
.dbline 342
; write_pc232(buf_time[25]); //分
lds R16,_buf_time+25
rcall _write_pc232
.dbline 343
; write_pc232(buf_time[26]);
lds R16,_buf_time+26
rcall _write_pc232
.dbline 344
; write_pc232(':');
ldi R16,58
rcall _write_pc232
.dbline 345
; write_pc232(buf_time[28]); //秒
lds R16,_buf_time+28
rcall _write_pc232
.dbline 346
; write_pc232(buf_time[29]);
lds R16,_buf_time+29
rcall _write_pc232
.dbline 348
;
; write_pc232('\n');
ldi R16,10
rcall _write_pc232
.dbline 349
; write_pc232('\r'); //显示回车换行
ldi R16,13
rcall _write_pc232
.dbline -2
L76:
adiw R28,32
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym l time2 16 A[16:16]c
.dbsym l time1 0 A[16:16]c
.dbsym r i 20 c
.dbend
.area lit(rom, con, rel)
L100:
.byte 32,32,32,32,'w,'e,'l,'c,'o,'m,'e,33,32,32,32,32
.byte 32,32,'w,'w,'w,46,'i,'t,'s,'n,46,'c,'n,33,32,32
.byte 0
.area text(rom, con, rel)
.dbfile E:\iccavr代码\实验6_实时时钟DS1302\time-1302.c
.dbfunc e main _main fV
; buf_logo -> y+0
; data_old -> R20
.even
_main::
sbiw R28,33
.dbline -1
.dbline 353
; }
; //*****************主程序**********************************
; void main (void)
; {
.dbline 355
; uchar data_old;
; uchar buf_logo[]=" welcome! www.itsn.cn! ";
ldi R24,<L100
ldi R25,>L100
movw R30,R28
ldi R16,33
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 357
;
; mcu_Init(); //单片机初始化
rcall _mcu_Init
.dbline 358
; usart_Init(); //串口初始化
rcall _usart_Init
.dbline 359
; init_lcd(); //lcd初始化
rcall _init_lcd
.dbline 361
;
; write_pc232('o'); //测试串口
ldi R16,111
rcall _write_pc232
.dbline 362
; write_pc232('k'); //测试串口
ldi R16,107
rcall _write_pc232
.dbline 363
; write_pc232('\n');
ldi R16,10
rcall _write_pc232
.dbline 364
; write_pc232('\r'); //显示回车换行
ldi R16,13
rcall _write_pc232
.dbline 366
;
; display_lcd(buf_logo); //显示LOGO
movw R16,R28
rcall _display_lcd
.dbline 367
; spk (1000); //上电蜂鸣器长响
ldi R16,232
rcall _spk
.dbline 368
; DelaymS(2000); //长延迟
ldi R16,2000
ldi R17,7
rcall _DelaymS
.dbline 369
; display_lcd(buf_time); //开始工作,LCD刷新显示一屏
ldi R16,<_buf_time
ldi R17,>_buf_time
rcall _display_lcd
.dbline 370
; spk (100); //开始工作,蜂鸣器短响
ldi R16,100
rcall _spk
.dbline 373
;
; //---------此段测试1302是否已经写过内容了,若写过就不再重新写。
; read_DS1302(); //读时间
rcall _read_DS1302
.dbline 374
; if(buf_read[0] & 0x80)
lds R2,_buf_read
sbrs R2,7
rjmp L101
.dbline 375
; {
.dbline 376
; write_DS1302(); //写入需要的初始时间值,
rcall _write_DS1302
.dbline 377
; }
L101:
.dbline 380
; //------------------
;
; DelaymS(1); //延迟
ldi R16,1
ldi R17,0
rcall _DelaymS
.dbline 381
; read_DS1302(); //读时间
rcall _read_DS1302
.dbline 382
; data_old = buf_read[0]; //提取旧时钟的秒数值
lds R20,_buf_read
rjmp L104
L103:
.dbline 384
; while(1) //无限循环执行,此程序保证了一秒钟更新一次串口数据,更新一次LCD显示。
; {
.dbline 385
; DelaymS(10); //延迟
ldi R16,10
ldi R17,0
rcall _DelaymS
.dbline 386
; read_DS1302(); //读时间
rcall _read_DS1302
.dbline 387
; if (data_old == buf_read[0])
lds R2,_buf_read
cp R20,R2
brne L106
.dbline 388
; {
.dbline 389
; DelaymS(10); //延迟
ldi R16,10
ldi R17,0
rcall _DelaymS
.dbline 390
; }
rjmp L107
L106:
.dbline 392
; else
; {
.dbline 393
; data_conversion(); //将读出的数据分开,分别装入显存
rcall _data_conversion
.dbline 394
; display_lcd(buf_time); //刷新显示一屏
ldi R16,<_buf_time
ldi R17,>_buf_time
rcall _display_lcd
.dbline 395
; out_data_pc232(); //串口将时间数据送PC
rcall _out_data_pc232
.dbline 396
; data_old = buf_read[0]; //更新时钟的秒数值
lds R20,_buf_read
.dbline 397
; }
L107:
.dbline 398
L104:
.dbline 383
rjmp L103
X0:
.dbline -2
L99:
adiw R28,33
.dbline 0 ; func end
ret
.dbsym l buf_logo 0 A[33:33]c
.dbsym r data_old 20 c
.dbend
.area bss(ram, con, rel)
.dbfile E:\iccavr代码\实验6_实时时钟DS1302\time-1302.c
_buf_read::
.blkb 8
.dbsym e buf_read _buf_read A[8:8]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -