?? ds1302.s
字號:
.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液晶函數(shù)文件
.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 //時鐘多字節(jié)
.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晶振下,通過軟件仿真反復實驗得到的數(shù)值
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
; 函數(shù)名稱: DS1302_init
; 功 能: 初始化DS1302的數(shù)據(jù)接口
; 參 數(shù): 無
; 返回值 : 無
; /********************************************/
; void DS1302_portinit(void)
; {
; DDRB|=BIT(RTC_CLK)|BIT(RTC_DATA)|BIT(RTC_CS);//將時鐘端(RTC_CLK)數(shù)據(jù)端(RTC_DATA)片選端(RTC_CS)設(shè)置為輸出
; }
; /*******************************************
; 函數(shù)名稱: DS1302_writeB
; 功 能: 向DS1302寫入一個字節(jié)數(shù)據(jù)(沒有RST操作)
; 參 數(shù): byte--要寫入的數(shù)據(jù)
; 返回值 : 無
; /********************************************/
; 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位數(shù)據(jù)計數(shù)
; {
; PORTB&=~BIT(RTC_CLK); //拉低時鐘端
; if(byte&0x01) //當前位是否是1
; {
; PORTB|=BIT(RTC_DATA); //當前位是1,拉高數(shù)據(jù)端
; }
; else
; {
; PORTB&=~BIT(RTC_DATA); //當前位是0,拉低數(shù)據(jù)端
; }
; Delayus(10); //調(diào)整時鐘和脈沖寬度
; PORTB|=BIT(RTC_CLK); //時鐘上升沿(DS1302采樣數(shù)據(jù))
; byte>>=1; //數(shù)據(jù)右移1位,為送出新數(shù)據(jù)位做準備
; }
; }
; /*******************************************
; 函數(shù)名稱: DS1302_readB
; 功 能: 從DS1302讀出一個字節(jié)數(shù)據(jù)(沒有RST操作)
; 參 數(shù): 無
; 返回值 : byte--讀出的數(shù)據(jù)
; /********************************************/
.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); //將數(shù)據(jù)端口設(shè)置為輸入
; PORTB&=~BIT(RTC_DATA); //無上拉電阻
; for(i=0;i<8;i++) //8位數(shù)據(jù)計數(shù)
; {
; byte>>=1; //保存讀入的數(shù)據(jù)位
; PORTB|=BIT(RTC_CLK); //時鐘上升沿
; Delayus(10); //延時,調(diào)整時鐘脈沖寬度
; PORTB&=~BIT(RTC_CLK); //時鐘下降沿,DS1302輸出數(shù)據(jù)位
; Delayus(10); //等待數(shù)據(jù)變化(MEGA16太快,必須等待DS1302的數(shù)據(jù)位輸出,否則不能正確讀出)
; if(PINB&BIT(RTC_DATA)) //當前位是否是高電平
; {
; byte|=BIT(PB7); //是高電平就將返回數(shù)據(jù)的當前位置1
; }
; else
; {
; byte&=~BIT(PB7); //是低電平就將返回數(shù)據(jù)的當前位置0
; }
; }
; DDRB|=BIT(RTC_DATA); //最后將數(shù)據(jù)端口設(shè)置為輸出
.dbline 114
; return byte; //返回讀出的數(shù)據(jù)
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
; /*******************************************
; 函數(shù)名稱: DS1302_writeD
; 功 能: 向DS1302的某個地址寫入一個字節(jié)數(shù)據(jù)
; 參 數(shù): 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); //調(diào)整片選脈沖
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); //寫入數(shù)據(jù)
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 + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -