|
这是一款红外遥控液晶显示智能数字钟,用遥控调整时间,非常方便,遥控器用的是M50462AP发射芯片的遥控器。,程序来源于网络,在这里 我把它收集整理出来,给爱好电子小制作的爱好者作参考,智能数字钟制作,是很多电子小制作爱好者都制作过的电子小制作项目,成功制作这么一件电子小制作作品,可以增强学习电子技术的信心。下面是红外遥控液晶显示智能数字钟和原理示意图各源程序:
;红外遥控液晶屏智能数字钟汇编代码
RS EQU p2.0 ;定义液晶接口
RW EQU p2.1
E EQU p2.2
com EQU 23h
dat EQU 24h
org 0000h
ljmp mm
org 000bh
ljmp ttxx
org 0013h
ljmp tt1
;显示xsz子程序<占用区0>********************************************
org 0020h
xsz:nop
push dph ;保护现场
push dpl
push acc
push psw
mov com,#93h ;设置秒个位地址
lcall wrcom
mov a,2ah ;取秒个位数据
add a,#30h
mov dat,a ;送出显示
lcall wrdat
mov com,#92h ;设置秒十位地址
lcall wrcom
mov a,2bh ;取秒十位数据
add a,#30h
mov dat,a ;送出显示
lcall wrdat
mov com,#90h ;设置分个位地址
lcall wrcom
mov a,2ch ;取分个位数据
add a,#30h
mov dat,a ;送出显示
lcall wrdat
mov com,#8fh ;设置分十位地址
lcall wrcom
mov a,2dh ;取分十位数据
add a,#30h
mov dat,a ;送出显示
lcall wrdat
mov com,#8dh ;设置时个位地址
lcall wrcom
mov a,2eh ;取时个位数据
add a,#30h
mov dat,a ;送出显示
lcall wrdat
mov com,#8ch ;设置时十位地址
lcall wrcom
mov a,2fh ;取时十位数据
add a,#30h
mov dat,a ;送出显示
lcall wrdat
mov com,#96h ;设置周地址
lcall wrcom
mov dat,25h ;取星期字符代码
lcall wrdat
mov com,#89h ;设置日个位地址
lcall wrcom
mov a,26h ;取日个位字符代码
anl a,#0fh
add a,#30h
mov dat,a ;送出显示
lcall wrdat
mov com,#88h ;设置日十位地址
lcall wrcom
mov a,26h ;取日十位字符代码
swap a
anl a,#0fh
add a,#30h
mov dat,a ;送出显示
lcall wrdat
mov com,#86h ;设置月个位地址
lcall wrcom
mov a,27h ;取月个位字符代码
anl a,#0fh
add a,#30h
mov dat,a ;送出显示
lcall wrdat
mov com,#85h ;设置月十位地址
lcall wrcom
mov a,27h ;取月十位字符代码
swap a
anl a,#0fh
add a,#30h
mov dat,a ;送出显示
lcall wrdat
pop psw ;恢复现场
pop acc
pop dpl
pop dph
ret ;返回
;主程序*********************************************************
org 0100h
mm:nop
mov th0,#03ch ;T0设初始值
mov tl0,#0b0h ;TH0=3ch,TL0=b0h
mov tmod,#91h ;T0设方式1
mov tcon,#14h ;T0设控制方式
mov ie,#86h ;设中断允许
mov ip,#04h ;设中断优先级别
mov sp,#7fh ;设堆栈入口
mov r6,#00h ;0.1秒延时用
mov r7,#00h ;0.1秒延时用
mov 08h,#2fh ;解码转换用
mov 09h,#07h ;解码转换用
mov 10h,#30h ;读红外波头存放首址
mov 11h,#2fh ;读红外波头48个
mov 20h,#00h ;动作标志位1
mov 21h,#00h ;动作标志位2
mov 22h,#00h ;备用
mov 23h,#00h ;com占用
mov 24h,#00h ;dat占用
mov 25h,#07h ;周
mov 26h,#15h ;日
mov 27h,#01h ;月
mov 28h,#00h ;50mS
mov 29h,#00h ;500mS
mov 2ah,#00h ;秒个位
mov 2bh,#00h ;秒十位
mov 2ch,#00h ;分个位
mov 2dh,#00h ;分十位
mov 2eh,#00h ;时个位
mov 2fh,#00h ;时十位
MOV p0,#01H ;清屏
lCALL wcom
MOV p0,#38H ;使用8Bits汇流排,显示2行5*7字符
lCALL wcom
MOV p0,#0CH ;显示开,光标关
lCALL wcom
MOV p0,#06H ;字符不动,光标自动右移一格
lCALL wcom
MOV p0,#80H ;第一行的开始位置
lcALL wcom
MOV DPTR,#TABLE1 ;显示
lCALL xsz11 ;到TABLE1取码
MOV p0,#0C0H ;第二行的位置
lCALL wcom
MOV DPTR,#TABLE2 ;显示
lCALL xsz11 ;到TABLE2 取码
lcall cgwr ;建立自定义CGRAM字符库
m0:nop
lcall xsz
lcall dbf
lcall zh
lcall dbf
lcall dz
lcall dbf
sjmp m0
; T0定时子程序<占区0>************************************************
org 01a0h
ttxx:mov th0,#03ch ;以下是T0刷新子程序
mov tl0,#0b0h
push dph
push dpl
push acc
push psw
clr psw.3 ;进入第0组工作寄存器
clr psw.4
inc 28h
mov a,28h
cjne a,#0ah,tt22 ;刷新10次
mov 28h,#00h
inc 29h ;延时500mS两次
mov a,29h
cjne a,#02h,tt22
mov 29h,#00h
inc 2ah ;刷新秒个位
mov a,2ah ;刷新秒十位
cjne a,#0ah,tt22
mov 2ah,#00h
inc 2bh ;刷新秒十位
mov a,2bh
cjne a,#06h,tt22
mov 2bh,#00h
inc 2ch ;刷新分个位
mov a,2ch
cjne a,#0ah,tt22
mov 2ch,#00h
inc 2dh ;刷新分十位
mov a,2dh
cjne a,#06h,tt22
mov 2dh,#00h
inc 2eh ;刷新时个位
mov a,2eh
cjne a,#0ah,tt11
mov 2eh,#00h
inc 2fh ;刷新时十位
tt22:pop psw
pop acc
pop dpl
pop dph
reti
tt11:mov a,2eh
cjne a,#04h,tt22
mov a,2fh
cjne a,#02h,tt22
mov 2eh,#00h ;到24点,时两位全清零
mov 2fh,#00h
inc 25h
mov a,25h ;刷新周数据
cjne a,#08h,tt33
mov 25h,#01h
tt33:inc 26h ;刷新日数据
mov a,26h
cjne a,#32,tt44
mov 26h,#01h
inc 27h ;刷新月数据
mov b,27h
mov a,27h
anl a,#0fh
cjne a,#03,tt55
mov a,b
anl a,#0f0h
cjne a,#10h,tt22
mov 27h,#01h
sjmp tt22
tt55:mov a,b
anl a,#0fh
cjne a,#0ah,tt22
mov a,b
anl a,#0f0h
swap a
inc a
swap a
mov 27h,a
sjmp tt22
tt44:mov a,26h
anl a,#0fh
cjne a,#0ah,tt22
mov a,26h
swap a
inc a
anl a,#0fh
swap a
mov 26h,a
sjmp tt22
;以下是建立自定义CGRAM字符库子程序*********************************
org 0280h
cgwr:nop
mov com,#40h ;设置CGRAM首地址
lcall wrcom
mov r2,#64 ;设置周1~周日共8X8=64个代码
mov r3,#00h
mov dptr,#cgtab1 ;设置字符代码表首地址
cgwr11:mov a,r3
movc a,@a+dptr ;取字符代码
mov dat,a
lcall wrdat
inc r3
djnz r2,cgwr11
ret
;以下是CGRAM数据表*************************************************
cgtab1:
db 00h,01h,02h,03h,04h,05h,06h,07h ;"空"代码=0x00h
db 00h,00h,00h,00h,0ffh,00h,00h,00h ;"一"代码=0x01h
db 00h,00h,00h,0eh,00h,0ffh,00h,00h ;"二"代码=0x02h
db 00h,00h,0ffh,00h,0eh,00h,0ffh,00h ;"三"代码=0x03h
db 00h,00h,0ffh,0f5h,0fbh,0f1h,0ffh,00h ;"四"代码=0x04h
db 00h,0feh,08h,0feh,0ah,0ah,0ffh,00h ;"五"代码=0x05h
db 00h,04h,00h,0ffh,00h,0ah,11h,00h ;"六"代码=0x06h
db 1fh,11h,11h,1fh,11h,11h,1fh,00h ;"日"代码=0x07h
;以下是字符数据表**************************************************
table1: db"2008- - : : < >",00H
table2: db" Li-xiao-an ",00H
org 0330h
wcom:CLR RS ;送命令
CLR RW
CLR E
lCALL Dbf
SETB E
RET
wdat:SETB RS ;送显示数据
CLR RW
CLR E
lCALL Dbf
SETB E
RET
xsz11:push dph
push dpl
push acc
push psw
MOV R1,#00H ;显示table中的值
A1: MOV A,R1 ;到table取码
MOVC A,@A+DPTR
mov p0,a
lcall wdat ;显示到lcd
INC R1
CJNE A,#00H,A1 ;是否到00h
pop psw
pop acc
pop dpl
pop dph
RET
Dbf: push psw
clr psw.3
clr psw.4
MOV R7,#02 ;延时0.5mS子程序
D1:MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,D1
pop psw
RET
wrcom:nop ;写指令子程序******************
push acc
clr rs
clr rw
clr e
lcall Dbf
mov p0,com
setb e
clr e
pop acc
ret
wrdat:nop ;写数据子程序******************
push acc
setb rs
clr rw
clr e
lcall Dbf
mov p0,dat
setb e
clr e
pop acc
ret
;tt1 T1读红外代码子程序<占用区2 >*******************************
org 0400h
tt1:push dph ;保护现场
push dpl
push acc
push psw
jb 01h,t3
jb 02h,t3
jb 00h,t2 ;如果收到遥控引导码则进入接收识别模式
mov th1,#00h ;清T1,为接收做准备
mov tl1,#00h
setb 00h ;设接收遥控波头准备好标志位
setb tr1 ;开T1中断
sjmp t3
t2:setb psw.4 ;进入区2
clr psw.3
mov @r0,th1
mov th1,#00h ;清T1,准备读下一位
mov tl1,#00h
inc r0
djnz r1,t3 ;全部信号接收完闭否?
mov 10h,#30h
mov 11h,#2fh
setb 27h
setb 01h ;设读取完成与允许转换标志位
clr ex1 ;关外部中断1
clr tr1 ;关T1中断
clr 00h ;恢复接收标致位
t3:pop psw
pop acc
pop dpl
pop dph
reti
;zh转换子程序<占用区1>*********************************************
org 0480h
zh: push dph ;将识别后的遥控信号转换成16位动作代码
push dpl
push acc
push psw
setb psw.3 ;进入区i
clr psw.4
mov r0,#2fh
mov r1,#07h ;8位一小组
jb 00h,h01
jb 02h,h01
jb 01h,h0 ;允许转换否?
h00:setb ex1
mov 20h,#00h
mov 21h,#00h
h01:mov 08h,#2fh
mov 09h,#07h
pop psw
pop acc
pop dpl
pop dph
ret
h0: inc r0 ;取第一组第一位
cjne r0,#50h,h1 ;是否干扰?
sjmp h2 ;是则返回
h1: jc h2
sjmp h00
h2:cjne @r0,#07h,h0 ;开始转换第一组第一位
inc r0
cjne @r0,#07h,h0
inc r0
cjne @r0,#07h,h0
inc r0
cjne @r0,#02h,h0
inc r0
cjne @r0,#02h,h0
inc r0
cjne @r0,#02h,h0
inc r0
cjne @r0,#07h,h0
inc r0
cjne @r0,#02h,h0
cjne r0,#58h,h3 ;地址码正确否?
sjmp h4
h3: jc h4
sjmp h00
h4: inc r0 ;开始转换指令码
mov a,@r0
jb acc.2,h5
clr 08h
sjmp h6
h5: setb 08h
h6: mov a,21h
rl a
mov 21h,a
djnz r1,h4 ;8位指令码转换完否?
setb 02h ;设置允许执行动作标志位
clr 01h ;清除允许转换标志位
sjmp h01
;dz动作子程序<不占区>**********************************************
org 0500h
dz: push dph ;执行相应的动作
push dpl
push acc
push psw
jb 00h,d01
jb 01h,d01
jnb 02h,d01 ;允许动作否?
mov a,21h
cjne a,#0cch,dz2 ;是分增加否?
inc 2ch
mov a,2ch
cjne a,#0ah,d00
mov 2ch,#00h
inc 2dh
mov a,2dh
cjne a,#06h,d00
mov 2dh,#00h
sjmp d00
dz2:mov a,21h ;是分减少否?
cjne a,#0dch,dz3
mov a,2ch ;分减1
cjne a,#00h,dz21
mov 2ch,#09h
mov a,2dh
cjne a,#00h,dz22
mov 2dh,#05h
sjmp d00
dz21:dec 2ch
sjmp d00
dz22:dec 2dh
d00:setb ex1 ;全部动作完成后重新打开外部中断1
mov 20h,#00h ;清除全部标志位
mov 21h,#00h ;清除已完成的动作代码
d01:pop psw
pop acc
pop dpl
pop dph
ret
dz3:mov a,21h ;是时增加否?
cjne a,#0c4h,dz5
inc 2eh
mov a,2eh
cjne a,#0ah,dz4
mov 2eh,#00h
inc 2fh
sjmp d00
dz4:mov a,2eh
cjne a,#04h,d00
mov a,2fh
cjne a,#02h,d00
mov 2eh,#00h
mov 2fh,#00h
sjmp d00
dz5:mov a,21h
cjne a,#0d4h,dz6 ;是时减少否?
mov a,2fh
cjne a,#00h,dz51
mov a,2eh
cjne a,#00h,dz50
mov 2fh,#02h ;判别小时2位均为0则强制2fh=#02h,2eh=#03h
mov 2eh,#03h
sjmp d00
dz50:dec 2eh
sjmp d00
dz51:mov a,2fh
cjne a,#02h,dz52
dz52:mov a,2eh
cjne a,#00h,dz51
dec 2fh
mov 2eh,#09h
sjmp d00
dz6:mov a,21h ;刷新周数据
cjne a,#044h,dz7
inc 25h
mov a,25h
cjne a,#08h,dz777
mov 25h,#01h
sjmp dz777
dz7:mov a,21h ;刷新月数据
cjne a,#054h,dz8
inc 27h
mov b,27h
mov a,27h
anl a,#0fh
cjne a,#03,dz71
mov a,b
anl a,#0f0h
cjne a,#10h,dz777
mov 27h,#01h
sjmp dz777
dz71:mov a,b
anl a,#0fh
cjne a,#0ah,dz777
mov a,b
anl a,#0f0h
swap a
inc a
swap a
mov 27h,a
dz777:ljmp d00
dz8:mov a,21h ;是日期增加否?
cjne a,#50h,dz9
inc 26h
mov a,26h
cjne a,#32h,dz81
mov 26h ,#01h
sjmp dz777
dz81:mov a,26h
anl a,#0fh
cjne a,#0ah,dz777
mov a,26h
swap a
inc a
anl a,#0fh
swap a
mov 26h,a
sjmp dz777
dz9:mov a,21h ;是日期减小否?
cjne a,#48h,dz777
mov a,26h
cjne a,#01h,dz91
mov 26h,#31h
sjmp dz777
dz91:mov a,26h
cjne a,#31h,dz92
dec 26h
sjmp dz777
dz92:mov a,26h
cjne a,#30h,dz93
mov 26h,#29h
sjmp dz777
dz93:mov a,26h
cjne a,#20h,dz94
mov 26h,#19h
sjmp dz777
dz94:mov a,26h
cjne a,#10h,dz95
mov 26h,#09h
sjmp dz777
dz95:dec 26h
sjmp dz777
end
;CGRAM的首地址为40h。
;DDRAM的首地址为80h。
;E端子应该是H为使能。
;BF为低电平表示忙就循环等待。
总之,这款红外遥控液晶显示智能数字钟,用遥控调整时间,非常方便。
|
评分
-
查看全部评分
|