📄 ds1302.lis
字号:
.module ds1302.c
.area text(rom, con, rel)
0000 .dbfile I:\AVR视频教程\视频教程\lesson11\ds1302\ds1302/YJ1602.C
0000 .dbfunc e LCD1602_portini _LCD1602_portini fV
.even
0000 _LCD1602_portini::
0000 .dbline -1
0000 .dbline 50
0000 ; #include <iom16v.h> //包含型号头文件
0000 ; #include <macros.h> //包含"位"操作头文件
0000 ; #define uchar unsigned char
0000 ; #define uint unsigned int
0000 ;
0000 ; #define TRUE 1
0000 ; #define FALSE 0
0000 ; #include "YJ1602.C" //包含1602液晶函数文件
0000 ;
0000 ; /******************RTC常量******************/
0000 ; #define RTC_CLK PB7
0000 ; #define RTC_DATA PB5
0000 ; #define RTC_CS PC7
0000 ; //命令
0000 ; #define RD 0x01
0000 ; #define WR 0x00
0000 ; #define C_SEC 0x80 //秒
0000 ; #define C_MIN 0x82 //分
0000 ; #define C_HR 0x84 //时
0000 ; #define C_DAY 0x86 //日
0000 ; #define C_MTH 0x88 //月
0000 ; #define C_WK 0x8A //星期 DATE
0000 ; #define C_YR 0x8C //年
0000 ; #define C_WP 0x8E //控制(写保护)
0000 ; #define C_CHARGE 0x90 //涓流充电
0000 ; #define C_BURST 0xBE //时钟多字节
0000 ; //配置
0000 ; #define CLK_HALT 0x80 //停止时钟控制位 SECOND bit7
0000 ; #define CLK_START 0x00 //启动时钟
0000 ; #define M12_24 0x80 //12/24小时值选择位 HOUR bit7
0000 ; #define PROTECT 0x80 //写保护控制位 CONTROL bit7
0000 ; #define UPROTECT 0x00 //写保护控制位 CONTROL bit7
0000 ; //涓流充电控制常量
0000 ; #define TC_D1R2 0xA5 //high 1 Diode +2K Resistors
0000 ; #define TC_D2R8 0xAB //low 2 Diodes+8K Resistors
0000 ; #define TC_DISABLED 0x00 //Disabled(TCS<>1010 or DS=00 or RS=00)
0000 ; //RAM 命令
0000 ; #define C_RAMBASE 0xC0 //RAM0~RAM30<<1 地址需左移一位
0000 ;
0000 ; void Delayus(uint US)
0000 ; {
0000 ; uint i;
0000 ; US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
0000 ; for( i=0;i<US;i++);
0000 ; }
0000 ; void Delayms(uint MS)
0000 ; {
0000 ; uint i,j;
0000 ; for( i=0;i<MS;i++)
0000 ; for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
0000 .dbline 51
0000 ; }
0000 81B3 in R24,0x11
0002 8067 ori R24,112
0004 81BB out 0x11,R24
0006 .dbline 52
0006 ;
0006 87B3 in R24,0x17
0008 8F6F ori R24,255
000A 87BB out 0x17,R24
000C .dbline -2
000C .dbline 53
000C ;
000C L1:
000C .dbline 0 ; func end
000C 0895 ret
000E .dbend
000E .dbfunc e LCD1602_readbyte _LCD1602_readbyte fc
000E ; dByte -> R20
000E ; DatCmd -> R20
.even
000E _LCD1602_readbyte::
000E 0E940000 xcall push_gset1
0012 402F mov R20,R16
0014 .dbline -1
0014 .dbline 61
0014 ;
0014 ; /*******************************************
0014 ; 函数名称: DS1302_init
0014 ; 功 能: 初始化DS1302的数据接口
0014 ; 参 数: 无
0014 ; 返回值 : 无
0014 ; /********************************************/
0014 ; void DS1302_portinit(void)
0014 .dbline 63
0014 ; {
0014 ; DDRB|=BIT(RTC_CLK)|BIT(RTC_DATA)|BIT(RTC_CS);//将时钟端(RTC_CLK)数据端(RTC_DATA)片选端(RTC_CS)设置为输出
0014 4423 tst R20
0016 11F4 brne L3
0018 .dbline 64
0018 ; }
0018 9498 cbi 0x12,4
001A 01C0 xjmp L4
001C L3:
001C .dbline 66
001C ; /*******************************************
001C ; 函数名称: DS1302_writeB
001C 949A sbi 0x12,4
001E L4:
001E .dbline 68
001E ; 功 能: 向DS1302写入一个字节数据(没有RST操作)
001E ; 参 数: byte--要写入的数据
001E 959A sbi 0x12,5
0020 .dbline 69
0020 ; 返回值 : 无
0020 969A sbi 0x12,6
0022 .dbline 70
0022 ; /********************************************/
0022 2224 clr R2
0024 27BA out 0x17,R2
0026 .dbline 71
0026 ; void DS1302_writeB(uchar byte)
0026 46B3 in R20,0x16
0028 .dbline 72
0028 ; {
0028 01E0 ldi R16,1
002A 10E0 ldi R17,0
002C 84D0 xcall _Delayms
002E .dbline 73
002E ; uchar i;
002E 9698 cbi 0x12,6
0030 .dbline 74
0030 ; for(i=0;i<8;i++) //8位数据计数
0030 87B3 in R24,0x17
0032 8F6F ori R24,255
0034 87BB out 0x17,R24
0036 .dbline 75
0036 ; {
0036 042F mov R16,R20
0038 .dbline -2
0038 L2:
0038 0E940000 xcall pop_gset1
003C .dbline 0 ; func end
003C 0895 ret
003E .dbsym r dByte 20 c
003E .dbsym r DatCmd 20 c
003E .dbend
003E .dbfunc e LCD1602_sendbyte _LCD1602_sendbyte fV
003E ; dByte -> R20
003E ; DatCmd -> R22
.even
003E _LCD1602_sendbyte::
003E 0E940000 xcall push_gset2
0042 422F mov R20,R18
0044 602F mov R22,R16
0046 .dbline -1
0046 .dbline 85
0046 ; PORTB&=~BIT(RTC_CLK); //拉低时钟端
0046 ; if(byte&0x01) //当前位是否是1
0046 ; {
0046 ; PORTB|=BIT(RTC_DATA); //当前位是1,拉高数据端
0046 ; }
0046 ; else
0046 ; {
0046 ; PORTB&=~BIT(RTC_DATA); //当前位是0,拉低数据端
0046 ; }
0046 ; Delayus(10); //调整时钟和脉冲宽度
0046 .dbline 86
0046 ; PORTB|=BIT(RTC_CLK); //时钟上升沿(DS1302采样数据)
0046 6623 tst R22
0048 11F4 brne L6
004A .dbline 87
004A ; byte>>=1; //数据右移1位,为送出新数据位做准备
004A 9498 cbi 0x12,4
004C 01C0 xjmp L7
004E L6:
004E .dbline 89
004E ; }
004E ; }
004E 949A sbi 0x12,4
0050 L7:
0050 .dbline 91
0050 ; /*******************************************
0050 ; 函数名称: DS1302_readB
0050 9598 cbi 0x12,5
0052 .dbline 92
0052 ; 功 能: 从DS1302读出一个字节数据(没有RST操作)
0052 969A sbi 0x12,6
0054 .dbline 93
0054 ; 参 数: 无
0054 48BB out 0x18,R20
0056 .dbline 94
0056 ; 返回值 : byte--读出的数据
0056 01E0 ldi R16,1
0058 10E0 ldi R17,0
005A 6DD0 xcall _Delayms
005C .dbline 95
005C ; /********************************************/
005C 9698 cbi 0x12,6
005E .dbline -2
005E .dbline 96
005E ; uchar DS1302_readB(void)
005E L5:
005E 0E940000 xcall pop_gset2
0062 .dbline 0 ; func end
0062 0895 ret
0064 .dbsym r dByte 20 c
0064 .dbsym r DatCmd 22 c
0064 .dbend
0064 .dbfunc e LCD1602_sendstr _LCD1602_sendstr fV
0064 ; ptString -> R20,R21
.even
0064 _LCD1602_sendstr::
0064 0E940000 xcall push_gset1
0068 A801 movw R20,R16
006A .dbline -1
006A .dbline 104
006A ; {
006A ; uchar i,byte=0;
006A ; DDRB&=~BIT(RTC_DATA); //将数据端口设置为输入
006A ; PORTB&=~BIT(RTC_DATA); //无上拉电阻
006A ; for(i=0;i<8;i++) //8位数据计数
006A ; {
006A ; byte>>=1; //保存读入的数据位
006A ; PORTB|=BIT(RTC_CLK); //时钟上升沿
006A 05C0 xjmp L10
006C L9:
006C .dbline 106
006C .dbline 107
006C FA01 movw R30,R20
006E 2191 ld R18,Z+
0070 AF01 movw R20,R30
0072 01E0 ldi R16,1
0074 E4DF xcall _LCD1602_sendbyte
0076 .dbline 108
0076 L10:
0076 .dbline 105
0076 ; Delayus(10); //延时,调整时钟脉冲宽度
0076 FA01 movw R30,R20
0078 2080 ldd R2,z+0
007A 2220 tst R2
007C B9F7 brne L9
007E .dbline -2
007E .dbline 109
007E ; PORTB&=~BIT(RTC_CLK); //时钟下降沿,DS1302输出数据位
007E ; Delayus(10); //等待数据变化(MEGA16太快,必须等待DS1302的数据位输出,否则不能正确读出)
007E ; if(PINB&BIT(RTC_DATA)) //当前位是否是高电平
007E ; {
007E L8:
007E 0E940000 xcall pop_gset1
0082 .dbline 0 ; func end
0082 0895 ret
0084 .dbsym r ptString 20 pc
0084 .dbend
0084 .dbfunc e LCD1602_clear _LCD1602_clear fV
.even
0084 _LCD1602_clear::
0084 .dbline -1
0084 .dbline 117
0084 ; byte|=BIT(PB7); //是高电平就将返回数据的当前位置1
0084 ; }
0084 ; else
0084 ; {
0084 ; byte&=~BIT(PB7); //是低电平就将返回数据的当前位置0
0084 ; }
0084 ; }
0084 ; DDRB|=BIT(RTC_DATA); //最后将数据端口设置为输出
0084 .dbline 118
0084 ; return byte; //返回读出的数据
0084 21E0 ldi R18,1
0086 0027 clr R16
0088 DADF xcall _LCD1602_sendbyte
008A .dbline 119
008A ; }
008A 02E0 ldi R16,2
008C 10E0 ldi R17,0
008E .dbline -2
008E .dbline 120
008E ; /*******************************************
008E L12:
008E .dbline 0 ; func end
008E 53C0 xjmp _Delayms
0090 .dbend
0090 .dbfunc e LCD1602_readBF _LCD1602_readBF fc
0090 ; busy -> R20
.even
0090 _LCD1602_readBF::
0090 0E940000 xcall push_gset1
0094 .dbline -1
0094 .dbline 128
0094 ; 函数名称: DS1302_writeD
0094 ; 功 能: 向DS1302的某个地址写入一个字节数据
0094 ; 参 数: addr--地址值(寄存器或RAM)
0094 ; data--要写入的地址
0094 ; 返回值 : 无
0094 ; /********************************************/
0094 ; void DS1302_writeD(uchar addr,uchar data)
0094 ; {
0094 .dbline 130
0094 ; PORTC&=~BIT(RTC_CS); //拉低片选端
0094 ; PORTB&=~BIT(RTC_CLK); //拉低时钟端
0094 0027 clr R16
0096 BBDF xcall _LCD1602_readbyte
0098 402F mov R20,R16
009A .dbline 131
009A ; Delayus(10);
009A 07FF sbrs R16,7
009C 02C0 rjmp L14
009E .dbline 132
009E ; PORTC|=BIT(RTC_CS); //拉高片选端
009E 41E0 ldi R20,1
00A0 01C0 xjmp L15
00A2 L14:
00A2 .dbline 134
00A2 ; Delayus(10); //调整片选脉冲
00A2 ; DS1302_writeB(addr); //写入操作命令(地址)
00A2 4427 clr R20
00A4 L15:
00A4 .dbline 135
00A4 ; Delayus(10);
00A4 042F mov R16,R20
00A6 .dbline -2
00A6 L13:
00A6 0E940000 xcall pop_gset1
00AA .dbline 0 ; func end
00AA 0895 ret
00AC .dbsym r busy 20 c
00AC .dbend
00AC .dbfunc e LCD1602_gotoXY _LCD1602_gotoXY fV
00AC ; Col -> R20
00AC ; Row -> R22
.even
00AC _LCD1602_gotoXY::
00AC 0E940000 xcall push_gset2
00B0 422F mov R20,R18
00B2 602F mov R22,R16
00B4 .dbline -1
00B4 .dbline 145
00B4 ; PORTB&=~BIT(RTC_CLK); //拉低时钟端
00B4 ; Delayus(10);
00B4 ; DS1302_writeB(data); //写入数据
00B4 ; PORTB&=~BIT(RTC_CLK); //拉低时钟端
00B4 ; Delayus(10); //调整片选脉冲
00B4 ; PORTC&=~BIT(RTC_CS); //拉低片选端
00B4 ; }
00B4 ; /*******************************************
00B4 ; 函数名称: DS1302_readD
00B4 ; 功 能: 从DS1302的某个地址读出一个字节数据
00B4 .dbline 146
00B4 ; 参 数: addr--地址值(寄存器或RAM)
00B4 7727 clr R23
00B6 6230 cpi R22,2
00B8 E0E0 ldi R30,0
00BA 7E07 cpc R23,R30
00BC 09F0 breq L20
00BE 05C0 xjmp L17
00C0 X0:
00C0 .dbline 147
00C0 ; 返回值 : data--读出的数据
00C0 L20:
00C0 .dbline 149
00C0 ; /********************************************/
00C0 ; uchar DS1302_readD(uchar addr)
00C0 242F mov R18,R20
00C2 2054 subi R18,64 ; addi 192
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -