;倚天版用户:
飞扬工作室吴涛友情提供的倚天版套件演示遥控液晶!
按遥控器液晶将显示遥控器键值:非常感谢吴涛的热心支持!以下是它的来信: 51c51,您好! 我是湖北省枝江市你们倚天板的客户,请尽快告知如何解决不能访问外部存储器的问题。 除了这个问题外,倚天板其他地方可以说很完美,我写出了第一个程序:检测并在LCD上 显示红外线遥控器的按键值,以方便在程序中使用家用VCD等其它未知键值的遥控器。 此程序可能有一点实用价值,为了表示对你们的支持,现附上源程序,如果你们认为还 行,可以将它放到贵站上公布。 我一直是做PC软件开发的,最近刚刚转到单片机这一块来,希望和你们交一个朋友,以 后能够有和你们合作的机会(软硬结合,呵呵)。 致 礼! 飞扬工作室 吴涛 efly@vip.163.com 2003-11-16 ;*************************************************************************** ;* (程序转载请著明出处 ,未声明可适应本站腾龙/isp开发套件/倚天版开发套件
* ;* E-mail:sxj1974@163.com (51c51 test web) 51单片机学习网,自学单片机的网站
* ;* Create by :石学军 RS_PIN equ p3.0 RW_PIN equ p3.1 E_PIN equ p3.5 PIN_6221 equ p3.7
XPOS equ 07eh YPOS equ 07fh
;------------------------------------------
using 0
org 0000H jmp start
code_str: db "Key code: ", 0 wait_str: db "Please press key...", 0
start: lcall clear_screen mov dptr, #wait_str lcall showtext
begin: mov p3, #0ffH jnb PIN_6221, $ ;等待遥控信号出现 mov r6, #10 sb: lcall ys1 ;调用882微秒延时子程序 jb PIN_6221, begin ;延时882微秒后判断PIN_6221脚是否出现高电平如果有就退出解码程序 djnz r6, sb ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序 ;以上完成对遥控信号的9000微秒的初始低电平信号的识别。 jnb PIN_6221, $ ;等待高电平避开9毫秒低电平引导脉冲 lcall ys2 ;延时4.74毫秒避开4.5毫秒的结果码 mov r1, #30H ;设定30h为起始ram区 mov r2, #4 pp: mov r3, #8 jjjj: jnb PIN_6221, $ ;等待地址码第一位的高电平信号 lcall ys1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态 mov c, PIN_6221 ;将PIN_6221引脚此时的电平状态0或1存入c中 jnc uuu ;如果为0就跳转到uuu jb PIN_6221, $ ;如果为1就等待高电平信号结束 uuu: mov a, @r1 ;将r1中地址的给a rrc a ;将c中的值0或1移入a中的最低位 mov @r1,a ;将a中的数暂时存放在r1中 djnz r3, jjjj ;接收地址码的高8位 inc r1 ;对r1中的值加1,换成下一个ram djnz r2, pp ;接收完16位地址码和8位数据码和8位数据反码,存放在30h/31h/32h/33h的ram中
;以下对代码是否正确和定义进行识别 mov a, 30H;比较高8位地址码 xrl a, #00000000b ;判断1ah的值是否等于00000000,相等的话a为0 jnz exit;如果不相等说明解码失败退出解码程序 mov a, 31H;比较低8位地址 xrl a, #11111111b ;再判断高8位地址是否正确 jnz exit;如果不相等说明解码失败退出解码程序 lcall ys3 mov a, 32H;比较数据码和数据反码是否正确? cpl a xrl a, 33H ;将1ch的值取反后和1dh比较 不同则无效丢弃,核对数据是否准确 jnz exit;如果不相等说明解码失败退出解码程序 lcall ys3
;判断在118毫秒内是否有连发码 aa: mov r1, #25 xx: lcall ys2 jnb PIN_6221, hh; 跳转到判断连发代码是否正确的程序段 djnz r1, xx
lcall clear_screen
mov dptr, #code_str lcall showtext
mov r0, #32h mov r7, #1 lcall showhex
exit: sjmp begin
;连发码判断程序段----------- hh: mov r6,#4 s: lcall ys1 ;调用882微秒延时子程序 jb PIN_6221, exit ;延时882微秒后判断PIN_6221脚是否出现高电平如果有就退出解码程序 djnz r6, s ;重复4次,目的是确认连发码的低电平信号波形 jnb PIN_6221, $ ;等待高电平 sjmp aa
ys1: mov r4, #20 ;延时子程序1,精确延时882微秒 d1: mov r5, #20 djnz r5, $ djnz r4, d1 ret
ys2: mov r4, #10 ;延时子程序2,精确延时4740微秒 d2: mov r5, #235 djnz r5, $ djnz r4, d2 ret
ys3: mov r4, #2 ;延时程序3,精确延时1000微秒 d3: mov r5, #248 djnz r5, $ djnz r4, d3 ret
showhex: ; input: ; r0: address r7: bytes count
showhex_loop: push ar7
mov a, @r0 swap a anl a, #0fh clr c subb a, #0ah jc label2 add a, #'A' sjmp label1 label2: add a, #(0ah + '0') label1: push ar0 lcall showchar pop ar0
mov a, @r0 anl a, #0fh clr c subb a, #0ah jc label4 add a, #'a' sjmp label3 label4: add a, #(0ah + '0') label3: push ar0 lcall showchar
mov a, #' ' lcall showchar pop ar0
pop ar7
inc r0 djnz r7, showhex_loop ret
showtext: ; input: ; dptr : text buffer pointer
mov b, #0
loop_show: mov a, b movc a, @a + dptr inc b jz showtext_quit lcall showchar sjmp loop_show
showtext_quit: ret
clear_screen: lcall lcdreset mov XPOS, #0 mov YPOS, #0 ret
showchar: push acc mov a, XPOS mov r7, YPOS cjne r7, #0, line2 sjmp setadr line2: add a, #040h setadr: orl a, #080h ;设置ddram地址 lcall lcdwc pop acc
lcall lcdwd ;写字符
inc XPOS mov a, XPOS cjne a, #10h, showchar_quit inc YPOS mov XPOS, #0 showchar_quit: ret
lcdreset: ;初始化程序 clr E_PIN call delay5ms ;延时15ms call delay5ms call delay5ms mov a,#38h ;显示模式设置(不检测忙信号) call lcdwcn ;共三次 call delay5ms mov a,#38h call lcdwcn call delay5ms mov a,#38h call lcdwcn
mov a,#38h ;显示模式设置(以后均检测忙信号) call lcdwc mov a,#08h ;显示关闭 call lcdwc mov a,#01h ;显示清屏 call lcdwc mov a,#06h ;显示光标移动设置 call lcdwc mov a,#0ch ;显示开及光标设置 call lcdwc ret
lcdwc: ;送控制字子程序(检测忙信号) call waitidle
lcdwcn: ;送控制字子程序(不检测忙信号) clr RS_PIN ;rs=0 rw=0 e=高脉冲 clr RW_PIN mov p1,a setb E_PIN nop clr E_PIN ret
lcdwd: ;写字符子程序 call waitidle setb RS_PIN ;rs=1 rw=0 e=高脉冲 clr RW_PIN mov p1,a setb E_PIN nop clr E_PIN ret
waitidle: push acc ;正常读写操作之前必须检测lcd控制器状态 mov p1,#0ffh clr RS_PIN ;rs=0 rw=1 e=高电平 setb RW_PIN setb E_PIN wtd_pa: nop ;db7: 0 lcd控制器空闲 jb p1.7,wtd_pa ; 1 lcd控制器忙 clr E_PIN pop acc ret
delay5ms: mov r1,#25 ;延时子程序(5ms) dl5_pa: mov r2,#100 djnz r2,$ djnz r1,dl5_pa ret
delay400ms: mov r0,#20 ;延时子程序(400ms) dl4_pa: mov r1,#100 dl4_pb: mov r2,#100 djnz r2,$ djnz r1,dl4_pb djnz r0,dl4_pa ret
end
/* org 0 ljmp start
org 01bh ljmp time1
org 30h
start: mov 30h, 0
mov tmod, #060h mov tl1, #0ffh mov th1, #0ffh mov ie, #088h setb tr1 sjmp $
time1: inc 30h mov a, 30h xrl a, #0ffh cpl p1.0 reti
showa: push acc lcall to_showa pop acc ret
skiped: mov a, p1 xrl a, #0ffh inc a to_showa: xrl a, #0ffh mov p1, a
waittime: ; wait 1 second mov r2, #100 loop1: mov r3, #100 loop2: mov r4, #50 djnz r4, $ djnz r3, loop2 djnz r2, loop1 ret
tab: db 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h
end */ /* mov tmod, #20h mov tl1, #0f3h mov th1, #0f3h setb tr1 mov scon, #040h orl pcon, #080h
clr a mov p1, #0ffh
loop: lcall showa mov sbuf, a jnb ti, $ clr ti
inc a sjmp loop */
|