⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_upc6221.asm

📁 带LCD显示的遥控码读码器
💻 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 + -