1602液晶万年历Word下载.docx
《1602液晶万年历Word下载.docx》由会员分享,可在线阅读,更多相关《1602液晶万年历Word下载.docx(29页珍藏版)》请在冰豆网上搜索。
STATEDATA23H
ALARMBITSTATE.0;
闹钟是否启用标志1--启用,0--禁止
LEAPBITSTATE.1;
是否闰年标志1--闰年,0--平年
KEY_SDATA24H;
当前扫描键值
KEY_VDATA25H;
上次扫描键值
DIS_BUF_U0DATA26H;
LCD上排显示缓冲区
DIS_BUF_U1DATA27H
DIS_BUF_U2DATA28H
DIS_BUF_U3DATA29H
DIS_BUF_U4DATA2AH
DIS_BUF_U5DATA2BH
DIS_BUF_U6DATA2CH
DIS_BUF_U7DATA2DH
DIS_BUF_U8DATA2EH
DIS_BUF_U9DATA2FH
DIS_BUF_U10DATA30H
DIS_BUF_U11DATA31H
DIS_BUF_U12DATA32H
DIS_BUF_U13DATA33H
DIS_BUF_U14DATA34H
DIS_BUF_U15DATA35H
DIS_BUF_L0DATA36H;
LCD下排显示缓冲区
DIS_BUF_L1DATA37H
DIS_BUF_L2DATA38H
DIS_BUF_L3DATA39H
DIS_BUF_L4DATA3AH
DIS_BUF_L5DATA3BH
DIS_BUF_L6DATA3CH
DIS_BUF_L7DATA3DH
DIS_BUF_L8DATA3EH
DIS_BUF_L9DATA3FH
DIS_BUF_L10DATA40H
DIS_BUF_L11DATA41H
DIS_BUF_L12DATA42H
DIS_BUF_L13DATA43H
DIS_BUF_L14DATA44H
DIS_BUF_L15DATA45H
FLAGDATA46H;
标识调整状态0-闹钟功能,1-闹钟时,2-闹钟分,3-闹钟秒
;
4-年,5-月,6-日,7-时,8-分,9-秒,10-退出调整。
DIS_HDATA47H
DIS_MDATA48H
DIS_SDATA49H
DIS_S0DATA4AH
DIS_S1DATA4BH
DIS_S2DATA4CH
DIS_S3DATA4DH
DIS_S4DATA4EH
DIS_S5DATA4FH
******************初始化***********************
ORG0000H
LJMPSTART
ORG000BH
LJMPTIMER0
ORG001BH
LJMPTIMER1
ORG0100H
START:
MOVSP,#60H
MOVR0,#18H
MOVA,#00H
MEM_INI:
MOV@R0,A
INCR0
CJNER0,#5FH,MEM_INI
LCALLDELAY_5ms;
初始化LCD
MOVR0,#38H;
设置LCD为16X2显示,5X7点阵,八位数据接口
LCALLLCD_WCMD
LCALLDELAY_5ms
MOVR0,#0CH;
设置LCD开显示及光标形式(光标不闪烁,不显示"
-"
)
MOVR0,#06H;
LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)
MOVR0,#01H;
清除LCD的显示内容
第一自定义字符:
MOVR0,#40H
LCALLlcd_wcmd;
01000000"
第1行地址(D7D6为地址设定命令形式D5D4D3为字符存放位置(0--7),D2D1D0为字符行地址(0--7))
MOVR0,#1FH
LCALLlcd_wdat;
XXX11111"
第1行数据(D7D6D5为XXX,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭)
MOVR0,#41H
01000001"
第2行地址
MOVR0,#11H
XXX10001"
第2行数据
MOVR0,#42H
01000010"
第3行地址
MOVR0,#15H
XXX10101"
第3行数据
MOVR0,#43H
01000011"
第4行地址
第4行数据
MOVR0,#44H
01000100"
第5行地址
第5行数据
MOVR0,#45H
01000101"
第6行地址
MOVR0,#0AH
XXX01010"
第6行数据
MOVR0,#46H
01000110"
第7行地址
第7行数据
MOVR0,#47H
01000111"
第8行地址
MOVR0,#00H
XXX00000"
第8行数据
第二个自定义字符:
MOVR0,#48H
01001000"
第1行地址
MOVR0,#01H
XXX00001"
第1行数据
MOVR0,#49H
01001001"
MOVR0,#1BH
XXX11011"
MOVR0,#4AH
01001010"
MOVR0,#1DH
XXX11101"
MOVR0,#4BH
01001011"
MOVR0,#19H
XXX11001"
MOVR0,#4CH
01001100"
MOVR0,#4DH
01001101"
MOVR0,#4EH
01001110"
MOVR0,#4FH
01001111"
MOVYEAR,#5;
置年初值
MOVMONTH,#1;
置月初值
MOVDATE,#1;
置日初值
MOVDIS_S0,#35H;
8"
MOVDIS_S1,#31H;
9"
MOVDIS_S2,#43H;
s"
MOVDIS_S3,#35H;
5"
MOVDIS_S4,#31H;
1"
MOVDIS_S5,#20H;
"
MOVR1,#00H;
显示一自定义字符
LCALLWEEK_PRO
LCALLUPDATE_BUF
LCALLDISPLAY_PRO;
屏显初始化
*********************主程序*********************
MAIN:
MOVIE,#8AH;
CPU开中断,Timer0,Timer1开中断
MOVTMOD,#11H;
Timer0,Timer1工作于模式1,16位定时方式
MOVTH0,#0DCH;
Timer0置10ms定时初值
MOVTL0,#00H
MOVTH1,#0FFH;
Timer1置闹钟声音初值
MOVTL1,#00H
SETBALARM;
初始启动闹钟功能
CLRTR1;
Timer1禁止
SETBTR0;
Timer0启动
MOVKEY_V,#03H
MAIN_1:
LCALLKEY_SCAN
MOVA,KEY_S
XRLA,KEY_V
JZMAIN_1
MOVKEY_V,KEY_S
MOVA,KEY_V
XRLA,#01H
JNZMAIN_2
CLRTR0;
进入调整状态,禁止Timer0
MOVIE,#00H;
CPU禁止中断
LCALLKEY_PRE_PRO;
PRE按键按下,调用PRE按键处理程序
SJMPMAIN_1
MAIN_2:
XRLA,#02H
JNZMAIN_1
LCALLKEY_ADJ_PRO;
ADJ按键按下,调用PRE按键处理程序
*******************按键扫描程序******************
KEY_SCAN:
CLRA
MOVP1,#0FFH
MOVC,PRE
MOVACC.1,C
MOVC,ADJ
MOVACC.0,C
MOVKEY_S,A;
本次扫描键值存入KEY_S
RET
**************PRE按键处理程序*******************
KEY_PRE_PRO:
INCFLAG
MOVR4,FLAG
CJNER4,#1,KEY_PRE_1;
注意,该指令不改变操作
MOVR0,#0EH
LCALLLCD_WCMD;
显示光标"
_"
整个光标不闪烁
MOVDIS_S0,#61H;
a"
MOVDIS_S1,#6cH;
l"
MOVDIS_S2,#61H;
MOVDIS_S3,#72H;
r"
MOVDIS_S4,#6dH;
m"
MOVDIS_S5,#3aH;
:
MOVR1,#50H;
MOVDIS_H,HOUR_ARM
MOVDIS_M,MIN_ARM
MOVDIS_S,SEC_ARM
更新屏显内容
LCALLLCD_POS;
使光标位于第一个调整项下
JMPKEY_PRE_E
KEY_PRE_1:
CJNER4,#2,KEY_PRE_2
光标置小时报警设置位置
KEY_PRE_2:
CJNER4,#3,KEY_PRE_3
光标置分钟报警设置位置
KEY_PRE_3:
CJNER4,#4,KEY_PRE_4
光标置秒时报警设置位置
KEY_PRE_4:
CJNER4,#5,KEY_PRE_5
MOVDIS_S0,#74H;
t"
MOVDIS_S1,#69H;
i"
MOVDIS_S2,#6dH;
MOVDIS_S3,#65H;
e"
MOVDIS_S4,#3aH;
MOVDIS_H,HOUR
MOVDIS_M,MIN
MOVDIS_S,SEC
MOVR0,#05H
光标置年调整位置
KEY_PRE_5:
CJNER4,#6,KEY_PRE_6
MOVR0,#08H
光标置月调整位置
KEY_PRE_6:
CJNER4,#7,KEY_PRE_7
MOVR0,#0bH
光标置日调整位置
KEY_PRE_7:
CJNER4,#8,KEY_PRE_8
光标置时调整位置
KEY_PRE_8:
CJNER4,#9,KEY_PRE_9
MOVR0,#4cH
光标置分调整位置
KEY_PRE_9:
CJNER4,#10,KEY_PRE_10
MOVR0,#4fH
光标置秒调整位置
KEY_PRE_10:
MOVFLAG,#0;
FLAG到11,就清零
MOVR0,#0CH
设置LCD开显示及光标不闪烁,不显示"
CPU开中断,TIMER0,TIMER1开中断
启动TIMER0
KEY_PRE_E:
**************ADJ按键处理程序*******************
KEY_ADJ_PRO:
MOVR5,FLAG
CJNER5,#0,KEY_ADJ_0;
FLAG=0,如果有闹钟声音,就停止闹钟声音
MOVC,TR1
JNCKEY_ADJ_A
CLRTR1
KEY_ADJ_A:
JMPKEY_ADJ_E
KEY_ADJ_0:
CJNER5,#1,KEY_ADJ_1;
FLAG=1,调整是否启用闹钟
CPLALARM
LCALLDISPLAY_PRO
LCALLLCD_POS
KEY_ADJ_1:
CJNER5,#2,KEY_ADJ_2;
FLAG=2,调整闹钟时
INCHOUR_ARM
MOVA,HOUR_ARM
CJNEA,#24,KEY_ADJ_1_1
MOVHOUR_ARM,#0
KEY_ADJ_1_1:
KEY_ADJ_2:
CJNER5,#3,KEY_ADJ_3;
FLAG=3,调整闹钟分
INCMIN_ARM
MOVA,MIN_ARM
CJNEA,#60,KEY_ADJ_2_1
MOVMIN_ARM,#0
KEY_ADJ_2_1:
KEY_ADJ_3:
CJNER5,#4,KEY_ADJ_4;
FLAG=4,调整闹钟秒
INCSEC_ARM
MOVA,SEC_ARM
CJNEA,#60,KEY_ADJ_3_1
MOVSEC_ARM,#0
KEY_ADJ_3_1:
KEY_ADJ_4:
CJNER5,#5,KEY_ADJ_5;
FLAG=5,调整年
INCYEAR
MOVA,YEAR
CJNEA,#100,KEY_ADJ_4_1
MOVYEAR,#0
KEY_ADJ_4_1:
KEY_ADJ_5:
CJNER5,#6,KEY_ADJ_6;
FLAG=6,调整月
INCMONTH
MOVA,MONTH
CJNEA,#13,KEY_ADJ_5_1
MOVMONTH,#1
KEY_ADJ_5_1:
KEY_ADJ_6:
CJNER5,#7,KEY_ADJ_7;
FLAG=7,调整日
INCDATE
XRLA,#2
JNZKEY_ADJ_6_2;
不是二月跳转
MOVA,DATE;
MOVC,LEAP;
判断是否闰年
JCKEY_ADJ_6_1
XRLA,#29;
平年二月日期28天
JNZKEY_ADJ_6_5
JMPKEY_ADJ_6_4
KEY_ADJ_6_1:
XRLA,#30;
闰年二月日期29天
JMPKEY_ADJ_6_4;
跳转到月处理
KEY_ADJ_6_2:
XRLA,#4
JZKEY_ADJ_6_3
XRLA,#6
XRLA,#9
XRLA,#11
MOVA,DATE
XRLA,#32;
大月日期31天
KEY_ADJ_6_3:
XRLA,#31;
小月日期30天
KEY_ADJ_6_4:
MOVDATE,#1
KEY_ADJ_6_5:
MOVR0,#0BH
KEY_ADJ_7:
CJNER5,#8,KEY_ADJ_8;
FLAG=8,调整时
INCHOUR
MOVA,HOUR
CJNEA,#24,KEY_ADJ_7_1
MOVHOUR,#0
KEY_ADJ_7_1:
KEY_ADJ_8:
CJNER5,#9,KEY_ADJ_9;
FLAG=9,调整分
INCMIN
MOVA,MIN
CJNEA,#60,KEY_ADJ_8_1
MOVMIN,#0
KEY_ADJ_8_1:
KEY_ADJ_9:
CJNER5,#10,KEY_ADJ_E;
FLAG=10,调整秒
INCSEC
MOVA,SEC
CJNEA,#60,KEY_ADJ_9_1
MOVSEC,#0
KEY_ADJ_9_1:
KEY_ADJ_