ds1302.s
来自「1302+lcd时钟显示C语言程序」· S 代码 · 共 1,483 行 · 第 1/2 页
S
1,483 行
.module ds1302.c
.area text(rom, con, rel)
.dbfile D:\单片机\ds1302\ds1302_end/delay.c
.dbfunc e delay_1us _delay_1us fV
.even
_delay_1us::
.dbline -1
.dbline 6
; #include <iom16v.h> //包含型号头文件
; #include <macros.h> //包含"位"操作头文件
; #define uchar unsigned char
; #define uint unsigned int
;
; #include "1602B_LCD.C" //包含1602液晶函数文件
.dbline 7
;
nop
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay_nus _delay_nus fV
; i -> R20,R21
; n -> R22,R23
.even
_delay_nus::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 11
; /******************RTC常量******************/
; #define RTC_CLK PB7
; #define RTC_DATA PB6
; #define RTC_CS PB4
.dbline 12
; //命令
clr R20
clr R21
.dbline 13
; #define RD 0x01
xjmp L6
L3:
.dbline 14
xcall _delay_1us
L4:
.dbline 13
subi R20,255 ; offset = 1
sbci R21,255
L6:
.dbline 13
cp R20,R22
cpc R21,R23
brlo L3
.dbline -2
L2:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
.dbfunc e delay_1ms _delay_1ms fV
; i -> R16,R17
.even
_delay_1ms::
.dbline -1
.dbline 18
; #define WR 0x00
; #define C_SEC 0x80 //秒
; #define C_MIN 0x82 //分
; #define C_HR 0x84 //时
; #define C_DAY 0x86 //日
.dbline 20
clr R16
clr R17
xjmp L11
L8:
.dbline 20
L9:
.dbline 20
subi R16,255 ; offset = 1
sbci R17,255
L11:
.dbline 20
; #define C_MTH 0x88 //月
; #define C_WK 0x8A //星期 DATE
cpi R16,116
ldi R30,4
cpc R17,R30
brlo L8
.dbline -2
L7:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e delay_nms _delay_nms fV
; i -> R20,R21
; n -> R22,R23
.even
_delay_nms::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 24
; #define C_YR 0x8C //年
; #define C_WP 0x8E //控制(写保护)
; #define C_CHARGE 0x90 //涓流充电
; #define C_BURST 0xBE //时钟多字节
.dbline 25
; //配置
clr R20
clr R21
.dbline 26
; #define CLK_HALT 0x80 //停止时钟控制位 SECOND bit7
xjmp L16
L13:
.dbline 27
xcall _delay_1ms
L14:
.dbline 26
subi R20,255 ; offset = 1
sbci R21,255
L16:
.dbline 26
cp R20,R22
cpc R21,R23
brlo L13
.dbline -2
L12:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
.dbfunc e delay _delay fV
; i -> R20,R21
; n -> R22,R23
.even
_delay::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 30
; #define CLK_START 0x00 //启动时钟
; #define M12_24 0x80 //12/24小时值选择位 HOUR bit7
; #define PROTECT 0x80 //写保护控制位 CONTROL bit7
; #define UPROTECT 0x00 //写保护控制位 CONTROL bit7
.dbline 31
; //涓流充电控制常量
clr R20
clr R21
.dbline 32
; #define TC_D1R2 0xA5 //high 1 Diode +2K Resistors
xjmp L21
L18:
.dbline 33
xcall _delay_1ms
L19:
.dbline 32
subi R20,255 ; offset = 1
sbci R21,255
L21:
.dbline 32
cp R20,R22
cpc R21,R23
brlo L18
.dbline -2
L17:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
.dbfile D:\单片机\ds1302\ds1302_end/1602B_LCD.C
.dbfunc e LCD_Write_half_char _LCD_Write_half_char fV
.even
_LCD_Write_half_char::
.dbline -1
.dbline 28
.dbline 29
in R24,0x15
andi R24,15
out 0x15,R24
.dbline 30
lds R24,_data_temp
lds R25,_data_temp+1
lsl R24
rol R25
lsl R24
rol R25
lsl R24
rol R25
lsl R24
rol R25
andi R24,240
andi R25,0
in R2,0x15
clr R3
or R2,R24
or R3,R25
out 0x15,R2
.dbline 31
sbi 0x15,3
.dbline 32
ldi R16,2
ldi R17,0
xcall _delay
.dbline 33
; #define TC_D2R8 0xAB //low 2 Diodes+8K Resistors
cbi 0x15,3
.dbline 34
; #define TC_DISABLED 0x00 //Disabled(TCS<>1010 or DS=00 or RS=00)
in R24,0x15
andi R24,15
out 0x15,R24
.dbline 35
; //RAM 命令
ldi R16,2
ldi R17,0
xcall _delay
.dbline -2
L22:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCD_write_char _LCD_write_char fV
; data -> R20,R21
; command -> R22,R23
.even
_LCD_write_char::
xcall push_gset2
movw R20,R18
movw R22,R16
.dbline -1
.dbline 39
; #define C_RAMBASE 0xC0 //RAM0~RAM30<<1 地址需左移一位
;
; void Delayus(uint US)
; {
.dbline 40
; asm("nop");
cbi 0x15,3
.dbline 41
; }
cpi R22,0
cpc R22,R23
brne L24
X0:
.dbline 42
; void Delayms(uint MS)
cbi 0x15,2
xjmp L25
L24:
.dbline 44
; {
; uint i,j;
sbi 0x15,2
L25:
.dbline 46
; for( i=0;i<MS;i++)
; for(j=0;j<1180;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
sts _data_temp+1,R21
sts _data_temp,R20
.dbline 47
; }
movw R2,R20
lsr R3
ror R2
lsr R3
ror R2
lsr R3
ror R2
lsr R3
ror R2
sts _data_temp+1,R3
sts _data_temp,R2
.dbline 48
;
xcall _LCD_Write_half_char
.dbline 49
;
sts _data_temp+1,R21
sts _data_temp,R20
.dbline 50
;
xcall _LCD_Write_half_char
.dbline 51
; /*******************************************
ldi R16,1
ldi R17,0
xcall _delay
.dbline -2
L23:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r data 20 i
.dbsym r command 22 i
.dbend
.dbfunc e LCD_set_xy _LCD_set_xy fV
; address -> R20
.even
_LCD_set_xy::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 67
; 函数名称: DS1302_init
; 功 能: 初始化DS1302的数据接口
; 参 数: 无
; 返回值 : 无
; /********************************************/
; void DS1302_portinit(void)
; {
; DDRB|=BIT(RTC_CLK)|BIT(RTC_DATA)|BIT(RTC_CS);//将时钟端(RTC_CLK)数据端(RTC_DATA)片选端(RTC_CS)设置为输出
; }
; /*******************************************
; 函数名称: DS1302_writeB
; 功 能: 向DS1302写入一个字节数据(没有RST操作)
; 参 数: byte--要写入的数据
; 返回值 : 无
; /********************************************/
; void DS1302_writeB(uchar byte)
.dbline 68
; {
mov R18,R20
clr R19
clr R16
clr R17
xcall _LCD_write_char
.dbline -2
L26:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r address 20 c
.dbend
.dbfunc e LCD_write_string _LCD_write_string fV
; s -> R20,R21
; address -> R22
.even
_LCD_write_string::
xcall push_gset2
movw R20,R18
mov R22,R16
.dbline -1
.dbline 91
; uchar i;
; for(i=0;i<8;i++) //8位数据计数
; {
; PORTB&=~BIT(RTC_CLK); //拉低时钟端
; if(byte&0x01) //当前位是否是1
; {
; PORTB|=BIT(RTC_DATA); //当前位是1,拉高数据端
; }
; else
; {
; PORTB&=~BIT(RTC_DATA); //当前位是0,拉低数据端
; }
; Delayus(10); //调整时钟和脉冲宽度
; PORTB|=BIT(RTC_CLK); //时钟上升沿(DS1302采样数据)
; byte>>=1; //数据右移1位,为送出新数据位做准备
; }
; }
; /*******************************************
; 函数名称: DS1302_readB
; 功 能: 从DS1302读出一个字节数据(没有RST操作)
; 参 数: 无
; 返回值 : byte--读出的数据
; /********************************************/
.dbline 92
; uchar DS1302_readB(void)
mov R16,R22
xcall _LCD_set_xy
xjmp L29
L28:
.dbline 94
.dbline 95
movw R30,R20
ldd R18,z+0
clr R19
ldi R16,1
ldi R17,0
xcall _LCD_write_char
.dbline 96
subi R20,255 ; offset = 1
sbci R21,255
.dbline 97
L29:
.dbline 93
; {
movw R30,R20
ldd R2,z+0
tst R2
brne L28
.dbline -2
L27:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r s 20 pc
.dbsym r address 22 c
.dbend
.dbfunc e LCD_write_onechar _LCD_write_onechar fV
; data -> R20
; address -> R22
.even
_LCD_write_onechar::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 113
; uchar i,byte=0;
; DDRB&=~BIT(RTC_DATA); //将数据端口设置为输入
; PORTB&=~BIT(RTC_DATA); //无上拉电阻
; for(i=0;i<8;i++) //8位数据计数
; {
; byte>>=1; //保存读入的数据位
; PORTB|=BIT(RTC_CLK); //时钟上升沿
; Delayus(10); //延时,调整时钟脉冲宽度
; PORTB&=~BIT(RTC_CLK); //时钟下降沿,DS1302输出数据位
; Delayus(10); //等待数据变化(MEGA16太快,必须等待DS1302的数据位输出,否则不能正确读出)
; if(PINB&BIT(RTC_DATA)) //当前位是否是高电平
; {
; byte|=BIT(PB7); //是高电平就将返回数据的当前位置1
; }
; else
; {
; byte&=~BIT(PB7); //是低电平就将返回数据的当前位置0
; }
; }
; DDRB|=BIT(RTC_DATA); //最后将数据端口设置为输出
.dbline 114
; return byte; //返回读出的数据
mov R16,R22
xcall _LCD_set_xy
.dbline 115
; }
mov R18,R20
clr R19
ldi R16,1
ldi R17,0
xcall _LCD_write_char
.dbline -2
L31:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r data 20 c
.dbsym r address 22 c
.dbend
.dbfunc e LCD_init _LCD_init fV
.even
_LCD_init::
.dbline -1
.dbline 120
; /*******************************************
; 函数名称: DS1302_writeD
; 功 能: 向DS1302的某个地址写入一个字节数据
; 参 数: addr--地址值(寄存器或RAM)
; data--要写入的地址
.dbline 121
; 返回值 : 无
ldi R18,56
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 122
; /********************************************/
ldi R16,1
ldi R17,0
xcall _delay
.dbline 123
; void DS1302_writeD(uchar addr,uchar data)
ldi R18,2
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 124
; {
ldi R16,1
ldi R17,0
xcall _delay
.dbline 125
; PORTB&=~BIT(RTC_CS); //拉低片选端
ldi R18,40
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 126
; PORTB&=~BIT(RTC_CLK); //拉低时钟端
ldi R16,1
ldi R17,0
xcall _delay
.dbline 127
; Delayus(10);
ldi R18,8
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 128
; PORTB|=BIT(RTC_CS); //拉高片选端
ldi R16,1
ldi R17,0
xcall _delay
.dbline 129
; Delayus(10); //调整片选脉冲
ldi R18,1
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 130
; DS1302_writeB(addr); //写入操作命令(地址)
ldi R16,1
ldi R17,0
xcall _delay
.dbline 131
; Delayus(10);
ldi R18,6
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 132
; PORTB&=~BIT(RTC_CLK); //拉低时钟端
ldi R16,1
ldi R17,0
xcall _delay
.dbline 133
; Delayus(10);
ldi R18,12
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 134
; DS1302_writeB(data); //写入数据
ldi R16,5
ldi R17,0
xcall _delay
.dbline -2
L32:
.dbline 0 ; func end
ret
.dbend
.dbfile D:\单片机\ds1302\ds1302_end\ds1302.c
.dbfunc e Delayus _Delayus fV
; US -> R16,R17
.even
_Delayus::
.dbline -1
.dbline 39
.dbline 40
nop
.dbline -2
L33:
.dbline 0 ; func end
ret
.dbsym r US 16 i
.dbend
.dbfunc e Delayms _Delayms fV
; i -> R20,R21
; j -> R22,R23
; MS -> R16,R17
.even
_Delayms::
xcall push_gset2
.dbline -1
.dbline 43
.dbline 45
clr R20
clr R21
xjmp L38
L35:
.dbline 46
clr R22
clr R23
xjmp L42
L39:
.dbline 46
L40:
.dbline 46
subi R22,255 ; offset = 1
sbci R23,255
L42:
.dbline 46
cpi R22,156
ldi R30,4
cpc R23,R30
brlo L39
L36:
.dbline 45
subi R20,255 ; offset = 1
sbci R21,255
L38:
.dbline 45
cp R20,R16
cpc R21,R17
brlo L35
.dbline -2
L34:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r j 22 i
.dbsym r MS 16 i
.dbend
.dbfunc e DS1302_portinit _DS1302_portinit fV
.even
_DS1302_portinit::
.dbline -1
.dbline 58
.dbline 59
in R24,0x17
ori R24,208
out 0x17,R24
.dbline -2
L43:
.dbline 0 ; func end
ret
.dbend
.dbfunc e DS1302_writeB _DS1302_writeB fV
; i -> R20
; byte -> R22
.even
_DS1302_writeB::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 68
.dbline 70
clr R20
xjmp L48
L45:
.dbline 71
.dbline 72
cbi 0x18,7
.dbline 73
sbrs R22,0
rjmp L49
.dbline 74
.dbline 75
sbi 0x18,6
.dbline 76
xjmp L50
L49:
.dbline 78
.dbline 79
cbi 0x18,6
.dbline 80
L50:
.dbline 81
ldi R16,10
ldi R17,0
xcall _Delayus
.dbline 82
sbi 0x18,7
.dbline 83
lsr R22
.dbline 84
L46:
.dbline 70
inc R20
L48:
.dbline 70
cpi R20,8
brlo L45
.dbline -2
L44:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r byte 22 c
.dbend
.dbfunc e DS1302_readB _DS1302_readB fc
; i -> R20
; byte -> R22
.even
_DS1302_readB::
xcall push_gset2
.dbline -1
.dbline 93
.dbline 94
clr R22
.dbline 95
cbi 0x17,6
.dbline 96
cbi 0x18,6
.dbline 97
clr R20
xjmp L55
L52:
.dbline 98
.dbline 99
lsr R22
.dbline 100
sbi 0x18,7
.dbline 101
ldi R16,10
ldi R17,0
xcall _Delayus
.dbline 102
cbi 0x18,7
.dbline 103
ldi R16,10
ldi R17,0
xcall _Delayus
.dbline 104
sbis 0x16,6
rjmp L56
.dbline 105
.dbline 106
ori R22,128
.dbline 107
xjmp L57
L56:
.dbline 109
.dbline 110
andi R22,127
.dbline 111
L57:
.dbline 112
L53:
.dbline 97
inc R20
L55:
.dbline 97
cpi R20,8
brlo L52
.dbline 113
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?