;1602-LCD液晶屏红外遥控音量汇编代码 ;Lxa0最后修改于2011-2-18-V1.0 ;本代码晶体为6000KHz ;本代码适用红外遥控芯片M50462AP手柄 ;颜色为时调整、亮度为分调整、选台为周调整 ;音量和静音不变、关机为备用 RS EQU p2.0 ;定义液晶接口 RW EQU p2.1 E EQU p2.2 BG EQU p2.3 org 0000h ljmp mm org 000bh ljmp ttxx org 0013h ljmp tt1 ;主程序********************************************************* 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 ;读红外、解码、动作标志位占用 mov 21h,#00h ;动作指令码占用 mov 22h,#00h ;备用 mov 23h,#00h ;备用 mov 24h,#00h ;Vol占用 mov 25h,#07h ;周 mov 26h,#15h ;备用 mov 27h,#01h ;备用 mov 28h,#00h ;100mS 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 zh lcall xsz lcall dz lcall xsz lcall ccc sjmp m0 ;显示xsz子程序<占用区0>******************************************** org 0200h xsz:nop push dph ;保护现场 push dpl push acc push psw mov p0,#89h ;设置秒个位地址 lcall wcom mov a,2ah ;取秒个位数据 add a,#30h mov p0,a ;送出显示 lcall wdat mov p0,#88h ;设置秒十位地址 lcall wcom mov a,2bh ;取秒十位数据 add a,#30h mov p0,a ;送出显示 lcall wdat mov p0,#86h ;设置分个位地址 lcall wcom mov a,2ch ;取分个位数据 add a,#30h mov p0,a ;送出显示 lcall wdat mov p0,#85h ;设置分十位地址 lcall wcom mov a,2dh ;取分十位数据 add a,#30h mov p0,a ;送出显示 lcall wdat mov p0,#83h ;设置时个位地址 lcall wcom mov a,2eh ;取时个位数据 add a,#30h mov p0,a ;送出显示 lcall wdat mov p0,#82h ;设置时十位地址 lcall wcom mov a,2fh ;取时十位数据 add a,#30h mov p0,a ;送出显示 lcall wdat mov p0,#8dh ;设置周地址 lcall wcom mov p0,25h ;取星期字符代码 lcall wdat pop psw ;恢复现场 pop acc pop dpl pop dph ret ;返回 ;以下是建立自定义CGRAM字符库子程序********************************* org 0020h cgwr:nop mov p0,#40h ;设置CGRAM首地址 lcall wcom mov r2,#64 ;设置周1~周日共8X8=64个代码 mov r3,#00h mov dptr,#cgtab1 ;设置字符代码表首地址 cgwr11:mov a,r3 movc a,@a+dptr ;取字符代码 mov p0,a lcall wdat 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" : : < > ",00H table2: db" VoL=+10dB Lxa ",00H org 00a0h wcom:CLR RS ;送命令 CLR RW CLR E lCALL delay SETB E RET wdat:SETB RS ;送显示数据 CLR RW CLR E lCALL delay SETB E RET xsz11:push dph push dpl push acc push psw clr psw.3 ;进入第0组工作寄存器 clr psw.4 mov r1,#00h A1:mov a,r1 MOVC A,@A+DPTR ;到table取码 mov p0,a lcall wdat ;显示到lcd INC r1 CJNE A,#0,A1 ;是否到00h pop psw pop acc pop dpl pop dph RET delay: 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 ; T0定时子程序<占区0>************************************************ org 0280h 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,#05h,tt22 ;刷新100mS五次 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,tt22 mov 25h,#01h sjmp tt22 ;tt1 T1读红外代码子程序<占用区2 >******************************* org 0300h 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 01h ;设读取完成与允许转换标志位 clr ex1 ;关外部中断1 clr tr1 ;关T1中断 clr 00h ;恢复接收标致位 t3:pop psw pop acc pop dpl pop dph reti ;zh转换子程序<占用区1>********************************************* org 0380h zh: push dph ;将识别后的遥控信号转换成16位动作代码 push dpl push acc push psw setb psw.3 ;进入区i clr psw.4 jb 00h,h01 jb 02h,h01 jb 01h,h0 ;允许转换否? sjmp h01 h0: inc r0 ;取第一组第一位 cjne r0,#51h,h1 ;是否干扰? sjmp h00 ;是则返回 h1: jc h2 sjmp h00 h2:cjne @r0,#03h,h0 ;开始转换第一组第一位 inc r0 cjne @r0,#03h,h0 inc r0 cjne @r0,#03h,h0 inc r0 cjne @r0,#01h,h0 inc r0 cjne @r0,#01h,h0 inc r0 cjne @r0,#01h,h0 inc r0 cjne @r0,#03h,h0 inc r0 cjne @r0,#01h,h0 cjne r0,#59h,h3 ;地址码正确否? sjmp h00 h3: jc h4 sjmp h00 h4:inc r0 ;开始转换指令码 mov a,@r0 jb acc.1,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 ;清除允许转换标志位 h00:setb 07h mov 08h,#2fh mov 09h,#07h ;8位一小组 h01:pop psw pop acc pop dpl pop dph ret ;dz动作子程序<不占区>********************************************** org 0400h dz: push dph ;执行相应的动作 push dpl push acc push psw 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 07h ;设置动作完成标志 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:cjne a,#01h,dz52 mov 2fh,#0 mov 2eh,#0 sjmp d00 dz52:dec 2eh sjmp d00 dz51:mov a,2eh cjne a,#00h,dz52 dec 2fh mov 2eh,#09h sjmp d00 dz6:;mov a,21h ;刷新周数据 cjne a,#50h,dz7 inc 25h mov a,25h cjne a,#08h,d00 mov 25h,#01h sjmp d00 dz7:;mov a,21h cjne a,#40h,d00 cpl p2.3 sjmp d00 ;dz8:mov a,21h ;cjne a,#44h,dz9 ;是音量增加否? ;dz9:mov a,21h ;cjne a,#54h,d00 ;动作完成后清除30h~5fh单元(占用区iii)*************************************************** org 0500h ccc:push dph ;执行总体清除动作 push dpl push acc push psw ;保护现场 setb psw.4 ;进区3 setb psw.3 jb 07h,qq3 pop psw pop acc pop dpl pop dph ret qq1:setb ex1 mov 08h,#2fh mov 09h,#07h mov 10h,#30h mov 11h,#2fh mov 20h,#00h mov 21h,#00h pop psw pop acc pop dpl pop dph ret qq3:mov r0,#30h qq2:mov @r0,#00h inc r0 cjne r0,#60,qq2 sjmp qq1 end ;CGRAM的首地址为40h。 ;DDRAM的首地址为80h。 ;E端子应该是H为使能。 ;BF为低电平表示忙就循环等待。