利用ME300A实现LCD日历电子钟汇编语言.docx
- 文档编号:10846665
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:26
- 大小:23.51KB
利用ME300A实现LCD日历电子钟汇编语言.docx
《利用ME300A实现LCD日历电子钟汇编语言.docx》由会员分享,可在线阅读,更多相关《利用ME300A实现LCD日历电子钟汇编语言.docx(26页珍藏版)》请在冰豆网上搜索。
利用ME300A实现LCD日历电子钟汇编语言
利用ME300A实现LCD日历电子钟(汇编语言)
本人曾发帖<< 利用ME300A实现LCD日历电子钟(c语言)>>,应网友之邀,现用汇编语言编写程序,在ME300A上实现LCD日历电子钟.整个软件编制花了本人一晚上的时间,感觉还是用C比用汇编来得快,当然对于初学者我个人认为还是应从汇编开始.
本次用汇编语言写的LCD日历电子钟,同用C语言写的相比,整个LCD显示界面完全一样,但控制变了.它只用二个控制键.控制键介绍如下:
;按AN3,依次进入闹钟功能,闹钟时间,年,月,日和时,分,秒模式,直致退出设置状态
;按AN4,调整是否起用闹钟和调节闹钟时,分,秒,年,月,日,时间的时,分,秒的数字
;闹钟响时,按AN4即可停止闹钟的声响
;正常状态,上排最前面显示一自定义字符,下排最前面闪动"willar"
;设置状态,LCD上排最前面显示"P",下排最前面设置闹钟时显示"alarm:
",其他显示"time:
"
;闹钟启用时,在LCD下排中间显示一小喇叭,闹钟禁用时,无此小喇叭
;年代变化2000--2099,星期闰年自动计算
;程序中有自定义字符写入
注:
利用ME300A实现LCD日历电子钟(c语言)可参看:
完整源程序如下:
---------------------------------------
;********************************************************************************
;
;日历时钟
;按AN3,依次进入闹钟功能,闹钟时间,年,月,日和时,分,秒模式,直致退出设置状态
;按AN4,调整是否起用闹钟和调节闹钟时,分,秒,年,月,日,时间的时,分,秒的数字
;闹钟响时,按AN4即可停止闹钟的声响
;正常状态,上排最前面显示一自定义字符,下排最前面闪动"willar"
;设置状态,LCD上排最前面显示"P",下排最前面设置闹钟时显示"alarm:
",其他显示"time:
"
;闹钟启用时,在LCD下排中间显示一小喇叭,闹钟禁用时,无此小喇叭
;年代变化2000--2099,星期自动转换
;程序中有自定义字符写入
;*********************************************************************************
;**************变量的定义*****************
RS BIT P2.0 ;LCD数据/命令选择端(H/L)
RW BIT P2.1 ;LCD读/写选择端(H/L)
EP BIT P2.2 ;LCD使能控制
PRE BIT P3.4 ;调整键(AN3)
ADJ BIT P3.5 ;调整键(AN4)
SPK BIT P3.7 ;闹钟声音输出口
YEAR DATA 18H ;年,月,日变量
MONTH DATA 19H
DATE DATA 1AH
WEEK DATA 1BH
HOUR DATA 1CH ;时,分,秒,百分之一秒变量
MIN DATA 1DH
SEC DATA 1EH
SEC100 DATA 1FH
HOUR_ARM DATA 20H ;闹钟时,分,秒,变量
MIN_ARM DATA 21H
SEC_ARM DATA 22H
STATE DATA 23H
ALARM BIT STATE.0 ;闹钟是否启用标志1--启用,0--禁止
LEAP BIT STATE.1 ;是否闰年标志1--闰年,0--平年
KEY_S DATA 24H ;当前扫描键值
KEY_V DATA 25H ;上次扫描键值
DIS_BUF_U0 DATA 26H ;LCD上排显示缓冲区
DIS_BUF_U1 DATA 27H
DIS_BUF_U2 DATA 28H
DIS_BUF_U3 DATA 29H
DIS_BUF_U4 DATA 2AH
DIS_BUF_U5 DATA 2BH
DIS_BUF_U6 DATA 2CH
DIS_BUF_U7 DATA 2DH
DIS_BUF_U8 DATA 2EH
DIS_BUF_U9 DATA 2FH
DIS_BUF_U10 DATA 30H
DIS_BUF_U11 DATA 31H
DIS_BUF_U12 DATA 32H
DIS_BUF_U13 DATA 33H
DIS_BUF_U14 DATA 34H
DIS_BUF_U15 DATA 35H
DIS_BUF_L0 DATA 36H ;LCD下排显示缓冲区
DIS_BUF_L1 DATA 37H
DIS_BUF_L2 DATA 38H
DIS_BUF_L3 DATA 39H
DIS_BUF_L4 DATA 3AH
DIS_BUF_L5 DATA 3BH
DIS_BUF_L6 DATA 3CH
DIS_BUF_L7 DATA 3DH
DIS_BUF_L8 DATA 3EH
DIS_BUF_L9 DATA 3FH
DIS_BUF_L10 DATA 40H
DIS_BUF_L11 DATA 41H
DIS_BUF_L12 DATA 42H
DIS_BUF_L13 DATA 43H
DIS_BUF_L14 DATA 44H
DIS_BUF_L15 DATA 45H
FLAG DATA 46H ;标识调整状态 0-闹钟功能,1-闹钟时,2-闹钟分,3-闹钟秒
;4-年,5-月,6-日,7-时,8-分,9-秒,10-退出调整。
DIS_H DATA 47H
DIS_M DATA 48H
DIS_S DATA 49H
DIS_S0 DATA 4AH
DIS_S1 DATA 4BH
DIS_S2 DATA 4CH
DIS_S3 DATA 4DH
DIS_S4 DATA 4EH
DIS_S5 DATA 4FH
;******************初始化***********************
ORG 0000H
LJMP START
ORG 000BH
LJMP TIMER0
ORG 001BH
LJMP TIMER1
ORG 0100H
START:
MOV SP,#60H
MOV R0,#18H
MOV A,#00H
MEM_INI:
MOV @R0,A
INC R0
CJNE R0,#5FH,MEM_INI
LCALL DELAY_5ms ;初始化LCD
MOV R0,#38H ;设置LCD为16X2显示,5X7点阵,八位数据接口
LCALL LCD_WCMD
LCALL DELAY_5ms
MOV R0,#0CH ;设置LCD开显示及光标形式(光标不闪烁,不显示"-")
LCALL LCD_WCMD
LCALL DELAY_5ms
MOV R0,#06H ;LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)
LCALL LCD_WCMD
LCALL DELAY_5ms
MOV R0,#01H ;清除LCD的显示内容
LCALL LCD_WCMD
LCALL DELAY_5ms
;第一自定义字符:
MOV R0,#40H
LCALL lcd_wcmd ;"01 000 000"第1行地址 (D7D6为地址设定命令形式D5D4D3为字符存放位置(0--7),D2D1D0为字符行地址(0--7))
MOV R0,#1FH
LCALL lcd_wdat ;"XXX 11111"第1行数据(D7D6D5为XXX,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭)
MOV R0,#41H
LCALL lcd_wcmd ;"01 000 001"第2行地址
MOV R0,#11H
LCALL lcd_wdat ;"XXX 10001"第2行数据
MOV R0,#42H
LCALL lcd_wcmd ;"01 000 010"第3行地址
MOV R0,#15H
LCALL lcd_wdat ;"XXX 10101"第3行数据
MOV R0,#43H
LCALL lcd_wcmd ;"01 000 011"第4行地址
MOV R0,#11H
LCALL lcd_wdat ;"XXX 10001"第4行数据
MOV R0,#44H
LCALL lcd_wcmd ;"01 000 100"第5行地址
MOV R0,#1FH
LCALL lcd_wdat ;"XXX 11111"第5行数据
MOV R0,#45H
LCALL lcd_wcmd ;"01 000 101"第6行地址
MOV R0,#0AH
LCALL lcd_wdat ;"XXX 01010"第6行数据
MOV R0,#46H
LCALL lcd_wcmd ;"01 000 110"第7行地址
MOV R0,#1FH
LCALL lcd_wdat ;"XXX 11111"第7行数据
MOV R0,#47H
LCALL lcd_wcmd ;"01 000 111"第8行地址
MOV R0,#00H
LCALL lcd_wdat ;"XXX 00000"第8行数据
;第二个自定义字符:
MOV R0,#48H
LCALL lcd_wcmd ;"01 001 000"第1行地址
MOV R0,#01H
LCALL lcd_wdat ;"XXX 00001"第1行数据
MOV R0,#49H
LCALL lcd_wcmd ;"01 001 001"第2行地址
MOV R0,#1BH
LCALL lcd_wdat ;"XXX 11011"第2行数据
MOV R0,#4AH
LCALL lcd_wcmd ;"01 001 010"第3行地址
MOV R0,#1DH
LCALL lcd_wdat ;"XXX 11101"第3行数据
MOV R0,#4BH
LCALL lcd_wcmd ;"01 001 011"第4行地址
MOV R0,#19H
LCALL lcd_wdat ;"XXX 11001"第4行数据
MOV R0,#4CH
LCALL lcd_wcmd ;"01 001 100"第5行地址
MOV R0,#1DH
LCALL lcd_wdat ;"XXX 11101"第5行数据
MOV R0,#4DH
LCALL lcd_wcmd ;"01 001 101"第6行地址
MOV R0,#1BH
LCALL lcd_wdat ;"XXX 11011"第6行数据
MOV R0,#4EH
LCALL lcd_wcmd ;"01 001 110"第7行地址
MOV R0,#01H
LCALL lcd_wdat ;"XXX 00001"第7行数据
MOV R0,#4FH
LCALL lcd_wcmd ;"01 001 111"第8行地址
MOV R0,#00H
LCALL lcd_wdat ;"XXX 00000"第8行数据
MOV YEAR,#5 ;置年初值
MOV MONTH,#1 ;置月初值
MOV DATE,#1 ;置日初值
MOV DIS_S0,#77H ;"w"
MOV DIS_S1,#69H ;"i"
MOV DIS_S2,#6CH ;"l"
MOV DIS_S3,#6CH ;"l"
MOV DIS_S4,#61H ;"a"
MOV DIS_S5,#72H ;"r"
MOV R1,#00H ;显示一自定义字符
LCALL WEEK_PRO
LCALL UPDATE_BUF
LCALL DISPLAY_PRO ;屏显初始化
;*********************主程序*********************
MAIN:
MOV IE,#8AH ;CPU开中断,Timer0,Timer1开中断
MOV TMOD,#11H ;Timer0,Timer1工作于模式1, 16位定时方式
MOV TH0,#0DCH ;Timer0置10ms定时初值
MOV TL0,#00H
MOV TH1,#0FFH ;Timer1置闹钟声音初值
MOV TL1,#00H
SETB ALARM ;初始启动闹钟功能
CLR TR1 ;Timer1禁止
SETB TR0 ;Timer0启动
MOV KEY_V,#03H
MAIN_1:
LCALL KEY_SCAN
MOV A,KEY_S
XRL A,KEY_V
JZ MAIN_1
LCALL DELAY_5ms
LCALL DELAY_5ms
LCALL KEY_SCAN
MOV A,KEY_S
XRL A,KEY_V
JZ MAIN_1
MOV KEY_V,KEY_S
MOV A,KEY_V
XRL A,#01H
JNZ MAIN_2
CLR TR0 ;进入调整状态,禁止Timer0
MOV IE,#00H ;CPU禁止中断
LCALL KEY_PRE_PRO ;PRE按键按下,调用PRE按键处理程序
SJMP MAIN_1
MAIN_2:
MOV A,KEY_V
XRL A,#02H
JNZ MAIN_1
LCALL KEY_ADJ_PRO ;ADJ按键按下,调用PRE按键处理程序
SJMP MAIN_1
;*******************按键扫描程序******************
KEY_SCAN:
CLR A
MOV P3,#0FFH
MOV C,PRE
MOV ACC.1,C
MOV C,ADJ
MOV ACC.0,C
MOV KEY_S,A ;本次扫描键值存入KEY_S
RET
;**************PRE按键处理程序*******************
KEY_PRE_PRO:
INC FLAG
MOV R4,FLAG
CJNE R4,#1,KEY_PRE_1 ;注意,该指令不改变操作
MOV R0,#0EH
LCALL LCD_WCMD ;显示光标"_",整个光标不闪烁
MOV DIS_S0,#61H ;"a"
MOV DIS_S1,#6cH ;"l"
MOV DIS_S2,#61H ;"a"
MOV DIS_S3,#72H ;"r"
MOV DIS_S4,#6dH ;"m"
MOV DIS_S5,#3aH ;":
"
MOV R1,#50H ;"P"
MOV DIS_H,HOUR_ARM
MOV DIS_M,MIN_ARM
MOV DIS_S,SEC_ARM
LCALL UPDATE_BUF
LCALL DISPLAY_PRO ;更新屏显内容
MOV R0,#47H
LCALL LCD_POS ;使光标位于第一个调整项下
JMP KEY_PRE_E
KEY_PRE_1:
CJNE R4,#2,KEY_PRE_2
MOV R0,#49H
LCALL LCD_POS ;光标置小时报警设置位置
JMP KEY_PRE_E
KEY_PRE_2:
CJNE R4,#3,KEY_PRE_3
MOV R0,#4CH
LCALL LCD_POS ;光标置分钟报警设置位置
JMP KEY_PRE_E
KEY_PRE_3:
CJNE R4,#4,KEY_PRE_4
MOV R0,#4FH
LCALL LCD_POS ;光标置秒时报警设置位置
JMP KEY_PRE_E
KEY_PRE_4:
CJNE R4,#5,KEY_PRE_5
MOV DIS_S0,#74H ;"t"
MOV DIS_S1,#69H ;"i"
MOV DIS_S2,#6dH ;"m"
MOV DIS_S3,#65H ;"e"
MOV DIS_S4,#3aH ;":
"
MOV DIS_S5,#20H ;" "
MOV R1,#50H ;"P"
MOV DIS_H,HOUR
MOV DIS_M,MIN
MOV DIS_S,SEC
LCALL UPDATE_BUF
LCALL DISPLAY_PRO ;更新屏显内容
MOV R0,#05H
LCALL LCD_POS ;光标置年调整位置
JMP KEY_PRE_E
KEY_PRE_5:
CJNE R4,#6, KEY_PRE_6
MOV R0,#08H
LCALL LCD_POS ;光标置月调整位置
JMP KEY_PRE_E
KEY_PRE_6:
CJNE R4,#7,KEY_PRE_7
MOV R0,#0bH
LCALL LCD_POS ;光标置日调整位置
JMP KEY_PRE_E
KEY_PRE_7:
CJNE R4,#8,KEY_PRE_8
MOV R0,#49H
LCALL LC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 ME300A 实现 LCD 日历 电子钟 汇编语言