实现日期时间温度的显示万年历.docx

上传人:b****4 文档编号:26731606 上传时间:2023-06-22 格式:DOCX 页数:34 大小:75.71KB
下载 相关 举报
实现日期时间温度的显示万年历.docx_第1页
第1页 / 共34页
实现日期时间温度的显示万年历.docx_第2页
第2页 / 共34页
实现日期时间温度的显示万年历.docx_第3页
第3页 / 共34页
实现日期时间温度的显示万年历.docx_第4页
第4页 / 共34页
实现日期时间温度的显示万年历.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

实现日期时间温度的显示万年历.docx

《实现日期时间温度的显示万年历.docx》由会员分享,可在线阅读,更多相关《实现日期时间温度的显示万年历.docx(34页珍藏版)》请在冰豆网上搜索。

实现日期时间温度的显示万年历.docx

实现日期时间温度的显示万年历

;―――――――――――――――――――――――――――――――

;温度值存放单元

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1