📄 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 + -