电子万年历制作(汇编程序)_第1页
电子万年历制作(汇编程序)_第2页
电子万年历制作(汇编程序)_第3页
电子万年历制作(汇编程序)_第4页
电子万年历制作(汇编程序)_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

;*;*- -电子万年历制作-*;*-*;*-MCS-51汇编语言-*;*-*;*-CPU: AT89C51-*;-*;*-晶振:12MHz-*;*-* RTC EQU 0200H ;定义MC起始地址=秒地址LCDIR EQU 0100H ;指令寄存器地址LCDIR EQU 0500H ;数据寄存器地址RAM EQU 20H ;寄存器RAM 20HPTR EQU 28H ;年、月、日、时、分、秒位置的指针05 ORG 00H JMP START ORG 13H JMP EXT1 ;INT1中断子程序START: MOV SP,#60H ;设置堆栈 MOV RAM,#01H ;LCD清除屏幕 CALL PUTIR CALL DRLAY1 ;2ms MOV RAM,#38H ;LCD功能设定,8位,2行,显示, CALL PUTIR MOV PTR,#0FH ;设定显示屏幕,光标ON,光标闪烁 CALL PUTIR MOV RAM,#6H ;加1, 光标向右移 CALL PUTIR MOV PTR,#00 ; 位置指针为0,即停在”年”位置MOV IE,#84H ;TIMER1 INT1中断使能MOV DPTR,#RTC+0AH ;A寄存器32,768kHz DV2=0 DV1=1 DV0=0 MOV A ,#20HMOVX DPTR, AMOV DPTR ,#RTC+0BH ;B寄存器SET=1更新周期停止,进行时钟设定MOV A,#80HMOVX DPTR,AMOV DPTR,#RTC+0EH ;读取RTC OE 地址内容判断是否为3?MOVX A,DPTRCJNE A,#01H,START0JMP START1START0: ; 不是则写入内定时间2008年1月1日12:00:00 MOV RAM,#80H ; 设定光标停在第一行第一格 CALL PUTIR MOV DPTR,#RTC ; 秒地址写入00秒 MOV A,#00H ;;00秒 MOVX DPTR,A MOV DPTR,#RTC+2;分地址写入00分 MOV A,#00H ;00分 MOVX DPTR,A MOV DPTR,#RTC+4 ;时地址写入12时 MOV A,#12H ;12时 MOVX DPTR,A MOV DPTR,#RTC+7 ;日地址写入1日 MOV A,#01H ;1日 MOVX DPTR,A MOV DPTR,#RTC+8 ;月地址写入1月 MOV A,#01H ;1月 MOVX DPTR,A MOV DPTR,#RTC+9 ; 年地址写入08年 MOV A,#08H ;08年 MOVX DPTR,A MOV DPTR,#RTC+0EH ;RTC OE 地址写入1,表示内部已有;时间值的识别码, MOV A,#01H MOVX DPTR,A MOV DPTR,#TAB ;LCD显示内定日期时间 CALL PUTSTR JMP START2START1: ;是1表示RTC内已有时间 MOV RAM,#80H ;设定光标停在第一行第一格 CALL PUTIR MOV DPTR,#TAB1 ;LCD显示”19 : :” CALL PUTSTRSTART2: MOV RMA,#82H ;光标停在”年”位置 CALL PUTIR MOV DPTR,#RTC+0BH ;B寄存器UIE=1 RTC中断使能开始计时,(十进制,24小时制) MOV A,#12H MOVX DPTR,A LOOP: JNB P1,0,CUR0 ;是否按P1.0?是则光标位置加1 JNB P1,1,INC0 ;是否按P1,1?是则光标所在位置的值加1 JNB P1,2,DEC0 ;是否按,P1,2?是则光标所在位置的值减1 JMP LOOPCUR0: JMP CUR1 ;间接跳跃INC0: JMP INC1 ;间接跳跃DEC0: SJMP DEC ;间接跳跃CUR1: CALL DELAY ; 按钮清除抖动 JNB P1.0,S ;检测按钮是否放开? CALL DELAY ; 按钮清除抖动 INC PTR MOV A,PTR ;读取位置指针 CJNE A,#06H,CUR10 ;是否超过”秒”位置? 第6个位置 MOV PTR,#00HCUR10: MOV DPTR,#CUR ;指向LCD位置表(年、月、日、时、分、秒所在的光标地址) MOVC A,A+DPTR ;依位置指针读取对应的光标地址来设定 MOV RAM,A ;设定LCD光标地址 CALL PUTIR JMP LOOPINC1: CALL DELAY ;按钮清除抖动 JNB P1.1,S ;检测按钮是否放开? CALL DELAY ;按钮清除抖动 MOV DPTR,#RTC+OBH ;B寄存器SET=1更新周期停止,进行时钟设定 MOV A,#80H MOVX #DPTR.A MOV DPTR.#TIM ;依位置指针读取该RTC地址存入RAM 20H MOV A,PTR MOVC A,A+DPTR MOV RAM,A MOV DPTR,#MAX ; 依位置指针取该时间最大值存入RAM 21H MOV A,PTR MOVC A,A+DPTR MOV RAM+1.A MOV DPTR.#MIN ;依位置指针取该时间最小值存入RAM 22H MOV A,PTR MOVC A,A+DPTR MOV RAM+2,A MOV DPTR,#RTC ; 读取(#RTC+RAM)地址的内容 MOV DPL.RAM MOVX A,DPTR CJNE A,RAM+1,INC10 ;是否=最大值?不是则跳至INC 10 MOV A.RAM+2 ;是则存入最小值 JMP INC11 INC10: ADD A.#01H DA A INC11: MOVX DPTR.A ;写入RTC MOV B,#10H ;将时间值十位数,个位数拆开 DIV AB ADD A,#0 ; 位数转换为ASCII码送至LCD显示 MOV RAM,A CALL PUTCHR MOV A,B ; 个位数转换为ASCII码送至LCD显示 ADD A,#00 MOV RAM,A CALL PUTCHR MOV DPTR,#CUR ;让光标回到原来位置 MOV A,PTR MOVC A,A+DPTR MOV RAM,A CALL PUTIR MOV DPTR,#RTC+0BH ;B寄存器UIE=1 RTC中断使能开始计时(十进制,24小时制) MOV A,#12H MOVX DPTR,A JMP LOOPDEC1: CALL DELAY ;按钮清除抖动 JNB P1,2 ;检测按钮是否放开? CALL DELAY ;按钮清除抖动 MOV DPTR,#RTC+0BH ;B寄存器SET=1更新周期停止,进行时钟设定 MOV A,#80H MOVX DPTR,A MOV DPTR,#TIM ;依位置指针取RTC地址存入RAM 20H MOV A,PTR MOVC AA+DPTR MOV RAM,A MOV DPTR,#MAX ;依位置指针取该时间最大值存入RAM 21H MOV A,PTR MOVC A,A+DPTR MOV RAM+1,A MOV DPTR,#MIN ;依位置指针取该时间最小值存入RAM 22H MOV A,PTR MOVC A,A+DPTR MOV RAM+2,A MOV DPTR,#TRC ;读取(#RTC+RAM)地址的内容存入RAM 23H MOV DPL,RAM MOVX A,DPTR MOV RAM+3,A CJNE A,#RAM+2 DEC10 ;是否=最小值?不是由跳至DEC10 MOV A,RAM+1 ;是则存入最大值 JMP DEC12DEC10: ;不是最小值则检测个位数是否为0? ANL A,#0FH XRL A,#00H JNZ DEC11 ;个位数不是0则跳至DEC11 MOV A,RAM+3 ;个位数为0则读取RTC值减7(即十位数减1,个位数为9) CLR C SUBB A,#07H JMP DEC12DEC11: MOV A,RAM+3 ; 个位数不为0则读取RTC值减1 DEC ADEC12: JMP INC11PUTIR: ;写入指令子程序 CALL BUSY ;检测忙碌标志位 MOV DPTR,#LCDIR; LCD指令寄存器 MOV A,RAM ; 将RAM内容写入指令寄存器 MOVX DPTR,A RETPUTCHR: ; 显示字子程序 CALL BUSY ;检测忙碌标志位 MOV A,RAM ;LCD数据寄存器 MOVX DPTR,A RETPUTSTR: ;显示字串子程序 MOV R2,#00 ;取字串的指针值为0PUTSTR1: MOV A,R2 ;载入字串指针值 MOVC A,A+DPTR ;取字串数据码 MOV RAM,A ;写入RAM寄存器 XRL A,#00H ; 是否取到结束码0? JZ PUTSTR2 ;是则返回 PUSH DPH ;不是则先将DPTT压入堆栈,以免损坏字串指针 PUSH DPL CALL PUTCHR ;将字串显示数据码显示(此子程序会破坏DPTR值) INC R2 ;指向字串下一个数据码 POP DPL ;取回字串指针DPTR POP DPH JMP PUTSTR1PUTSTR2: RETBUSY: ;检测忙碌标志位子程序 MOV DPTR,#LCDIR ;LCD指令寄存器BUSY1: MOVX A,DPTR ;读取忙碌标志位(bit7) ANL A,#80H XRL A,#80H ;检测bit7=1? JZ BUSY1 ;是则表示在忙碌中 RET EXT1: PUSH ACC PUSH PSW MOV DPTR,#RTC+0CH ;读C 寄存器,清除中断标志位,IRQF MOVX A,DPTR MOV R2,#00EXT10: MOV DPTR,#CUR ;依R2值读取光标地址 MOV A,R2 MOVC A,A+DPTR MOV RAM,A ;设定停在指定位置 CALL PUTIR MOV DPTR,#TIM ;依R2值读取RTC内部地址 MOV A,R2 MOVC A,A+DPTR MOV DPTR,#RTC ;DPTR指向#RTC外部地址 MOV DPL,A ;PTR=RTC+OFFSET地址 MOVX A,DPTR ;取该地址的内容 MOV B,#10H ;将十位数,个位数分开 DIV AB ADD A,#0 ;位数转换为ASCII码送至LCD显示 MOV RAM,A CALL PUTCHR MOV A,B ; 个位数转换为ASCII码送至LCD ADD A,#0 MOV RAM,A CALL PUTCHR INC R2 ;指向下一组时间 CJNE R2,#06H,EXT10 MOV DPTR,#CUR ; 让光标回到原来位置 MOV A,PTR MOVC A,A+DPTR MOV RAM,A CALL PUTIR POP PSW POP ACC RETIDELAY: MOV R6,#60 ; 延时30msD1: MOV R7,#248 DJNZ R7,#$ DJNZ R6,D1 RETDELAY1: MOV R6,#4 ;延时2msD11: MOV R7,#248 DJNZ R7,$ DJNZ R6,D11 RETTAB: DB 08 0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论