📄 rmbscr.asm
字号:
;** 人民币汇率屏程序 *************************************************
r2864dph equ 20h ;2864 DPTR保存单元
r2864dpl equ 21h
ledydph equ 22h ;LED DPTR保存单元
ledydpl equ 23h
ledlight equ 24h ;一行LED点亮延时时间
leddark equ 25h ;一行LED熄灭延时时间
ddotflash equ 26h ;秒闪标志: 00h--亮, 0ffh--黑
t0times equ 27h ;T0中断次数
int1times equ 28h ;INT1中断次数
numchar equ 29h ;当前修改字符在块中的顺序号
data4 equ 2ah
data3 equ 2bh
data2 equ 2ch
data1 equ 2dh
data0 equ 2eh
manualtime equ 2fh
minute equ 30h ;分
hour equ 31h ;时
week equ 32h ;星期
day equ 33h ;日
month equ 34h ;月
year equ 35h ;年
yearh equ 36h ;年高位
modify equ 37h ;遥控修改标志: 00h--正常显示状态,0ffh--修改状态
flashmark equ 38h ;显示闪烁标志: 00h--亮; 0ffh--暗
adjtime equ 39h ;时间校准标志: 00h--未处于时间校准状态, 0ffh--处于时间校准状态
switch equ 3ah ;定时开关机标志: 00h--处于开机状态, 0ffh--处于关机状态
modiline equ 3bh ;修改数据所在行数
modicolu equ 3ch ;修改数据所在列数
modi2864l equ 3dh ;修改数据所在2864单元地址(低位)
modi2864h equ 3eh ;修改数据所在2864单元地址(高位)
coderam0 equ 40h ;输入遥控码1
coderam1 equ 41h ;输入遥控码2
coderam2 equ 42h ;输入遥控码3
coderam3 equ 43h ;输入遥控码4
tmp0 equ 48h ;临时单元
tmp1 equ 49h ;临时单元
tmp2 equ 4ah ;临时单元
tmp3 equ 4bh ;临时单元
tmp4 equ 4ch ;临时单元
tmp5 equ 4dh ;临时单元
tmp6 equ 4eh ;临时单元
tmp7 equ 4fh ;临时单元
tmp8 equ 50h ;临时单元
tmp9 equ 51h ;临时单元
tmpa equ 52h ;临时单元
tmpb equ 53h ;临时单元
tmpc equ 54h ;临时单元
tmpd equ 55h ;临时单元
tmpe equ 56h ;临时单元
tmpf equ 57h ;临时单元
tmpth1 equ 58h
tmptl1 equ 59h
ram2864add equ 6000h ;2864起始地址
ledadd equ 0ff00h ;LED 列起始地址
usercode equ 00h ;用户码
code0 equ 10h ;"0"的遥控码
code1 equ 0c0h ;"1"的遥控码
code2 equ 18h ;"2"的遥控码
code3 equ 60h ;"3"的遥控码
code4 equ 0e0h ;"4"的遥控码
code5 equ 20h ;"5"的遥控码
code6 equ 08h ;"6"的遥控码
code7 equ 0f0h ;"7"的遥控码
code8 equ 28h ;"8"的遥控码
code9 equ 38h ;"9"的遥控码
codedot equ 78h ;"."的遥控码
codedark equ 50h ;dark
codeleft equ 30h ;"←"的遥控码
coderight equ 58h ;"→"的遥控码
codeup equ 70h ;"↑"的遥控码
codedown equ 0b8h ;"↓"的遥控码
codestart equ 80h ;"复位"的遥控码
codeltinc equ 0b0h ;"亮度调整+"的遥控码
codeltdec equ 98h ;"亮度调整-"的遥控码
codetime equ 0d8h ;"时间校准"的遥控码
codeonoff equ 00h ;"开/关机"的遥控码
;*********************************************************************
org 0000h
ljmp 0100h
org 0003h
ljmp timeint
org 000bh
ljmp timer0
org 0013h
ljmp remote
org 001bh
ljmp timer1
;*********************** 人民币汇率显示屏程序 ************************
;*********************************************************************
;** INIT: 程序初始化 *************************************************
org 0100h
init: mov sp,#60h
mov psw,#0
mov ie,#00001010b ;允许T0,T1,EX0,EX1中断
mov ip,#00000100b ;EX1为最高级中断
mov tcon,#00000101b ;设置EX0,EX1为负沿触发
mov tmod,#00010001b ;T0,T1为定时方式1
setb p1.4 ;禁止行译码
mov modify,#00h ;遥控修改标志: 00h--正常显示状态, 0ffh--修改状态
mov flashmark,#00h ;显示闪烁标志: 00h--亮, 0ffh--暗
mov modiline,#0 ;修改数据所在行数--0行
mov modicolu,#0 ;修改数据所在列数--0列
mov ledlight,#130 ;初始化LED 亮延时--2ms
mov leddark,#75 ;初始化LED 暗延时--0.9ms(+0.5ms)
mov adjtime,#00h
mov t0times,#0 ;初始化T0中断次数
mov int1times,#0 ;初始化INT1中断次数
mov numchar,#0 ;当前修改字符在块中的顺序号置0
mov switch,#00 ;开机
mov manualtime,#00h
mov coderam0,#0
mov coderam1,#0
mov coderam2,#0
mov coderam3,#0
mov dptr,#800ah ;初始化12887寄存器A,B
mov a,#00101111b ;打开12887晶振,允许周期中断
movx @dptr,a
inc dptr
mov a,#01100010b ;允许周期中断,每分钟定闹中断,24小时模式,BCD码
movx @dptr,a
mov dptr,#8001h ;每分钟产生1次定闹中断
mov a,#0
movx @dptr,a
mov a,#0ffh
inc dptr
inc dptr
movx @dptr,a
inc dptr
inc dptr
movx @dptr,a
mov dptr,#800ch ;读寄存器C
movx a,@dptr
lcall readtime
lcall disptime
setb ea ;开中断
setb ex0
setb ex1
;** DISPLAYLED: 显示有关数据 *****************************************
displayled: mov dptr,#ram2864add ;2864初始地址
mov r2864dph,dph
mov r2864dpl,dpl
setb p1.4
anl p1,#11110000b ;行译码初始地址
mov r6,#0 ;初始化当前显示的块数
mov r7,#0 ;初始化当前显示的行数
mov r3,#11 ;总显示行数--11行
showled0: mov dptr,#ledadd ;列译码初始地址
mov ledydph,dph
mov ledydpl,dpl
mov r4,#3 ;显示块数--3块
showled1: mov r5,#5 ;显示列数,每块5列
if_modify: mov a,modify ;是否处于修改状态
cjne a,#00h,modidata
ljmp displed0 ;处于正常显示状态
modidata: mov a,adjtime ;是否处于时间校准状态
cjne a,#00h,displed0
mov a,r7 ;修改数据
cjne a,modiline,displed0 ;当前行是否闪烁行
mov a,r6
cjne a,modicolu,displed0 ;当前列是否闪烁列
mov a,numchar
cjne a,#0,getmodidata
mov a,r5
cjne a,#1,displed0
mov a,flashmark
cjne a,#0ffh,displed0 ;比较闪烁标志
mov a,#01h
ljmp modidptr
getmodidata: mov a,r5
cjne a,#5,ifmoda1
mov a,data4
ljmp modidptr
ifmoda1: cjne a,#4,ifmoda2
mov a,data3
ljmp modidptr
ifmoda2: cjne a,#3,ifmoda3
mov a,data2
ljmp modidptr
ifmoda3: cjne a,#2,moda4
mov a,data1
ljmp modidptr
moda4: mov a,flashmark
cjne a,#00h,datadark
mov a,data0
ljmp modidptr
datadark: mov a,#01h
modidptr: mov dph,r2864dph ;2864数据送显
mov dpl,r2864dpl
inc dptr
mov r2864dph,dph ;保存2864的DPTR
mov r2864dpl,dpl
ljmp displed1
displed0: mov dph,r2864dph ;2864数据送显
mov dpl,r2864dpl
movx a,@dptr
inc dpl
mov r2864dph,dph ;保存2864的DPTR
mov r2864dpl,dpl
displed1: mov dph,ledydph
mov dpl,ledydpl
movx @dptr,a
inc dpl
mov ledydph,dph ;保存LED的DPTR
mov ledydpl,dpl
djnz r5,jmpif_modify ;是否1块已送数完毕
ljmp end_colu
jmpif_modify: ljmp if_modify
end_colu: inc r6 ;块数加1
inc dptr ;修改下一块LED的DPTR
inc dptr
inc dptr
mov ledydph,dph ;保存LED的DPTR
mov ledydpl,dpl
djnz r4,jmpshowled1 ;是否一行已送数完毕
ljmp oeline
jmpshowled1: ljmp showled1
oeline: lcall darkdelay
no_darkled: clr p1.4 ;行译码选通,点亮LED
lcall lightdelay ;亮延时
setb p1.4 ;熄灭LED
inc p1 ;行地址指向下一行
mov r6,#0
inc r7 ;行数加1
djnz r3,jmpshowled0
ljmp checkswitch
jmpshowled0: ljmp showled0
checkswitch: mov a,switch
cjne a,#00h,offled
setb p3.1
nop
clr p3.1
ljmp displayled
offled: clr p1.7
setb p1.4
clr p3.1
mov r1,#13 ;off time
mov r0,#tmp0
mov a,#0ah
offtimedata: mov @r0,a
inc r0
djnz r1,offtimedata
mov r1,#13
mov r0,#tmp0
offtime: mov a,@r0
lcall shiftbit
inc r0
djnz r1,offtime
setb p3.1
mov a,switch
cjne a,#00h,offled
lcall readtime
lcall disptime
ljmp displayled
;** DARKDELAY: 亮度调节子程序--LED熄灭********************************
;** 入口参数: leddark--亮度调节参数,在遥控中断中设置 *****************
darkdelay: mov 47h,leddark
mov a,47h
cjne a,#0,darkloop
ret
darkloop: nop ;10us延时
nop
nop
nop
djnz 47h,darkloop
ret
;** LIGHTDELAY: 亮度调节子程序--LED点亮 ******************************
;** 入口参数: ledlight--亮度调节参数,在遥控中断中设置 ****************
lightdelay: mov r0,ledlight
lightloop: nop ;10us延时
nop
nop
nop
djnz r0,lightloop
ret
;** TIMER0: 定时器0中断--400ms中断一次,确定闪烁频率*******************
timer0: push acc
push dph
push dpl
mov th0,#94h
mov tl0,#94h
mov a,t0times
cjne a,#10,midtime
mov t0times,#0
mov a,flashmark
cjne a,#00h,rstflash
mov flashmark,#0ffh
ljmp exittimer0
rstflash: mov flashmark,#00h
ljmp exittimer0
midtime: inc t0times
exittimer0: pop dpl
pop dph
pop acc
reti
;** TIMEINT: 时钟中断程序 ********************************************
timeint: push acc ;保护现场
push psw
push dph
push dpl
push b
setb rs0 ;选择寄存器区1
clr rs1
mov dptr,#800ch ;读寄存器C
movx a,@dptr
mov r7,a
mov a,adjtime
cjne a,#0ffh,no_adjust
ljmp renewtime
no_adjust: lcall readtime
mov a,hour ;是否6:30分(开机时间)
cjne a,#06h,if_21h
mov a,minute
cjne a,#30h,next
mov switch,#00h
ljmp next
if_21h: cjne a,#21h,next
mov a,minute
cjne a,#30h,next
mov switch,#0ffh
next: mov a,switch
cjne a,#0ffh,next1
ljmp exitclock
next1: mov a,r7
jnb acc.5,cycleint ;判断是定闹中断还是周期中断
jnb acc.6,renewtime ;是否还有周期(500ms)中断
lcall flashdot ;秒闪
renewtime: lcall disptime ;时间,日期更新
ljmp exitclock
cycleint: lcall flashdot ;秒闪
exitclock: pop b
pop dpl
pop dph
pop psw
pop acc
reti
;** flashdot: 秒闪子程序 *********************************************
flashdot: mov a,ddotflash
cjne a,#00h,dotdark
mov ddotflash,#0ffh
setb p1.7
ret
dotdark: mov ddotflash,#00h
clr p1.7
ret
;** DISPTIME: 时间显示子程序 *****************************************
disptime: mov a,week
cjne a,#7,no_sunday ;是否星期日
mov week,#8
no_sunday: mov a,year
cjne a,#97h,if_2000 ;是否21世纪
cen21s: mov yearh,#20h
ljmp changebcd
if_2000: jc cen21s
mov yearh,#19h
changebcd: mov a,minute ;分钟压缩bcd码转换成bcd码
mov r0,#tmp0
lcall cbcd_bcd
mov a,hour ;小时压缩bcd码转换成bcd码
lcall cbcd_bcd
mov a,week
mov @r0,a
inc r0
mov a,day ;日期压缩bcd码转换成bcd码
lcall cbcd_bcd
mov a,month ;月份压缩bcd码转换成bcd码
lcall cbcd_bcd
mov a,year ;年压缩bcd码转换成bcd码
lcall cbcd_bcd
mov a,yearh ;年高位压缩bcd码转换成bcd码
lcall cbcd_bcd
mov a,adjtime
cjne a,#0ffh,nordisp ;是否处于调整状态
mov a,ddotflash
cjne a,#0ffh,ledladj
mov ddotflash,#0
mov a,modicolu
cjne a,#0,if_tcolu1
mov tmpa,#0ah ;年份闪烁
mov tmp9,#0ah
ljmp nordisp
if_tcolu1: cjne a,#1,if_tcolu2
mov tmp8,#0ah ;月份闪烁
mov tmp7,#0ah
ljmp nordisp
if_tcolu2: cjne a,#2,if_tcolu3
mov tmp6,#0ah ;日期闪烁
mov tmp5,#0ah
ljmp nordisp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -