定时闹铃LCDWord文件下载.docx
《定时闹铃LCDWord文件下载.docx》由会员分享,可在线阅读,更多相关《定时闹铃LCDWord文件下载.docx(29页珍藏版)》请在冰豆网上搜索。
N
Y
程序清单
引脚定义
K1:
ADJTIMEK2:
HOURK3:
MINK4:
OK
;
定时器0及时中断程序每隔5ms中断一次
MOVTL0,#(8192-5000).MOD.32
MOVTH0,#(8192-5000)/32
LOEQU24
HIEQU99
COEQU200;
5ms中断计数时间常数,计数200次表示1s
ALBEQU20H.0;
闹钟设置标志
HOUREQU30H;
存放小时变量
MINEQU31H;
存放分钟变量
SECEQU32H;
存放秒钟变量
DEDAEQU33H;
5ms计数器
SECOEQU34H;
存放旧的秒数
XEQU35H;
LCD位置变量
HHEQU36H;
加载低字节
MMEQU37H;
加载高字节
KEY4
K1EQUP2.4;
按键1引脚定义
K2EQUP2.5;
按键2引脚定义
K3EQUP2.6;
按键3引脚定义
K4EQUP2.7;
按键4引脚定义
LCD控制信号引脚定义
RSEQUP0.0;
LCDRS引脚定义
ENEQUP0.1;
LCDEN引脚定义
SPKEQUP3.4;
压电喇叭信号
WLEDEQUP3.7;
工作指示灯引脚定义
ORG0H;
程序代码由地址0开始执行
JMPSTART
ORG0BH;
定时器0中断地址设置
JMPT0_INT
START:
CLREN;
LCDOFF
CLRALB;
消除闹铃标志
MOVHH,#1;
内定闹铃时间为1h
MOVMM,#I;
内定闹铃时间为1min
CALLSET_LCD;
LCD初始化
CALLBZ
CALLLED_BL;
LCD闪动,表示程序开始执行
CALLINIT;
初始变量
CALLINIT_TIMER;
初始化定时器
CALLMENU
按键扫描子程序
LOOP:
;
无穷循环
CALLTIME_PRO;
时间计时处理
TESTKEY
JBK1,L1;
未按下K1键则继续扫描
K1KEYED..........
CALLBZ
MOVDPTR,#MADJ;
显示执行消息
MOVA,#1
CALLLCD_PRINT
CALLSET_TIME;
设置目前时间
JMPLOOP
L1:
JBK2,L2;
未按下K2键则继续扫描
K2KEYED
CALLBZ
MOVDPTR,#MLAL;
MOVA,#1
CALLLOOK_ATIME;
显示闹铃时间
CALLLED_BL
L2:
JBK3,L3;
未按下K3键则继续扫描
JNBK3,$;
等K3键放开
K3KEYED
MOVDPTR,#MAADJ
CALLLED_PRINT
CALLSET_ATIME;
设置闹铃时间
CALLMENU
JMPLOOP
L3:
JBK4,L4;
未按下K4键则继续扫描
K4KEYEDALARMALBON/OFF
CPLALB
JNBALB,L31
ALARMON;
闹铃启动
CALLBZ
L31:
ALARMOFF;
闹铃未启动发出一声响
L4:
LMESSI1:
DB"
PCLLIO51CLCOK"
0
LMESSI2:
TIME:
"
TITLE:
PCLL.ASM8051CLOCKWITHLCDCKWITHLCD+ALARM+BZ"
初始化程序
INIT:
初始化控制变量
MOVDEDA,#0;
5ms计数器清除为0
MOVSECO,#0;
旧的秒数清除为0
MOVSEC,#0;
秒的变量清除为0
MOVMIN,#0;
分钟变量清除为0
MOVHOUR,#0;
小时变量清除为0
RET
INT_TIME:
初始化定时器接口,使用定时器0模式0计时
MOVTMOD,#00000000B;
设置定时器0工作模式为0
MOVIE,#10000010B;
启动定时器0中断产生
MOVTL0,#LO;
MOVTHO,#H1;
SETBTR0;
启动定时器0开始计时
RET
计时程序
USETIMERMODE0
COUNT=5ms/0.001ms=5000
T0_INT:
定时器0中断程序每隔5ms中断一次
PUSHACC;
将累加器放入堆栈
MOVTL0,#L0;
MOVTH0,#H1;
加载高字节
INCDEDA;
5s计数值加1
1SECTIMEOUTCHECK
MOVA,DEDA
CJNEA,#CO,TT;
一秒是否到了
MOVDEDA,#0;
计数值清除为0
CPLWLED;
LED灯亮灭变换
INCSEC;
秒计数加1
MOVA,SEC
CJNEA,#60,TT;
是否1min到了?
1MINTIMEOUT
INCMIN;
分计数加1
MOVSEC,#0;
秒计数清零
MOVA,MIN
是否1h到了?
1HOURTIMEOUT
INCHOUR;
小时计数加1
MOVMIN,#0;
分计数清零
MOVA,HOUR
CJNEA#24,TT;
是否24h到了?
秒钟变量清除为0
MOVHOUR,#0;
小时变量清除为0
TT:
POPACC;
将累加器由堆栈取出
RETI
K2:
HHK3:
MMK4:
OK;
SET_TIME
CLRTRO;
定时器动作暂停
Movsec,#0;
;
SCAN3KEYTOADJ;
。
SO:
JBK2,S1;
未按下K2键继续扫描
K1KEYEDADJHH。
小时调整
CALLBZ;
发出哔的一声
小事计数加1
MOVA,HOUR
CJNEA,#24,S11;
是否24小时到了?
MOVHOUR,#0;
小时变量清除为零
S11
CALLCONV;
转换数据至LCD
MOVR5,#20;
延迟一下
CALLDELAY
JMPS0;
继续程序执行
……………………
S1:
JBK3,S2;
未按下K3键则继续扫描
K2KEYEDADJMM…………..;
分钟调整
CALLBZ
分钟计数器加1
CJNEA,#60S21;
是否60min到了?
MOVMIN,#0;
分计数器清0
S21:
转换显示数据到LCD
MOVR5,#20;
CALLDELA;
JMPSO;
继续执行
……………..
S2:
JBK4,SO;
JNBK4,S;
有按下则等待放开
K3KEYEDOK…..;
设置完成
SETBTRO;
启动定时器
………………
A:
DIGX:
LCDXPOS;
在LCD第一行显示数字
SHOWONLCDLINE1
SHOW_DIG:
MOVB,#10;
设置被除数
DIVAB;
除法运算,结果A存除数,B存余数
ADDA,#30H;
A为十进制,转换为字符
PUSHB;
B放入堆栈暂存
MOVB,X;
设置LCD显示的位置
CALLLCDP1;
由LCD显示出来
POPB;
B有堆栈取出来
MOVA,B;
B为个位数
转换为字符
INCX;
LCD显示位置加1
MOVB,X;
设置LCD显示位置
LCDXPOS
SHOW_DIG2:
MOVB,#10
DIVAB
ADDA,#30H
INCX
MOVB,X
CALLLCDP2
显示现在的时间时时:
分分:
秒秒数据
;
CONVERTTOASCIIANDSHOW
CONV:
SHOWHOUR…..;
显示小时数
MOVA,HOUR
MOVX,#5
CALLSHOW_DIG2
INCX
MOVA,#’:
’
SHOWMIN…………….;
显示分钟数据
MOVA,MIN
CALLSHOW_DIG2
MOVB,X
SHOWSEC……………….;
显示时间秒数
MOVA,SEC
INIT_LCD1:
LCD控制指令初始化
MOVA,#28H;
双行显示,字符使用5*7点阵
CALLWCOM
MOVA,#0CH;
光标出现,不闪烁
CALLWCOM
MOVA,#0EH;
每向右移动一位,显示屏不移动
MOVA#01H;
清除LCD显示屏
-----------------------------------
CLR_LINE1;
清除LCD的第一行字符
MOVA,#80H;
设置第一行地址
MOVR0,#24;
设置计数器
C1:
MOVA,#’’;
载入空格符至LCD
CALLWDATA;
输出字符至LCD
DJNZR0,C1;
计数结束
--------------------------------
A=LIEN1OR2;
在LCD的第一行或第二行显示字符
DPTR=MESSAGEPOINTER
LCD_PRINT:
CJNEA,#1,LINE2;
判断是否是第一行
LINE1:
MOVA,#80H;
设置LCD的第一行地址
CALLWCOM;
写入命令
CALLCLR_LINE;
清除该行字符数据
JMPFILL
LINE2:
MOVA,#OCOH
CALLCLR_LINE
MOVA,#OCOH
FILL:
填入字符
CLRA
MOVCA,@A+DPTR;
由消息区取出字符
CJNEA#0,LC1;
判断是否是结束码
LC1:
写入数据
INCDPTR;
指针加1
JMPFILL;
继续填入字符
CLR_LINE:
清除该行LCD字符
MOVR0,#24
CL1:
MOVA,#’’
CALLWDATA
DJNZR0,CL1
--------------------------------
DE:
MOVR7,#5;
短暂延时
DJNZR7,#5
DJNZR7,$
-------------------------
EN1:
短脉冲产生启用信号
SETBEN
CALLDE
CLREN
INIT_LCD:
4位I/O控制LCD接口初始化
MOVPO,#30H;
RS=0R/W=0D7~D4=0011
CALLEN1
MOVPO,#30H
CALLEN1
MOCPO,#30H
MOVPO,#20H;
启动4位接口指令
CALLINIT_LCD1;
LCD指令设置初始化
-----------------------
WCOM:
以4位控制方式将命令写至LCD
WRITEHI4BIT;
写入高4位数据
MOVPO,A
CLRRS;
设置写入命令
RLCA;
左移4位
RLCA
WRITELO4BIT;
写入低4位
MOVPO,A
CLRRS;
SETCOMMAN;
WDATA:
以4位控制方式将数据写入LCD
WRITEHO4BIT;
MOVPO,A
SETBRS;
设置写入数据
WRITELO4BIT
PRINTACHARONLCDLINE1
A=ASCDATA
B=LINEXPOS.
LCDP1:
在第一行显示字符
LINE1
将A放入堆栈
MOVA,B;
设置现实的地址
ADDA,#80H;
设置LCD第一行地址
由堆栈取出A
PRINTACHARONLCDLINE2
LCDP2:
PUSHACC
MOVEA,B
ADDA,#0C0H
POPACC
DELAYR5*10ms;
延迟子程序
DELAY:
总延迟时间R5*10ms
MOVR6,#50
D1:
MOVR7,#100
DJNZR6,D1
DJNZR5,DELAY
LED_BL;
工作指示灯闪烁
MOVR4,#4
LEO:
CPLWLED;
位相反
MOVR5,#10;
延迟100ms
CALLDELAY
DJNZR4,LE0
MMENU:
DB"
1-SET2-AL3-SAL"
0;
LCD显示数据
MADJ:
HK3:
MK4:
OK"
MLAL:
NOWALARMTIME:
"
MAADJ:
K2K3:
MENU:
LCD显示菜单
MOVDPTR,#MMENU
MOVA,#1
CALLLCD_PRINT
BZ:
压电喇叭发出哗的一声
MOVR6,#0
BI:
CALLDEX
CPL,SPK
DJNZR6,B1
MOVR5,#10
DEX:
MOVR7,#180;
短暂延迟
DE1:
NOP
DJNZR7,DE1
LOOKALARMTIME;
查看已设置的闹钟时间
LOOK_ATIME:
SHOWHOUR.............;
显示小时数
MOVA,HH
MOVX,#5
MOVA,#'
:
'
MOVB,X
SHOWMIN.........;
显示分钟数
MOVA,MM
CALLSOW_DIG2
INC.X
CALLLCDP2
SHOWSEC………………..;
显示秒钟数为0
MOVA,#0
闹钟时间设置
显示闹钟时间
SET_ATIME:
CALLLOOK_ATIME;
加载闹钟时间数据
SCEAN3KEYTOADJ………………….
ASO:
JBK2,AS1;
未按下K2继续扫描
K1KEYEDADJHH…….;
调整小时
INCHH
CJNEA,#24,AS11;
MOVHH,#0;
小时清零
AS11:
CALLLOOK_ATIME;
加载闹钟数据到LCD
MOVR5,#20;
CALLDELAY
JMPASO
………………………………………………..
AS1:
JBK3,AS2
K2KEYEDADJMM…….
INCMM
CJNEA,#60,AS21
MOVMM,#0
AS21:
CALLLOOK_ATIME
MOVR5,#20
JMPASO
……………………………………………………….
AS2:
JBK4,AS0;
JNBK4,$;
灯K4键放开
K3KEYEDOK………………………….
--------------------------------------------------------
JBALB,TI3
RET
TI:
CHECKALARM…………………..;
检查闹钟时间是否到了
MOVA,HOUR
MOVB,HH
CJNEA,B,BK;
检查闹钟小时时间
MOVA,MIN
MOVB,MM
检查闹钟分钟时间
TIMEMATCH……………………..
CALLTIME_OUT;
执行检查闹钟时间到了处理
BK:
----------------------------------------------------
TIME_OUT:
所设时间到了
M1:
CALLLED_BL;
LED闪动
KEY4STOP……………….
JBK4,M1;
等待是否按下K4键
JNBK4,$;
CALLLED_BL;
清除闹铃位
---------------------------------------------------------
END
英文:
89c51
PinDescription
VCC
Supplyvoltage.
GND
Ground.
Port0
Port0isan8-bitopendrainbidirectionalI/Oport.Asan
outputporteachpincansinkeightTTLinputs.When1s
arewrittentoport0pins,thepinscanbeusedashighimpedance
inputs.
Port0mayalsob