带LCD的时间控制器.docx
《带LCD的时间控制器.docx》由会员分享,可在线阅读,更多相关《带LCD的时间控制器.docx(27页珍藏版)》请在冰豆网上搜索。
带LCD的时间控制器
带LCD的时间控制器
单片机DIY2008-05-1918:
49:
31阅读293评论0 字号:
大中小 订阅
说明:
本带LCD的时间控制器,是在本人毕业时间《基于单片机的时间控制器的设计》的基础上进行修改的。
使得时间的控制和修改更容易,更直观。
并扩展了红外遥控的功能,但由于条件限制,并没有把此功能
的程序加上。
按键说明:
K1 设置当前时间/按键超过1s,则置整点报时标志
K2 显示控制时间/小时加
K3 设置控制时间/分钟加
K4 控制ON/OFF设置/确定
K5 控制开/关
ELEC 继电器
SPK 蜂鸣器
Y_LED 继电器工作指示
C_LED 被控电器指示灯
W_LED 计时工作指示灯
D_LED 整点报时指示灯
实物图:
程序代码:
;=============================
; 带LCD的时间控制器
; DIPS082-LCD
; KS0066-控制器
;=============================
LO EQU 24 ;加载低字节
HI EQU 99 ;加载高字节
;-----------------------------
CO EQU 200 ;5ms中断计数时间常数
;计数200次表示1s
ALB EQU 20H.0 ;控制设置标志
CLOCK EQU 20H.1 ;整点报时标志
HOUR EQU 30H ;存放小时变量
MIN EQU 31H ;存放分钟变量
SEC EQU 32H ;存放秒钟变量
DEDA EQU 33H ;5ms计数值
SEC0 EQU 34H ;存放旧的秒数
;-----------------------------
DDRAM EQU 35H ;LCD地址变量
COM EQU 22H ;LCD指令寄存器
DAT EQU 21H ;LCD数据寄存器
COUNT EQU 22H ;计数器
HH EQU 36H ;控制设置小时变量
MM EQU 37H ;控制设置分钟变量
;-----------------------------
;KEY4.....
K1 EQU P2.1 ;设置当前时间
K2 EQU P2.0 ;显示控制时间/小时加
K3 EQU P3.6 ;设置控制时间/分钟加
K4 EQU P3.7 ;控制ON/OFF设置/确定
K5 EQU P3.1 ;控制开/关
;-----------------------------
;LCD.....
RS EQU P3.4 ;寄存器选择
RW EQU P3.5 ;读写控制
E EQU P3.3 ;LCD使能
;-----------------------------
ELEC EQU P3.0 ;继电器
SPK EQU P2.2 ;蜂鸣器
Y_LED EQU P2.6 ;继电器工作指示
C_LED EQU P2.4 ;被控电器指示灯
W_LED EQU P2.3 ;计时工作指示灯
D_LED EQU P2.5 ;整点报时指示灯
;-----------------------------
ORG 0000H ;程序代码由地址0
JMP START ;跳至主函数开始执行
ORG 000BH ;定时器TIMER0中断地址
JMP T0_INT ;跳至TIMER0中断启始地址
;#############################
; 主程序
;#############################
START:
CLR Y_LED ;继电器工作指示关
CLR ELEC ;继电器关
CLR CLOCK ;清除整点报时标志
SETB D_LED ;整点报时指示灯关
;-----------------------------
CLR ALB ;清除控制标志
MOV HH,#0 ;内定的控制时间为--00:
00
MOV MM,#0
LCALLSET_LCD ;LCD初始化
LCALLBZ ;蜂鸣器连续两次发音
LCALLBZ
LCALLLED_BL ;LED闪动,表示工作开始
LCALLINIT ;初始化变量
LCALLINIT_TIMER ;初始化定时器
LCALLMENU ;
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; 循环程序
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
LOOP:
LCALLTIME_PRO ;时间计时处理
;按键扫描............
JB K1,L1 ;未按下K1键则继续扫描
;K1.....时间设置/设整点报时
;K1:
ADJTIME K2:
HOUR K3:
MIN K4:
OK
LCALLD_LAY ;1s延时
JNB K1,LL ;按键超过1s,则设整点报时
LCALLBZ ;LED闪动
MOV DPTR,#MADJ ;现实执行消息
MOV A,#1 ;
LCALLLCD_PRINT ;在LCD显示字符
LCALLSET_TIME ;设置目前时间
LCALLMENU ;菜单
JMP LOOP ;继续循环
;.............................
L1:
JB K2,L2 ;未按下K2键则继续扫描
;K2............控制时间显示
JNB K2,$ ;等待K2键释放
LCALLBZ ;蜂鸣器发音
MOV DPTR,#MLAL ;显示控制消息
MOV A,#1 ;
LCALLLCD_PRINT ;在LCD显示字符
LCALLLOOK_ATIME ;查看控制时间
LCALLDELAY ;延时
LCALLLED_BL ;工作LED闪动
LCALLLED_BL ;
LCALLMENU ;菜单
JMP LOOP ;继续循环
;.............................
L2:
JB K3,L3 ;未按下K3键则继续扫描
;K3.....控制时间设置
;K3:
ADJATIME K2:
HOUR K3:
MIN K4:
OK
JNB K3,$ ;等待K3键释放
LCALLBZ ;蜂鸣器发音
MOV DPTR,#MAADJ ;显示控制消息
MOV A,#1 ;
LCALLLCD_PRINT ;在LCD显示字符
LCALLSET_ATIME ;控制时间设置
LCALLLED_BL ;工作LED闪动
LCALLLED_BL
LCALLMENU ;菜单
JMP LOOP ;继续循环
LL:
SJMP L6
;.............................
L3:
JB K4,L4 ;未按下K4键则继续扫描
;K4.......控制开关/确定
JNB K4,$ ;等待K4键释放
CPL ALB ;控制设置标志取反
JNB ALB,L31 ;没有控制标志,则发音一声
;ALARMON....................
CLR C_LED ;控制指示灯亮
LCALLBZ ;有控制标志,则蜂鸣器发音三声
LCALLBZ
LCALLBZ
JMP LOOP ;返回
L31:
;ALARMOFF...................
SETB C_LED ;控制指示灯灭
LCALLBZ ;蜂鸣器发音一声
JMP LOOP ;返回
;.............................
L4:
JB K5,L5 ;未按下K4键则继续扫描
;K5.........电器控制开/关
JNB K5,$ ;等待K5键释放
CPL Y_LED ;LED取反
CPL ELEC
LCALLBZ ;蜂鸣器发音一声
L5:
JMP LOOP ;返回
L6:
CPL CLOCK ;值整点报时标志
CPL D_LED ;整点报时指示灯亮
LCALLDELAY
JMP LOOP ;返回
;-----------------------------
LMESS1:
DB "Wlecome!
",0
LMESS2:
DB "happy!
",0
;=============================
; 初始化控制变量子程序
;=============================
INIT:
MOV DEDA,#0 ;5ms计数值清除为0
MOV SEC0,#0 ;旧的秒数清除为0
MOV SEC,#0 ;秒钟变量清除为0
MOV MIN,#0 ;分钟变量清除为0
MOV HOUR,#1 ;小时变量清除为1
RET ;子程序返回
;=============================
;初始化定时器接口子程序
;=============================
INIT_TIMER:
MOV TMOD,#00000000B;设置定时器T0工作方式为方式0
MOV IE, #10000010B;
MOV TL0,#LO ;加载低字节
MOV TH0,#HI ;加载高字节
SETB TR0 ;启动定时器T0开始计时
RET
;*****************************
; 定时器0中断服务程序
;*****************************
T0_INT:
;中断程序每隔5ms中断一次
PUSH ACC ;累加器放入堆栈
MOV TL0,#LO ;加载低字节
MOV TH0,#HI ;加载高字节
INC DEDA ;5ms计数值加1
;1SECTIMEOUTCHECK
MOV A,DEDA ;5ms计数值
CJNE A,#CO,TT ;是否1s到了?
MOV DEDA,#0 ;DEDA值0
CPL W_LED ;LED灯亮灭变换
INC SEC ;秒计数加1
MOV A,SEC ;秒数据放在累加器里,用于比较
CJNE A,#60,TT ;是否到1min?
;1MINTIMEOUT
INC MIN ;分计数加1
MOV SEC,#0 ;秒计数清除为0
MOV A,MIN
CJNE A,#60,TT ;是否到1h?
;1HOURTIMEOUT
INC HOUR ;小时计数加1
MOV MIN,#0 ;分计数清除为0
MOV A,HOUR
CJNE A,#24,TT ;是否24h到了?
MOV SEC,#0 ;秒钟变量清0
MOV MIN,#0 ;分钟变量清0
MOV HOUR,#0 ;小时变量清0
TT:
POP ACC ;将累加器由堆栈取出
RETI ;中断返回
;=============================
; 设置当前时间
; K2:
HH K3:
MM K4:
OK
;=============================
;K2:
HH K3:
MM K4:
OK
SET_TIME:
CLR TR0 ;关定时器0
MOV SEC,#0 ;秒钟变量清0
;SCAN3KEYTOADJ...........
S0:
JB K2,S1 ;未按下K2键则继续扫描
;小时调整
LCALLBZ ;蜂鸣器发音一声
INC HOUR ;小时加1
MOV A,HOUR ;小时值放在累加器中,用于比较
CJNE A,#24,S11 ;是否24h到了?
MOV HOUR,#0 ;小时变量清0
S11:
LCALLCONV ;转换LCD显示数据
MOV R5,#20 ;
LCALLDELAY ;延时
JMP S0 ;继续程序执行
;....................
S1:
JB K3,S2 ;未按下K3键则继续扫描
;分钟调整
LCALLBZ ;蜂鸣器发音一声
INC MIN ;分钟加1
MOV A,MIN ;分钟值放在累加器中,用于比较
CJNE A,#60,S21 ;是否60min到了?
MOV MIN,#0 ;分钟变量清0
S21:
LCALLCONV ;转换LCD显示数据
MOV R5,#20 ;20*10ms
LCALLDELAY ;延时
JMP S0 ;继续程序执行
;.....................
S2:
JB K4,S0 ;未按下K4键则继续扫描
JNB K4,$ ;有键按下则等待放开
;K4KEYED OK..........
LCALLBZ ;设置完成,蜂鸣器发音两声
LCALLBZ ;
SETB TR0 ;启动定时器
RET
;=============================
; LCD第一行显示程序
;=============================
;A:
DIG X:
LCDXPOS
;SHOWONLCDLINE1
SHOW_DIG:
MOV B,#10 ;设置被除数
DIV AB ;除法运算,结果A存商数,B存余数
ADD A,#30H ;A为十位数,转换为字符
PUSH B ;B放入堆栈暂存起来
MOV B,DDRAM ;设置LCD显示的位置
LCALLLCDP1 ;由LCD显示出来
POP B ;B由堆栈取出来
MOV A,B ;B为个位数
ADD A,#30H ;转换为字符
INC DDRAM ;LCD显示位置加1
MOV B,DDRAM ;设置LCD显示位置
LCALLLCDP1 ;由LCD显示出来
RET
;=============================
; LCD第二行显示程序
;=============================
;A:
DIG X:
LCDXPOS
;SHOWONLCDLINE2
SHOW_DIG2:
MOV B,#10 ;设置被除数
DIV AB ;除法运算,结果A存商数,B存余数
ADD A,#30H ;A为十位数,转换为字符
PUSH B ;B放入堆栈暂存起来
MOV B,DDRAM ;设置LCD显示的位置
LCALLLCDP2 ;由LCD显示出来
POP B ;B由堆栈取出来
MOV A,B ;B为个位数
ADD A,#30H ;转换为字符
INC DDRAM ;LCD显示位置加1
MOV B,DDRAM ;设置LCD显示位置
LCALLLCDP2 ;由LCD显示出来
RET
;=============================
; 转换显示当前时间子程序
; 时时:
分分:
秒秒
;=============================
CONV:
;SHOWHOUR...............显示小时数据
MOV A,HOUR ;小时数据放在A中
MOV DDRAM,#0 ;设置要显示的地址
LCALLSHOW_DIG2 ;在第二行显示
INC DDRAM ;显示地址加1
MOV A,#':
' ;加载":
"
MOV B,DDRAM ;LCD显示地址放入B中
LCALLLCDP2 ;LCD第二行显示程序
;SHOWMIN...............显示分钟数据
MOV A,MIN ;分钟数据放在A中
INC DDRAM ;显示地址加1
LCALLSHOW_DIG2 ;在第二行显示
INC DDRAM ;显示地址加1
MOV A,#':
' ;加载":
"
MOV B,DDRAM ;LCD显示地址放入B中
LCALLLCDP2 ;LCD第二行显示程序
;SHOWSEC...............显示秒钟数据
MOV A,SEC ;秒钟数据放在A中
INC DDRAM ;显示地址加1
LCALLSHOW_DIG2 ;在第二行显示
RET
;****************************
; LCD初始化设置程序
; 并测试
;****************************
SET_LCD:
LCALLINIT_LCD ;初始化LCD
MOV R5,#10 ;10*10ms
LCALLDELAY ;延迟一下
MOV DPTR,#LMESS1 ;指