?? lcd_upc6221.asm
字號:
;==================================================================================
; 名稱:6221芯片紅外遙控碼讀碼器 =
; 功能:6221芯片紅外解碼,并在16X2LCD上顯示解碼后的四個代碼:用戶碼,用戶碼反碼, =
; 數據碼,數據碼反碼。 =
; 制作人: Datazyb =
; 版權所有: 2004.8,datazyb =
; CPU:AT89C2051, Crystal:11.0592M,LCD:WM-C1602N =
;==================================================================================
STACK_START EQU 30h ;set the stack!!!
ir_code data 60H ;操作碼
ir_code_R data 61h ;操作碼反碼
ir_ID_code data 62h ;用戶碼
ir_ID_code_R data 63h ;用戶碼反碼
counter data 64h
code_num_1 data 65h
code_num_2 data 66h
IR_DATA data 67h
DR_DATA data 68h
bcd_code data 69h
;------------------------------------------------
;The CPU is 11.0592M.
;LCD Port
rs bit p3.4
rw bit p3.5
en bit p3.3
LCD_data_bus data p1
;remote pin
remote bit p3.2
;*********************************************************************
ORG 0000H
AJMP start
ORG 0003H ;外部中斷P3.2腳INT0入口地址
AJMP INT0_decode
ORG 0030H
start:
mov sp,#stack_start ;set the sp!!!
clr EA
clr ex1 ;關掉其他中斷
clr et1
clr es
clr et0
SETB IT0 ;設定INT0的觸發方式為脈沖負邊沿觸發
SETB EX0 ;打開INT0中斷請求 (紅外線輸入)
;SETB EA ;打開CPU總中斷請求
;*************************************************************************
; the following is used to process to display,scan the four register and
; display them on lcd!!!
;*************************************************************************
main: acall initial_lcd
mov dptr,#string_start ;display the wellcome message!
acall print_line
acall delay_1s
acall delay_1s ;delay 2s!
mov dptr,#string_banquan
acall print_line
acall delay_1s
acall delay_1s ;delay 2s!
mov dptr,#string_wait
acall print_line
setb ea ;open the interrupt!!!
clr en ;shut off lcd!
;----------------------------
main_loop:
mov p1,#00h
acall delay_130ms
mov p1,#0ffh
mov counter,#4
loop_k:
acall delay_130ms
djnz counter,loop_k
ajmp main_loop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;紅外線解碼程序 ;
;這部分程序參考了"電子制作實驗室"的紅外解碼程序 ;
;電子制作實驗室:Http://www.xie-gang.com ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INT0_decode:
CLR EA ;暫時關閉CPU的所有中斷請求
push acc
push psw
setb psw.3 ;選擇工作寄存器組1
MOV R6,#5
SB:
SJMP YS0 ;轉到882微秒延時判斷子程序
SBB: ;延時882微秒中判斷P3.3腳是否出現高電平如果有就退出解碼程序
DJNZ R6, SB ;重復'R6次,目的是檢測在8820微秒內如果出現高電平就退出解碼程序
;以上完成對遙控信號的9000微秒的初始低電平信號的識別。
JNB remote, $ ;等待高電平避開9毫秒低電平引導脈沖
ACALL YS2 ;延時4.74毫秒避開4.5毫秒的結果碼
MOV R1,#5CH ;設定5cH為起始RAM區
MOV R2,#4
PP:
MOV R3,#8
JJJJ:
JNB remote,$ ;等待地址碼第一位的高電平信號
LCALL YS1 ;高電平開始后用882微秒的時間尺去判斷信號此時的高低電平狀態
MOV C,remote ;將remote引腳此時的電平狀態0或1存入C中
JNC UUU ;如果為0就跳轉到UUU
LCALL YS3
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位數據反碼,存放在5CH/5DH/5EH/5FH的RAM中
mov a,5fh
cjne a,#0FFh,ir_rec ;跳開#0FFh,如果按時間長,解出的碼是#0FFh
sjmp Exit
ir_rec:
mov IR_ID_code_R,5dh ;user ID reverse code
mov IR_ID_code,5ch ;user ID code
mov IR_code,5eh ;data code
mov IR_code_R,5fh ;data reverse code
;************************************************************
; the following programme can display the code on lcd!
;************************************************************
mov dptr,#string_decode
acall print_line ;add on 2004.8.15;17:51
mov a,#0
mov b,#3
acall GotoXY
mov a,IR_ID_code
acall print_code ;ID_code display
;----------------------------
mov a,#0
mov b,#0dh
acall GotoXY
mov a,IR_ID_code_R
acall print_code ;ID_code_R display
;----------------------------
mov a,#1
mov b,#3
acall GotoXY
mov a,IR_code
acall print_code ;IR_code display
;----------------------------
mov a,#1
mov b,#0dh
acall GotoXY
mov a,IR_code_R
acall print_code ;IR_code_R display
EXIT:
pop psw
pop acc
SETB EA ;允許中斷
RETI ;退出解碼子程序
;=================================================================
YS0:
MOV R4,#220
irD0:
JB remote,EXIT
DJNZ R4,irD0
SJMP SBB
;*******************************************************************
; delay code
;*******************************************************************
YS1:MOV R4,#20 ;延時子程序1,精確延時882微秒
D1: MOV R5,#18
DJNZ R5,$
DJNZ R4,D1
RET
YS2: MOV R4,#20 ;延時子程序2,精確延時4740微秒
D2: MOV R5,#107
DJNZ R5,$
DJNZ R4,D2
RET
YS3: MOV R4,#2;延時程序3,精確延時1000微秒
D3: MOV R5,#229
DJNZ R5,$
DJNZ R4,D3
RET
;*****************************************************************
; delay 130ms
;*****************************************************************
delay_130ms:
mov r4,#0ffh
loop1:
mov r5,#0ffh
loop2:
djnz r5,loop2
djnz r4,loop1
ret
;===========================================================
; delay 1s
;===========================================================
delay_1s:
mov counter,#8
delay_loop:
acall delay_130ms
djnz counter,delay_loop
ret
;*******************************************************
; delay 20ms
;*******************************************************
DEL20MS: MOV R6,#40
LOOP8: MOV R7,#250
LOOP9: DJNZ R7,LOOP9
DJNZ R6,LOOP8
RET
;=====================================
;======== LCD initial ========
;=====================================
Initial_LCD: ;
acall del20ms
mov IR_DATA,#00111000b ;
acall Write_IR ;
acall del20ms ;
mov IR_DATA,#00111000b ;
acall Write_IR ;
acall del20ms ;
mov IR_DATA,#00111000b ;
acall Write_IR ;
mov IR_DATA,#00001000b ;
acall Write_IR ;
mov IR_DATA,#00000001b ;
acall Write_IR ;
mov IR_DATA , #00000110b ;
acall Write_IR ;
mov IR_DATA,#00001100b ;
acall Write_IR ;
ret ;
;=====================================
;=========“忙”信號檢查 ========
;=====================================
CheckBF: ;
Push acc ;
wait:
mov LCD_data_bus,#0ffh ;準備讀數據
clr en
Clr rs ;rs=0
Setb rw ;r/w=0
nop
nop
nop
nop
Setb en ;en=1
Mov a,LCD_data_bus ;
Clr en ;en=0
;Jb acc.7,wait
mov r7,#0 ;
djnz r7,$ ;DELAY
pop acc ;
ret ;
;================================================
;============ 寫指令寄存器 ==============
;================================================
Write_IR: ;
acall CheckBF ;
clr en
clr rs ;RS=0
clr rw ;R/W
nop
nop
setb en ;E=1
nop ;
mov LCD_data_bus,IR_DATA ;
nop ;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -