📄 ds1302_main.s
字号:
.module ds1302_main.c
.area text(rom, con, rel)
.dbfile E:\16实验程序\ds1302\ds1302_main.c
.dbfile E:\16实验程序\ds1302\ds1302.h
.dbfunc e ds1302_write_byte _ds1302_write_byte fV
; i -> R20
; d -> R18
; addr -> R16
.even
_ds1302_write_byte::
st -y,R20
.dbline -1
.dbline 37
; //时钟电路DS1302试验程序
; //使用1602液晶显示
;
; #include "iom16v.h"
; #include "ds1302.h"
; #include "1602.h"
;
; uchar aa[]={'-'};
; //时钟数据
; unsigned char time_data[8] = {0x21,0x11,0x11,0x12,0x18,0x52,0x00,0x02};
;
; //在16M延时1ms的延时函数
; void s_1ms(unsigned int ms)
; {
; unsigned int aa;
; for(;ms>=1;ms--)
; {
; for(aa=0;aa<=2000;aa++)
; {;}
; }
; }
;
; //主函数
; void main()
; {
; unsigned char temp;
; //端口初始化
; PORTA = 0xFF;
; DDRA = 0xFF;
; PORTB = 0xF0;
; DDRB = 0xFF;
; PORTC = 0x7F;
; DDRC = 0x80;
; PORTD = 0x00;
; DDRD = 0xFF;
;
; s_1ms(20);
.dbline 40
; //1602液晶初始化
; LcdInit();
; //时钟芯片DS1302初始化
sbi 0x15,6
.dbline 43
; ds1302_init();
; s_1ms(10);
; //写入初始的时间
sbi 0x14,1
.dbline 44
; ds1302_write_time(time_data);
andi R16,254
.dbline 45
;
clr R20
xjmp L5
L2:
.dbline 45
.dbline 46
; while (1) {
sbrs R16,0
rjmp L6
X0:
.dbline 46
.dbline 47
; s_1ms(100);
sbi 0x15,1
.dbline 48
; //读出时钟数据
xjmp L7
L6:
.dbline 49
; ds1302_read_time(time_data);
.dbline 50
; //显示年份
cbi 0x15,1
.dbline 51
; WriteNum(1,3,2); //2
L7:
.dbline 52
; WriteNum(1,4,0); //0
sbi 0x15,0
.dbline 53
; temp = (time_data[1] >> 4) ;
cbi 0x15,0
.dbline 54
; WriteNum(1,5,temp);
lsr R16
.dbline 55
; temp = (time_data[1] & 0x0F);
L3:
.dbline 45
inc R20
L5:
.dbline 45
cpi R20,8
brlo L2
X1:
.dbline 58
; WriteNum(1,6,temp);
; WriteChar(1,7,2,aa);
;
sbi 0x14,1
.dbline 59
; temp = (time_data[2] >> 4);
clr R20
xjmp L11
L8:
.dbline 59
.dbline 60
; WriteNum(1,8,temp);
sbrs R18,0
rjmp L12
X2:
.dbline 60
.dbline 61
; temp = (time_data[2] & 0x0F);
sbi 0x15,1
.dbline 62
; WriteNum(1,9,temp);
xjmp L13
L12:
.dbline 63
; WriteChar(1,10,2,aa);
.dbline 64
;
cbi 0x15,1
.dbline 65
; temp = (time_data[3] >> 4);
L13:
.dbline 66
; WriteNum(1,11,temp);
sbi 0x15,0
.dbline 67
; temp = (time_data[3] & 0x0F);
cbi 0x15,0
.dbline 68
; WriteNum(1,12,temp);
lsr R18
.dbline 69
;
L9:
.dbline 59
inc R20
L11:
.dbline 59
cpi R20,8
brlo L8
X3:
.dbline 70
; temp = (time_data[4] >> 4);
cbi 0x15,6
.dbline -2
L1:
.dbline 0 ; func end
ld R20,y+
ret
.dbsym r i 20 c
.dbsym r d 18 c
.dbsym r addr 16 c
.dbend
.dbfunc e ds1302_read_byte _ds1302_read_byte fc
; temp -> R20
; i -> R22
; addr -> R16
.even
_ds1302_read_byte::
st -y,R20
st -y,R22
.dbline -1
.dbline 74
; WriteNum(2,4,temp);
; temp = (time_data[4] & 0x0F);
; WriteNum(2,5,temp);
; WriteChar(2,6,2,aa);
.dbline 78
;
; temp = (time_data[5] >> 4);
; WriteNum(2,7,temp);
; temp = (time_data[5] & 0x0F);
sbi 0x15,6
.dbline 81
; WriteNum(2,8,temp);
; WriteChar(2,9,2,aa);
;
sbi 0x14,1
.dbline 82
; temp = (time_data[6] >> 4);
ori R16,1
.dbline 83
; WriteNum(2,10,temp);
clr R22
xjmp L18
L15:
.dbline 83
.dbline 84
; temp = (time_data[6] & 0x0F);
sbrs R16,0
rjmp L19
X4:
.dbline 84
.dbline 85
; WriteNum(2,11,temp);
sbi 0x15,1
.dbline 86
; }
xjmp L20
L19:
.dbline 87
; }
.dbline 88
cbi 0x15,1
.dbline 89
L20:
.dbline 90
sbi 0x15,0
.dbline 91
cbi 0x15,0
.dbline 92
lsr R16
.dbline 93
L16:
.dbline 83
inc R22
L18:
.dbline 83
cpi R22,8
brlo L15
X5:
.dbline 96
cbi 0x14,1
.dbline 97
clr R22
xjmp L24
L21:
.dbline 97
.dbline 98
lsr R20
.dbline 99
sbis 0x13,1
rjmp L25
X6:
.dbline 99
.dbline 100
ori R20,128
.dbline 101
xjmp L26
L25:
.dbline 102
.dbline 103
andi R20,127
.dbline 104
L26:
.dbline 105
sbi 0x15,0
.dbline 106
cbi 0x15,0
.dbline 107
L22:
.dbline 97
inc R22
L24:
.dbline 97
cpi R22,8
brlo L21
X7:
.dbline 109
cbi 0x15,6
.dbline 110
mov R16,R20
.dbline -2
L14:
.dbline 0 ; func end
ld R22,y+
ld R20,y+
ret
.dbsym r temp 20 c
.dbsym r i 22 c
.dbsym r addr 16 c
.dbend
.dbfunc e ds1302_write_time _ds1302_write_time fV
; time_data -> R20,R21
.even
_ds1302_write_time::
st -y,R20
st -y,R21
movw R20,R16
.dbline -1
.dbline 115
.dbline 117
clr R18
ldi R16,142
xcall _ds1302_write_byte
.dbline 118
ldi R18,128
ldi R16,128
xcall _ds1302_write_byte
.dbline 119
subi R20,255 ; offset = 1
sbci R21,255
.dbline 120
movw R30,R20
ld R18,Z+
movw R20,R30
ldi R16,140
xcall _ds1302_write_byte
.dbline 121
movw R30,R20
ld R18,Z+
movw R20,R30
ldi R16,136
xcall _ds1302_write_byte
.dbline 122
movw R30,R20
ld R18,Z+
movw R20,R30
ldi R16,134
xcall _ds1302_write_byte
.dbline 123
movw R30,R20
ld R18,Z+
movw R20,R30
ldi R16,132
xcall _ds1302_write_byte
.dbline 124
movw R30,R20
ld R18,Z+
movw R20,R30
ldi R16,130
xcall _ds1302_write_byte
.dbline 125
movw R30,R20
ld R18,Z+
movw R20,R30
ldi R16,128
xcall _ds1302_write_byte
.dbline 126
movw R30,R20
ldd R18,z+0
ldi R16,138
xcall _ds1302_write_byte
.dbline 127
ldi R18,128
ldi R16,142
xcall _ds1302_write_byte
.dbline -2
L27:
.dbline 0 ; func end
ld R21,y+
ld R20,y+
ret
.dbsym r time_data 20 pc
.dbend
.dbfunc e ds1302_read_time _ds1302_read_time fV
; time_data -> R20,R21
.even
_ds1302_read_time::
xcall push_xgsetF00C
movw R20,R16
.dbline -1
.dbline 131
.dbline 132
subi R20,255 ; offset = 1
sbci R21,255
.dbline 133
ldi R16,140
xcall _ds1302_read_byte
movw R30,R20
std z+0,R16
.dbline 134
subi R20,255 ; offset = 1
sbci R21,255
.dbline 135
ldi R16,136
xcall _ds1302_read_byte
movw R30,R20
std z+0,R16
.dbline 136
subi R20,255 ; offset = 1
sbci R21,255
.dbline 137
ldi R16,134
xcall _ds1302_read_byte
mov R10,R16
movw R30,R20
std z+0,R10
.dbline 138
subi R20,255 ; offset = 1
sbci R21,255
.dbline 139
ldi R16,132
xcall _ds1302_read_byte
mov R10,R16
movw R30,R20
std z+0,R10
.dbline 140
subi R20,255 ; offset = 1
sbci R21,255
.dbline 141
ldi R16,130
xcall _ds1302_read_byte
mov R10,R16
movw R30,R20
std z+0,R10
.dbline 142
subi R20,255 ; offset = 1
sbci R21,255
.dbline 143
ldi R16,128
xcall _ds1302_read_byte
mov R22,R16
mov R24,R22
andi R24,127
movw R30,R20
std z+0,R24
.dbline 144
subi R20,255 ; offset = 1
sbci R21,255
.dbline 145
ldi R16,138
xcall _ds1302_read_byte
mov R10,R16
movw R30,R20
std z+0,R10
.dbline -2
L28:
.dbline 0 ; func end
xjmp pop_xgsetF00C
.dbsym r time_data 20 pc
.dbend
.dbfunc e ds1302_init _ds1302_init fV
.even
_ds1302_init::
.dbline -1
.dbline 149
.dbline 151
cbi 0x15,6
.dbline 152
cbi 0x15,0
.dbline 153
sbi 0x14,6
.dbline 154
sbi 0x14,0
.dbline -2
L29:
.dbline 0 ; func end
ret
.dbend
.dbfile E:\16实验程序\ds1302\1602.h
.dbfunc e s_ms _s_ms fV
; ms -> R16,R17
.even
_s_ms::
.dbline -1
.dbline 9
; #define uchar unsigned char
; #define uint unsigned int
;
; #define RS 5
; #define RW 6
; #define EN 7
;
; void s_ms(uint ms)
; {
.dbline 10
; for(;ms>1;ms--);
xjmp L34
L31:
.dbline 10
L32:
.dbline 10
subi R16,1
sbci R17,0
L34:
.dbline 10
ldi R24,1
ldi R25,0
cp R24,R16
cpc R25,R17
brlo L31
X8:
.dbline -2
L30:
.dbline 0 ; func end
ret
.dbsym r ms 16 i
.dbend
.dbfunc e busy _busy fV
; temp -> R20
.even
_busy::
st -y,R20
.dbline -1
.dbline 15
; }
;
; //查忙
; void busy(void)
; {
.dbline 17
; uchar temp;
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 18
; PORTA&=~(1<<RS); //RS=0
cbi 0x1b,5
.dbline 19
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 20
; PORTA|=(1<<RW); //RW=1
sbi 0x1b,6
.dbline 21
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
xjmp L37
L36:
.dbline 23
; while(temp)
; {
.dbline 24
; PORTA|=(1<<EN); //EN=1
sbi 0x1b,7
.dbline 25
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 26
; DDRD=0x00; //A口变输入
clr R2
out 0x11,R2
.dbline 27
; PORTD=0xff; //上拉使能
ldi R24,255
out 0x12,R24
.dbline 28
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 29
; temp = PIND&0x80; //读取A口
in R20,0x10
andi R20,128
.dbline 30
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 31
; DDRD=0xff;
ldi R24,255
out 0x11,R24
.dbline 32
; PORTD=0xff; //A口变输出
out 0x12,R24
.dbline 33
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 34
; PORTA&=~(1<<EN); //EN=0
cbi 0x1b,7
.dbline 35
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 36
; }
L37:
.dbline 22
tst R20
brne L36
X9:
.dbline -2
L35:
.dbline 0 ; func end
ld R20,y+
ret
.dbsym r temp 20 c
.dbend
.dbfunc e writecom _writecom fV
; com -> R10
.even
_writecom::
st -y,R10
mov R10,R16
.dbline -1
.dbline 41
; }
;
; //写指令
; void writecom(uchar com)
; {
.dbline 42
; busy();
xcall _busy
.dbline 43
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 44
; PORTA&=~(1<<RS); //RS=0
cbi 0x1b,5
.dbline 45
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 46
; PORTA&=~(1<<RW); //RW=0
cbi 0x1b,6
.dbline 47
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 48
; PORTA|=(1<<EN); //EN=1
sbi 0x1b,7
.dbline 49
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 50
; PORTD = com; //输出指令
out 0x12,R10
.dbline 51
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 52
; PORTA&=~(1<<EN); //EN=0
cbi 0x1b,7
.dbline 53
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline -2
L39:
.dbline 0 ; func end
ld R10,y+
ret
.dbsym r com 10 c
.dbend
.dbfunc e LcdInit _LcdInit fV
.even
_LcdInit::
.dbline -1
.dbline 58
; }
;
; //1602初始化
; void LcdInit(void)
; {
.dbline 59
; DDRD = 0xff;
ldi R24,255
out 0x11,R24
.dbline 60
; PORTD = 0x00;
clr R2
out 0x12,R2
.dbline 61
; writecom(0x38);
ldi R16,56
xcall _writecom
.dbline 62
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 63
; writecom(0x01);
ldi R16,1
xcall _writecom
.dbline 64
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 65
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 66
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 67
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 68
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 69
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 70
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 71
; writecom(0x02);
ldi R16,2
xcall _writecom
.dbline 72
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 73
; writecom(0x06);
ldi R16,6
xcall _writecom
.dbline 74
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 75
; writecom(0x0c);
ldi R16,12
xcall _writecom
.dbline 76
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 77
; writecom(0x38);
ldi R16,56
xcall _writecom
.dbline 78
; s_ms(1000);
ldi R16,1000
ldi R17,3
.dbline -2
L40:
.dbline 0 ; func end
xjmp _s_ms
.dbend
.dbfunc e writedata _writedata fV
; data -> R10
.even
_writedata::
st -y,R10
mov R10,R16
.dbline -1
.dbline 83
; }
;
; //写数据
; void writedata(uchar data)
; {
.dbline 84
; busy();
xcall _busy
.dbline 85
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 86
; PORTA|=(1<<RS); //RS=1
sbi 0x1b,5
.dbline 87
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 88
; PORTA&=~(1<<RW); //RW=0
cbi 0x1b,6
.dbline 89
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 90
; PORTA|=(1<<EN); //EN=1
sbi 0x1b,7
.dbline 91
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 92
; PORTD = data; //输出数据
out 0x12,R10
.dbline 93
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 94
; PORTA&=~(1<<EN); //EN=0
cbi 0x1b,7
.dbline 95
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline -2
L41:
.dbline 0 ; func end
ld R10,y+
ret
.dbsym r data 10 c
.dbend
.dbfunc e readdata _readdata fc
; temp -> R10
.even
_readdata::
st -y,R10
.dbline -1
.dbline 101
; }
;
;
; //读数据
; uchar readdata(void)
; {
.dbline 103
; uchar temp;
; busy();
xcall _busy
.dbline 104
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 105
; PORTA|=(1<<RS); //RS=1
sbi 0x1b,5
.dbline 106
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 107
; PORTA|=(1<<RW); //RW=1
sbi 0x1b,6
.dbline 108
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 109
; PORTA|=(1<<EN); //EN=1
sbi 0x1b,7
.dbline 110
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 111
; DDRD=0x00; //A端口变输入
clr R2
out 0x11,R2
.dbline 112
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 113
; temp = PIND; //读A端口
in R10,0x10
.dbline 114
; s_ms(500);
ldi R16,500
ldi R17,1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -