?? ldmsapp.asm
字號(hào):
;遙控器代碼測(cè)試程序
;***************************************************************************
;* sxj1974@163.com (51c51 test web) www.8951.com *
;* Create by :石學(xué)軍 www.51c51.com 更多例程請(qǐng)登陸網(wǎng)站 *
;***************************************************************************
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, $ ;等待遙控信號(hào)出現(xiàn)
mov r6, #10
sb:
lcall ys1 ;調(diào)用882微秒延時(shí)子程序
jb PIN_6221, begin ;延時(shí)882微秒后判斷PIN_6221腳是否出現(xiàn)高電平如果有就退出解碼程序
djnz r6, sb ;重復(fù)10次,目的是檢測(cè)在8820微秒內(nèi)如果出現(xiàn)高電平就退出解碼程序
;以上完成對(duì)遙控信號(hào)的9000微秒的初始低電平信號(hào)的識(shí)別。
jnb PIN_6221, $ ;等待高電平避開9毫秒低電平引導(dǎo)脈沖
lcall ys2 ;延時(shí)4.74毫秒避開4.5毫秒的結(jié)果碼
mov r1, #30H ;設(shè)定30h為起始ram區(qū)
mov r2, #4
pp:
mov r3, #8
jjjj:
jnb PIN_6221, $ ;等待地址碼第一位的高電平信號(hào)
lcall ys1 ;高電平開始后用882微秒的時(shí)間尺去判斷信號(hào)此時(shí)的高低電平狀態(tài)
mov c, PIN_6221 ;將PIN_6221引腳此時(shí)的電平狀態(tài)0或1存入c中
jnc uuu ;如果為0就跳轉(zhuǎn)到uuu
jb PIN_6221, $ ;如果為1就等待高電平信號(hào)結(jié)束
uuu:
mov a, @r1 ;將r1中地址的給a
rrc a ;將c中的值0或1移入a中的最低位
mov @r1,a ;將a中的數(shù)暫時(shí)存放在r1中
djnz r3, jjjj ;接收地址碼的高8位
inc r1 ;對(duì)r1中的值加1,換成下一個(gè)ram
djnz r2, pp ;接收完16位地址碼和8位數(shù)據(jù)碼和8位數(shù)據(jù)反碼,存放在30h/31h/32h/33h的ram中
;以下對(duì)代碼是否正確和定義進(jìn)行識(shí)別
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;比較數(shù)據(jù)碼和數(shù)據(jù)反碼是否正確?
cpl a
xrl a, 33H ;將1ch的值取反后和1dh比較 不同則無效丟棄,核對(duì)數(shù)據(jù)是否準(zhǔn)確
jnz exit;如果不相等說明解碼失敗退出解碼程序
lcall ys3
;判斷在118毫秒內(nèi)是否有連發(fā)碼
aa:
mov r1, #25
xx:
lcall ys2
jnb PIN_6221, hh; 跳轉(zhuǎn)到判斷連發(fā)代碼是否正確的程序段
djnz r1, xx
lcall clear_screen
mov dptr, #code_str
lcall showtext
mov r0, #32h
mov r7, #1
lcall showhex
exit:
sjmp begin
;連發(fā)碼判斷程序段-----------
hh:
mov r6,#4
s:
lcall ys1 ;調(diào)用882微秒延時(shí)子程序
jb PIN_6221, exit ;延時(shí)882微秒后判斷PIN_6221腳是否出現(xiàn)高電平如果有就退出解碼程序
djnz r6, s ;重復(fù)4次,目的是確認(rèn)連發(fā)碼的低電平信號(hào)波形
jnb PIN_6221, $ ;等待高電平
sjmp aa
ys1:
mov r4, #20 ;延時(shí)子程序1,精確延時(shí)882微秒
d1:
mov r5, #20
djnz r5, $
djnz r4, d1
ret
ys2:
mov r4, #10 ;延時(shí)子程序2,精確延時(shí)4740微秒
d2:
mov r5, #235
djnz r5, $
djnz r4, d2
ret
ys3:
mov r4, #2 ;延時(shí)程序3,精確延時(shí)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 ;設(shè)置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 ;延時(shí)15ms
call delay5ms
call delay5ms
mov a,#38h ;顯示模式設(shè)置(不檢測(cè)忙信號(hào))
call lcdwcn ;共三次
call delay5ms
mov a,#38h
call lcdwcn
call delay5ms
mov a,#38h
call lcdwcn
mov a,#38h ;顯示模式設(shè)置(以后均檢測(cè)忙信號(hào))
call lcdwc
mov a,#08h ;顯示關(guān)閉
call lcdwc
mov a,#01h ;顯示清屏
call lcdwc
mov a,#06h ;顯示光標(biāo)移動(dòng)設(shè)置
call lcdwc
mov a,#0ch ;顯示開及光標(biāo)設(shè)置
call lcdwc
ret
lcdwc: ;送控制字子程序(檢測(cè)忙信號(hào))
call waitidle
lcdwcn: ;送控制字子程序(不檢測(cè)忙信號(hào))
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 ;正常讀寫操作之前必須檢測(cè)lcd控制器狀態(tài)
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 ;延時(shí)子程序(5ms)
dl5_pa:
mov r2,#100
djnz r2,$
djnz r1,dl5_pa
ret
delay400ms:
mov r0,#20 ;延時(shí)子程序(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
*/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -