实现日期时间温度的显示万年历.docx
- 文档编号:26731606
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:34
- 大小:75.71KB
实现日期时间温度的显示万年历.docx
《实现日期时间温度的显示万年历.docx》由会员分享,可在线阅读,更多相关《实现日期时间温度的显示万年历.docx(34页珍藏版)》请在冰豆网上搜索。
实现日期时间温度的显示万年历
;―――――――――――――――――――――――――――――――
;温度值存放单元
TEMP_ZHEQU24H;实时温度值存放单元
TEMPLEQU25H;低温度值存放单元
TEMPHEQU26H;高温度值存放单元
TEMP_THEQU27H;高温报警值存放单元
TEMP_TLEQU28H;低温报警值存放单元
TEMPHCEQU29H;存十位数BCD码
TEMPLCEQU2AH;存个位数BCD码
;―――――――――――――
;======按键输入引脚定义======
K1EQUP3.2
K2EQUP3.3
K3EQUP3.6
K4EQUP3.7
;
SPKEQUP3.5
RELAYEQU2FH
;------------------------------------
;=====DS1302通信引脚定义=====
RSTBITp1.6
SCLKBITp1.4
IOBITp1.5
;=====定义数据存储地址========
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
;===============================================
XEQU2FH;LCD地址变量
;―――――――――――――
;LCD控制引脚
RSEQUP2.4
RWEQUP2.5
EEQUP2.6
;―――――――――――――
FLAGEQU20H.0
KEY_UDEQU20H.1
DQEQUp2.7
;=============主程序==============
MAIN:
ACALLSET_LCD;LCD初始化设置子程序
ACALLSET_1302;1302初始化
TOOP:
ACALLRESET_1820;调用18B20复位子程序
ACALLTEMP_BJ;显示温度标记"℃"
ACALLMEU_OK;调用显示"OK"信息子程序
TOOP2:
ACALLRE_TEMP;调用读取温度数据子程序
ACALLSET_DATA;调用处理显示温度数据子程序
ACALLTEMP_BJ;显示温度标记子程序
LCALLRD_DS1302
LCALLDATA_BUF
LCALLDISPLAY
SJMPTOOP2;循环
;--------――读取温度数据子程序--------――
RE_TEMP:
ACALLRESET_1820;18B20复位子程序
MOVA,#0CCH;跳过ROM匹配
ACALLWRITE_1820;写入子程序
MOVA,#44H;发出温度转换命令
ACALLWRITE_1820;调写入子程序
ACALLRESET_1820;调复位子程序
MOVA,#0CCH;跳过ROM匹配
ACALLWRITE_1820;写入子程序
MOVA,#0BEH;发出读温度命令
ACALLWRITE_1820;写入子程序
ACALLREAD_1820;调用读取子程序
RET
;--------温度数据处理显示子程序----------
SET_DATA:
ACALLCONV_TEMP;处理温度BCD码子程序
ACALLDISP_BCD;显示区BCD码温度值刷新子程序
ACALLCONV;LCD显示子程序
RET
;―――――――――――――
;----------处理温度BCD码子程序----------
CONV_TEMP:
MOVA,TEMPH;判温度是否零下
ANLA,#80H
JZTC1;温度零转TC1处
CLRC;C=0
MOVA,TEMPL;二进制数求补(双字节)
CPLA;取反加1
ADDA,#01H
MOVTEMPL,A
MOVA,TEMPH
CPLA
ADDCA,#00H
MOVTEMPH,A
JMPTC2
;―――――――――――――
TC1:
MOVTEMPHC,#0AH
TC2:
MOVA,TEMPHC
SWAPA;高、低位交换
MOVTEMPHC,A
MOVA,TEMPL
ANLA,#0FH;乘0.0625
MOVDPTR,#DOTTAB
MOVCA,@A+DPTR
MOVTEMPLC,A;TEMPLCLOW=小数部分BCD
;―――――――――――――
MOVA,TEMPL;整数部分
ANLA,#0F0H;取出高四位
SWAPA;高、低位交换
MOVTEMPL,A
MOVA,TEMPH
ANLA,#0FH;取出低四位
SWAPA;高、低位交换
ORLA,TEMPL;重新组合
MOVTEMP_ZH,A
LCALLHEX2BCD1
MOVTEMPL,A
ANLA,#0F0H;取出高四位
SWAPA;高、低位交换
ORLA,TEMPHC;TEMPHCLOW=十位数BCD
MOVTEMPHC,A
MOVA,TEMPL
ANLA,#0FH;取出低四位
SWAPA;高、低位交换
ORLA,TEMPLC;TEMPLCHI=个位数BCD
MOVTEMPLC,A
MOVA,R4
JZTC3
ANLA,#0FH;取出低四位
SWAPA;高、低位交换
MOVR4,A
MOVA,TEMPHC;TEMPHCHI=百位数BCD
ANLA,#0FH;取出低四位
ORLA,R4
MOVTEMPHC,A
TC3:
RET
;―――――――――――――
HEX2BCD1:
MOVB,#064H;十六进制->BCD
DIVAB;B=A%100
MOVR4,A;R4=百位数
MOVA,#0AH
XCHA,B
DIVAB;B=A%B
SWAPA;高、低位交换
ORLA,B
RET
;―――――――――――――
;小数部分码表
DOTTAB:
DB00H,00H,01H,01H,02H,03H,03H,04H
DB05H,05H,06H,06H,07H,08H,08H,09H
;--------显示区BCD码温度值刷新子程序--------
DISP_BCD:
MOVA,TEMPLC;个位数BCD码送入A
ANLA,#0FH;取低位码
MOV70H,A;小数位
MOVA,TEMPLC
SWAPA;高、低位交换
ANLA,#0FH;取结果数的高位
MOV71H,A;个位
MOVA,TEMPHC
ANLA,#0FH;取低位码
MOV72H,A;十位
MOVA,TEMPHC
SWAPA;高、低位交换
ANLA,#0FH;取结果数的高位
MOV73H,A;百位
MOVA,TEMPHC
ANLA,#0F0H;取低位码
CJNEA,#010H,DI0
JMPDI2
;―――――――――――――
DI0:
MOVA,TEMPHC
ANLA,#0FH;取低位码
JNZDI2;十位数是0
MOVA,TEMPHC
SWAPA;高、低位交换
ANLA,#0FH;取结果数的高位
MOV73H,#0AH;符号位不显示
MOV72H,A;十位数显示符号
DI2:
RET
;==================================================
;==========读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列
LCALLWR_COMM;调用写指令到液晶子程序
MOVA,#32H;数字2的ASCII码
LCALLWR_DATA;调用写数据到液晶子程序
MOVA,#10000010B;设定年第2位的显示地址为第1行,第2列
LCALLWR_COMM
MOVA,#30H;数字0的ASCII码
LCALLWR_DATA
MOVA,#10000011B;设定年第3位的显示地址为第1行,第3列
LCALLWR_COMM
MOVA,YEAR_LBUF;年的低位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWR_DATA
MOVA,#10000100B;设定年第4位的显示地址为第1行,第4列
LCALLWR_COMM
MOVA,YEAR_HBUF;年的高位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWR_DATA
;=====================斜线显示========================
MOVA,#10000101B;设定斜线的显示地址为第1行,第5列
LCALLWR_COMM
MOVA,#2FH;斜线的ASCII码
LCALLWR_DATA
;================显示月============
MOVA,#10000110B;设定月第1位的显示地址为第1行,第6列
LCALLWR_COMM
MOVA,MONT_LBUF;月的低位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWR_DATA
MOVA,#10000111B;设定月第2位的显示地址为第1行,第7列
LCALLWR_COMM
MOVA,MONT_HBUF;月的高位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWR_DATA
;=======================斜线显示============================
MOVA,#10001000B;设定斜线的显示地址为第1行,第8列
LCALLWR_COMM
MOVA,#2FH;斜线的ASCII码
LCALLWR_DATA
;==============================天显示=======================
MOVA,#10001001B;设定天第1位的显示地址为第1行,第9列
LCALLWR_COMM
MOVA,DAY_LBUF;天的低位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWR_DATA
MOVA,#10001010B;设定天第2位的显示地址为第1行,第10列
LCALLWR_COMM
MOVA,DAY_HBUF;天的高位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWR_DATA
;========================星期显示======================
MOVA,#10001111B;设定星期第2位的显示地址为第1行,第13列
LCALLWR_COMM
MOVA,WEEK_DATA;星期的高位缓存数据
SUBBA,#1
ADDA,#30H;加30H修正取ASCII码
LCALLWR_DATA
;=======================小时显示============================
MOVA,#11000000B;设定小时第1位的显示地址为第2行,第0列
LCALLWR_COMM
MOVA,HOUR_LBUF;小时的低位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWR_DATA
MOVA,#11000001B;设定小时第2位的显示地址为第2行,第1列
LCALLWR_COMM
MOVA,HOUR_HBUF;小时的高位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWR_DATA
;======================冒号的显示==========================
MOVA,#11000010B;设定冒号的显示地址为第2行,第2列
LCALLWR_COMM
MOVA,#3AH;冒号的ASCII码
LCALLWR_DATA
;====================分钟显示======================
MOVA,#11000011B;设定分钟第1位的显示地址为第2行,第3列
LCALLWR_COMM
MOVA,MINTUE_LBUF;分钟的低位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWR_DATA
MOVA,#11000100B;设定分钟第2位的显示地址为第2行,第4列
LCALLWR_COMM
MOVA,MINTUE_HBUF;分钟的高位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWR_DATA
;======================冒号的显示===========================
MOVA,#11000101B;设定冒号的显示地址为第2行,第5列
LCALLWR_COMM
MOVA,#3AH;冒号的ASCII码
LCALLWR_DATA
;=====================秒钟显示=============================
MOVA,#11000110B;设定秒钟第1位的显示地址为第2行,第6列
LCALLWR_COMM
MOVA,SECOND_LBUF;秒钟的低位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWR_DATA
MOVA,#11000111B;设定秒钟第2位的显示地址为第2行,第7列
LCALLWR_COMM
MOVA,SECOND_HBUF;秒钟的高位缓存数据
ADDA,#30H;加30H修正取ASCII码
LCALLWR_DATA
RET
;――――――――DS18B20复位初始化子程序――――――――――
RESET_1820:
;复位(有具体的时序要求)
SETBDQ
NOP
CLRDQ
;―――――――――――――
;主机发出延时537微秒的复位低脉冲
MOVR1,#3
DLY:
MOVR0,#107
DJNZR0,$
DJNZR1,DLY
;―――――――――――――
;然后拉高数据线
SETBDQ
NOP
NOP
NOP
;―――――――――――――
;等待DS18B20回应
MOVR0,#25H
T2:
JNBDQ,T5
DJNZR0,T2
;―――――――――――――
;时序要求延时一段时间
T5:
MOVR0,#117
T6:
DJNZR0,T6
;――――――――――――――
T7:
SETBDQ
RET
;=======================================================
;========DS1302初始化===========
SET_1302:
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,p0
JBp0.7,BUSY_LOOP
POPACC
LCALLDEL
RET
;----------------------------------------------------------------------------------------------
;===========延时程序===================
DEL:
MOVR6,#5
L1:
MOVR7,#248
DJNZR7,$
DJNZR6,L1
RET
;――――――――――写入DS18B20子程序―――――――――――
;写入DS18B20(有具体的时序要求)
WRITE_1820:
MOVR2,#8;一共8位数据
CLRC;C=0
WR1:
CLRDQ;总线低位,开始写入
MOVR3,#6
DJNZR3,$;保持16微秒以上
RRCA;把字节DATA分成8个BIT环移给C
MOVDQ,C;写入一个BIT
MOVR3,#23
DJNZR3,$;等待
SETBDQ;重新释放总线
NOP
DJNZR2,WR1;写入下一个BIT
SETBDQ;释放总线
RET
;――――――――――读出DS18B20子程序―――――――――――
;将温度值从DS18B20中读出(有具体的时序要求)
READ_1820:
MOV
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实现 日期 时间 温度 显示 万年历