返回主页 单片机教程XL2000开发板 单片机学习 自制编程器 单片机资料 软件下载 电子技术产品介绍如何购买 

;倚天版用户: 飞扬工作室吴涛友情提供的倚天版套件演示遥控液晶! 按遥控器液晶将显示遥控器键值:非常感谢吴涛的热心支持!以下是它的来信:

 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
*/