带LCD的时间控制器.docx

上传人:b****5 文档编号:12304460 上传时间:2023-04-18 格式:DOCX 页数:27 大小:37.23KB
下载 相关 举报
带LCD的时间控制器.docx_第1页
第1页 / 共27页
带LCD的时间控制器.docx_第2页
第2页 / 共27页
带LCD的时间控制器.docx_第3页
第3页 / 共27页
带LCD的时间控制器.docx_第4页
第4页 / 共27页
带LCD的时间控制器.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

带LCD的时间控制器.docx

《带LCD的时间控制器.docx》由会员分享,可在线阅读,更多相关《带LCD的时间控制器.docx(27页珍藏版)》请在冰豆网上搜索。

带LCD的时间控制器.docx

带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  ;指

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 少儿英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1