龚DS1302i.docx
- 文档编号:26576913
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:18
- 大小:17.18KB
龚DS1302i.docx
《龚DS1302i.docx》由会员分享,可在线阅读,更多相关《龚DS1302i.docx(18页珍藏版)》请在冰豆网上搜索。
龚DS1302i
;=====液晶屏通信引脚定义=====
RSBITP2.5
RWBITP2.6
EBITP2.7
DB0_DB7EQUP0
;=====DS1302通信引脚定义=====
RSTBITP1.5
SCLKBITP1.7
IOBITP1.6
;=====数据设定引脚定义========
MODEBITP3.1
JIABITP3.2
JIANBITP3.3
;=====定义数据存储地址========
DS1302_ADDRDATA30H;地址寄存器
DS1302_DATADATA31H;数据寄存器
TIME_YEARDATA32H;年寄存器
TIME_MONTDATA33H;月寄存器
TIME_DAYDATA34H;天寄存器
WEEK_DATADATA35H;星期寄存器
HOURDATA36H;小时寄存器
MINTUEDATA37H;分钟寄存器
SECONDDATA38H;秒钟寄存器
;=========显示数据缓冲地址============
YEAR_HBUFDATA40H
YEAR_LBUFDATA41H
MONT_HBUFDATA42H
MONT_LBUFDATA43H
DAY_HBUFDATA44H
DAY_LBUFDATA45H
WEEK_HBUFDATA46H
WEEK_LBUFDATA47H
HOUR_HBUFDATA48H
HOUR_LBUFDATA49H
MINTUE_HBUFDATA4AH
MINTUE_LBUFDATA4BH
SECOND_HBUFDATA4CH
SECOND_LBUFDATA4DH
;============程序开始==============
ORG00H
AJMPSTART
;==================================
ORG0050H
START:
MOVSP,#70H
LCALLINITIALZE;调用初始化液晶屏幕
LCALLINIT_P;调用初始画面
MOVA,#00000001B;清液晶屏,写成空白
LCALLWRITE_COM
;============主程序================
MAIN:
LCALLRD_DS1302
LCALLDATA_BUF
LCALLDISPLAY
AJMPMAIN
;==========读1302子程序=================
RD_DS1302:
MOVDS1302_ADDR,#8DH;读DS1302中的年
LCALLREAD;调用读DS1302子程序
MOVTIME_YEAR,DS1302_DATA;把读出的年数据存入年寄存器中
MOVDS1302_ADDR,#8BH;读DS1302中的星期
LCALLREAD
MOVWEEK_DATA,DS1302_DATA;把读出的星期数据存入星期寄存器中
MOVDS1302_ADDR,#89H;读DS1302中的月
LCALLREAD
MOVTIME_MONT,DS1302_DATA;把读出的月数据存入月寄存器中
MOVDS1302_ADDR,#87H;读DS1302中的天
LCALLREAD
MOVTIME_DAY,DS1302_DATA;把读出的天数据存入天寄存器中
MOVDS1302_ADDR,#85H;读DS1302中的小时
LCALLREAD
MOVHOUR,DS1302_DATA;把读出的天数据存入小时寄存器中
MOVDS1302_ADDR,#83H;读DS1302中的分钟
LCALLREAD
MOVMINTUE,DS1302_DATA;把读出的天数据存入分钟寄存器中
MOVDS1302_ADDR,#81H;读DS1302中的秒钟
LCALLREAD
MOVSECOND,DS1302_DATA;把读出的天数据存入秒钟寄存器中
RET
;===========按键子程序=================
;=========数据分离后送显示缓存==================
DATA_BUF:
MOVR0,TIME_YEAR;年数据分离,送显示缓存
LCALLDIVIDE;调用数据分离子程序
MOVYEAR_HBUF,R1
MOVYEAR_LBUF,R2
MOVR0,TIME_MONT;月数据分离,送显示缓存
LCALLDIVIDE
MOVMONT_HBUF,R1
MOVMONT_LBUF,R2
MOVR0,TIME_DAY;日数据分离,送显示缓存
LCALLDIVIDE
MOVDAY_HBUF,R1
MOVDAY_LBUF,R2
MOVR0,WEEK_DATA;星期数据分离,送显示缓存
LCALLDIVIDE
MOVWEEK_HBUF,R1
MOVWEEK_LBUF,R2
MOVR0,HOUR;小时数据分离,送显示缓存
LCALLDIVIDE
MOVHOUR_HBUF,R1
MOVHOUR_LBUF,R2
MOVR0,MINTUE;分钟数据分离,送显示缓存
LCALLDIVIDE
MOVMINTUE_HBUF,R1
MOVMINTUE_LBUF,R2
MOVR0,SECOND;秒钟数据分离,送显示缓存
LCALLDIVIDE
MOVSECOND_HBUF,R1
MOVSECOND_LBUF,R2
RET
;=========日历显示子程序==========
;===============年显示===============
DISPLAY:
MOVA,#10000001B;设定年第1位的显示地址为第1行,第1列
LCALLWRITE_COM;调用写指令到液晶子程序
MOVA,#32H;数字2的ASCII码
LCALLWRITE_DATA;调用写数据到液晶子程序
MOVA,#10000010B;设定年第2位的显示地址为第1行,第2列
LCALLWRITE_COM
MOVA,#30H;数字0的ASCII码
LCALLWRITE_DATA
MOVA,#10000011B;设定年第3位的显示地址为第1行,第3列
LCALLWRITE_COM
MOVA,YEAR_LBUF;年的低位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWRITE_DATA
MOVA,#10000100B;设定年第4位的显示地址为第1行,第4列
LCALLWRITE_COM
MOVA,YEAR_HBUF;年的高位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWRITE_DATA
;=====================斜线显示========================
MOVA,#10000101B;设定斜线的显示地址为第1行,第5列
LCALLWRITE_COM
MOVA,#2FH;斜线的ASCII码
LCALLWRITE_DATA
;================显示月============
MOVA,#10000110B;设定月第1位的显示地址为第1行,第6列
LCALLWRITE_COM
MOVA,MONT_LBUF;月的低位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWRITE_DATA
MOVA,#10000111B;设定月第2位的显示地址为第1行,第7列
LCALLWRITE_COM
MOVA,MONT_HBUF;月的高位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWRITE_DATA
;=======================斜线显示============================
MOVA,#10001000B;设定斜线的显示地址为第1行,第8列
LCALLWRITE_COM
MOVA,#2FH;斜线的ASCII码
LCALLWRITE_DATA
;==============================天显示=======================
MOVA,#10001001B;设定天第1位的显示地址为第1行,第9列
LCALLWRITE_COM
MOVA,DAY_LBUF;天的低位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWRITE_DATA
MOVA,#10001010B;设定天第2位的显示地址为第1行,第10列
LCALLWRITE_COM
MOVA,DAY_HBUF;天的高位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWRITE_DATA
;========================星期显示======================
MOVA,#10001101B;设定星期第2位的显示地址为第1行,第13列
LCALLWRITE_COM
MOVA,WEEK_DATA;星期的高位缓存数据
SUBBA,#1
ADDA,#30H;加30H修正取ASCII码
LCALLWRITE_DATA
;=======================小时显示============================
MOVA,#11000000B;设定小时第1位的显示地址为第2行,第0列
LCALLWRITE_COM
MOVA,HOUR_LBUF;小时的低位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWRITE_DATA
MOVA,#11000001B;设定小时第2位的显示地址为第2行,第1列
LCALLWRITE_COM
MOVA,HOUR_HBUF;小时的高位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWRITE_DATA
;======================冒号的显示==========================
MOVA,#11000010B;设定冒号的显示地址为第2行,第2列
LCALLWRITE_COM
MOVA,#3AH;冒号的ASCII码
LCALLWRITE_DATA
;====================分钟显示======================
MOVA,#11000011B;设定分钟第1位的显示地址为第2行,第3列
LCALLWRITE_COM
MOVA,MINTUE_LBUF;分钟的低位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWRITE_DATA
MOVA,#11000100B;设定分钟第2位的显示地址为第2行,第4列
LCALLWRITE_COM
MOVA,MINTUE_HBUF;分钟的高位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWRITE_DATA
;======================冒号的显示===========================
MOVA,#11000101B;设定冒号的显示地址为第2行,第5列
LCALLWRITE_COM
MOVA,#3AH;冒号的ASCII码
LCALLWRITE_DATA
;=====================秒钟显示=============================
MOVA,#11000110B;设定秒钟第1位的显示地址为第2行,第6列
LCALLWRITE_COM
MOVA,SECOND_LBUF;秒钟的低位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWRITE_DATA
MOVA,#11000111B;设定秒钟第2位的显示地址为第2行,第7列
LCALLWRITE_COM
MOVA,SECOND_HBUF;秒钟的高位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWRITE_DATA
RET
;=========初始画面==============
INIT_P:
MOVA,#10000000B;设定显示地址1000为第1行,1010为第0列
LCALLWRITE_COM;调用写液晶指令子程序
MOVDPTR,#LINE1
LCALLDISP
MOVA,#11000000B;设定显示地址1100为第2行,1010为第0列
LCALLWRITE_COM;调用写液晶指令子程序
MOVDPTR,#LINE2
LCALLDISP
LCALLDELAY2;调用延时2秒程序
RET
;=========显示的字符串============
LINE1:
DB'WelcomeUse'
LINE2:
DB'wangqianru'
;========液晶初始化===============
INITIALZE:
MOVA,#00111000B;8位数据,双行显示,5-7字型
LCALLWRITE_COM;调用写液晶指令
MOVA,#00001100B;显示屏开启,光标出现在地址计数器位置,光标不闪烁
LCALLWRITE_COM;调用写液晶指令
MOVA,#00000110B;光标右移一格,AC值加一,字符全部不动
LCALLWRITE_COM;调用写液晶指令
CLRA
;========DS1302初始化===========
MOVDS1302_ADDR,#8EH;写DS1302控制指令
MOVDS1302_DATA,#00H;写数据到DS1302的8E控制寄存器中,允许对其进行写操作
LCALLWRITE;调用写DS1302子程序
MOVDS1302_ADDR,#90H;写DS1302控制指令
MOVDS1302_DATA,#0A6H;写数据到DS1302的90控制寄存器中,对电池涓流充电,充电电流为1.1mA
LCALLWRITE;调用写DS1302子程序
RET
;=========查询忙碌标志============
CHECK_BUSY:
PUSHACC
BUSY_LOOP:
CLRE
SETBRW
CLRRS
SETBE
MOVA,DB0_DB7
JBp0.7,BUSY_LOOP
POPACC
LCALLDEL
RET
;=========写指令到液晶=============
WRITE_COM:
LCALLCHECK_BUSY
CLRE
CLRRS
CLRRW
SETBE
MOVDB0_DB7,A
CLRE
RET
;==========写数据到液晶==============
WRITE_DATA:
LCALLCHECK_BUSY
CLRE
SETBRS
CLRRW
SETBE
MOVDB0_DB7,A
CLRE
RET
;===========延时程序===================
DEL:
MOVR6,#5
L1:
MOVR7,#248
DJNZR7,$
DJNZR6,L1
RET
;===========显示字符串到LCM==============
DISP:
PUSHACC
DISP_LOOP:
CLRA
MOVCA,@A+DPTR
JZEND_DISP;若A的内容为0.则终止查表
LCALLWRITE_DATA
INCDPTR
SJMPDISP_LOOP
END_DISP:
POPACC
RET
;***********写1302程序*************
WRITE:
CLRSCLK
NOP
SETBRST
NOP
MOVA,DS1302_ADDR
MOVR4,#8
WRITE1:
RRCA;送地址给1302
NOP
NOP
CLRSCLK
NOP
NOP
NOP
MOVIO,C
SETBSCLK;送入地址在时钟上升沿有效
NOP
NOP
NOP
NOP
DJNZR4,WRITE1
CLRSCLK
NOP
MOVA,DS1302_DATA
MOVR4,#8
WRITE2:
RRCA
NOP;送数据给1302,时钟上升沿,数据输入
CLRSCLK
NOP
NOP
MOVIO,C
NOP
NOP
NOP
SETBSCLK
NOP
NOP
DJNZR4,WRITE2
CLRRST
CLRA
RET
;**********读1302程序************
READ:
CLRSCLK
NOP
NOP
SETBRST
NOP
MOVA,DS1302_ADDR
MOVR4,#8
READ1:
RRCA
NOP
MOVIO,C
NOP
NOP
NOP
SETBSCLK;送入地址在时钟上升沿有效
NOP
NOP
NOP
CLRSCLK
NOP
NOP
DJNZR4,READ1;判断8位数据是否传送完?
MOVR4,#8
READ2:
CLRSCLK
NOP
NOP
NOP
MOVC,IO
NOP
NOP
NOP
NOP
NOP;从ds1302中读取数据,时钟下降沿有效
RRCA
NOP
NOP
NOP
NOP
SETBSCLK
NOP
DJNZR4,READ2;判断8位数据是否传送完?
MOVDS1302_DATA,A
CLRRST
RET
;==========分离数据子程序=========
DIVIDE:
MOVA,R0
ANLA,#0FH;屏蔽掉低4位,留下高4位
MOVR1,A
MOVA,R0
SWAPA;A中数据高4位与低4位互换
ANLA,#0FH;实际上是屏蔽掉了高4位,留下低4位
MOVR2,A
RET
;========延时2秒子程序=============
DELAY2:
MOVR5,#20
D3:
MOVR6,#200
D2:
MOVR7,#250
DJNZR7,$
DJNZR6,D2
DJNZR5,D3
RET
END
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS1302i