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

📄 遥控解码部分.asm

📁 单片机红外遥控发送接收仿真
💻 ASM
字号:

COUNT EQU 30H ;定时计数数值    
FLAG_USER1 EQU 45H ;用户码位置1
FLAG_USER2 EQU 46H ;用户码位置2
SAVEDATA EQU 47H  ;数据保存位置

CS1 EQU P3.0
CS2 EQU P3.1
RS  EQU P3.3
RW  EQU P3.4
E   EQU P3.5

PAGES  EQU 56H
COLUMN EQU 57H
NUM    EQU 58H
 
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EXTER0INT
ORG 000BH
LJMP TIMER0INT
ORG 1000H

MAIN:
     MOV TMOD,#01H     ;定时器0模式1
     MOV TH0,#0FFH     ;定时100us
     MOV TL0,#9CH
     SETB EA
     SETB IT0        ;外部中断0边沿触发方式,负跳变有效
     SETB ET0
     SETB EX0
     MOV R0,52H      ;接收的数据8个一组所存放的起始位置
     MOV 52H,#00H    ;先进行清零
     MOV 53H,#00H
     MOV 54H,#00H
     MOV 55H,#00H

     MOV 51H,#00H    ;中间数据存储单元

     MOV COUNT,#00H

     MOV R1,#08H     ;设定接收的数据8个一组
     MOV R2,#02H     ;设定接收的数据组为4个。
  
     CLR PSW.5       ;数据接收标志
     CLR PSW.1       ;数据处理标志
     MOV FLAG_USER1,#00H ;设定用户码为0.

     LCALL CLEAR

     MOV DPTR,#TAB0
     MOV PAGES,#1
     MOV COLUMN,#0
     LCALL LCD_DISP
     MOV DPTR,#TAB2
     MOV PAGES,#1
     MOV COLUMN,#16
     LCALL LCD_DISP
     MOV DPTR,#TAB1
     MOV PAGES,#1
     MOV COLUMN,#32
     LCALL LCD_DISP        ;显示吴小闯

     MOV DPTR,#TAB3
     MOV PAGES,#1
     MOV COLUMN,#48
     LCALL LCD_DISP
     MOV DPTR,#TAB4
     MOV PAGES,#1
     MOV COLUMN,#64
     LCALL LCD_DISP        ;显示作品

     MOV DPTR,#TAB5
     MOV PAGES,#3
     MOV COLUMN,#0
     LCALL LCD_DISP
     MOV DPTR,#TAB6
     MOV PAGES,#3
     MOV COLUMN,#16
     LCALL LCD_DISP
     MOV DPTR,#TAB7
     MOV PAGES,#3
     MOV COLUMN,#32
     LCALL LCD_DISP         ;显示键值:
  
LOOP:
     JNB PSW.1,$     ;判断是否进行数据处理。为1则进行处理,反之等待  
     LCALL DATACHULI                 ;数据处理。主要进行用户码判断以及数据和数据反码的判断
                       ;用户码判断,根据编码,用户码1和用户码2均为0,所以这里我们只判断用户码1和接受的用户码数据
     CLR PSW.1       ;清零等待下一组数据的接收

     MOV A,SAVEDATA
     LCALL DATASHOW
ENDLOOP:       
     LJMP LOOP

;外部中断0部分
EXTER0INT:
  SETB TR0
  MOV 30H,#00H         ;30H为计数值   
RETI

TIMER0INT:
     MOV TH0,#0FFH     ;定时100us
     MOV TL0,#9CH
     INC 30H            ;注意,count要在外部中断开始后设定初始值为0;
                        ;起始码的判断,计数数值在85-95之间,采集端口是否发生变化,发生变化了,可以认为可以接受数据了
     SETB P3.2
     MOV C,P3.2
     

     JB PSW.5,DATARECEIVEPD  ;如果为1,表明可以进入数据接收判断位置,否则还是引导码处的判断
     JNC ENDTIMER0INT
     
     MOV A,30H               ;注在试验中了解到,COUNT=115为9ms的数值    ;0.56ms和1.68ms对应的count分别为 6和16
  
     CLR C
     SUBB A,#90
     
     JC ENDTIMER0INT          ;如果C为1,说明不符合引导码的9ms,直接退出,否则符合引导时间,准备接受数据
     SETB PSW.5               ;数据接收标志。
    
     CLR TR0                  ;以免接收数据
     MOV R1,#08H              ;表示要接收的数据8个一组
     MOV 51H,#00H              ;中间数据存储清零
     MOV R0,#52H
     MOV R2,#04H              ;总共接收2组
     LJMP ENDTIMER0INT

DATARECEIVEPD:
     JNC ENDTIMER0INT    ;c为1,表明状态发生变化,可以对计数值进行判断接收的位是0还是1 
     CLR TR0
     MOV A,30H    
     CLR TR0            ;首先关掉定时器0
     SUBB A,#10         ;以8为分界线,小于8则为0,大于8我们认为接收的是1
     JC ORECEIVE         ;跳到接收位0处 
     SETB C
     MOV A,51H          ;接收位1
     RRC A   
     MOV 51H,A  
     LJMP WENDPD
ORECEIVE:
     CLR C
     MOV A,51H
     RRC A
     MOV 51H,A     
                             
WENDPD:
    DJNZ R1,ENDTIMER0INT
    MOV R1,#08H
    MOV @R0,51H                ; 重点:重复2次,确保值写到单元里
    MOV @R0,51H
    INC R0
    MOV 51H,#00H
    DJNZ R2,ENDTIMER0INT       ;若不为0说明4组数据还未接收完则跳转到终端结束
    CLR PSW.5
    SETB PSW.1
ENDTIMER0INT:   
    RETI

DATACHULI:
     MOV A,52H
     CLR C
     SUBB A,FLAG_USER1
     JNZ ENDDATACHULI        ;与用户码进行比较,本用户码设置的是0,当然也可以设置其他
     MOV A,54H
     ANL A,55H
     JNZ ENDDATACHULI         ;判断数据接收的是否正确
     MOV A,54H
     MOV SAVEDATA,A     ;将数据保存起来
     MOV P1,A

     MOV 52H,#00H    ;先进行清零
     MOV 53H,#00H
     MOV 54H,#00H
     MOV 55H,#00H
ENDDATACHULI:     
     RET

DATASHOW:
     CJNE A,#00H,CON2
     MOV DPTR,#TAB18
     MOV PAGES,#5 
     LJMP ENDDATASHOW
CON2:CJNE A,#01H,CON3
     MOV DPTR,#TAB8
     MOV PAGES,#5  
     LJMP ENDDATASHOW
CON3:CJNE A,#02H,CON4
     MOV DPTR,#TAB9
     MOV PAGES,#5  
     LJMP ENDDATASHOW
CON4:CJNE A,#03H,CON5
     MOV DPTR,#TAB10
     MOV PAGES,#5  
     LJMP ENDDATASHOW
CON5:CJNE A,#04H,CON6
     MOV DPTR,#TAB11
     MOV PAGES,#5  
     LJMP ENDDATASHOW
CON6:CJNE A,#05H,CON7
     MOV DPTR,#TAB12
     MOV PAGES,#5  
     LJMP ENDDATASHOW
CON7:CJNE A,#06H,CON8
     MOV DPTR,#TAB13
     MOV PAGES,#5  
     LJMP ENDDATASHOW
CON8:CJNE A,#07H,CON9
     MOV DPTR,#TAB14
     MOV PAGES,#5  
     LJMP ENDDATASHOW
CON9:CJNE A,#08H,CON10
     MOV DPTR,#TAB15
     MOV PAGES,#5  
     LJMP ENDDATASHOW
CON10:CJNE A,#09H,CON11
     MOV DPTR,#TAB16
     MOV PAGES,#5  
     LJMP ENDDATASHOW
CON11:CJNE A,#0AH,CON12
     MOV DPTR,#TAB17
     MOV PAGES,#5  
     LJMP ENDDATASHOW

CON12:JMP ENDDATASHOW1
ENDDATASHOW:      
      MOV COLUMN,#16
      LCALL LCD_DISP
ENDDATASHOW1:       
      RET

CLEAR: MOV   R4,#00H            ;清屏程序
CLEAR1:MOV   A ,R4 
       ORL   A,#0B8H         
       MOV   B,A          
       LCALL WCL0 
       LCALL WCR0
       MOV   B,#40H      
       LCALL WCL0 
       LCALL WCR0
       MOV   R3,#40H       
CLEAR2:MOV   B,#00H     
       LCALL WCL1
       LCALL WCR1
       DJNZ  R3,CLEAR2       
       INC   R4              
       CJNE  R4, #08H, CLEAR1
       RET  

LCD_DISP:                       ;显示汉字子程序	         
         MOV R1,#02H
	 MOV R0,#00H            ;字码偏移量
	 MOV NUM,#10H           ;一行16个点
   DISP: MOV R4,NUM
  
   DISPWORD:MOV A,COLUMN                ;从第几列开始显示
            CLR C
	    SUBB A,#63                  ;判断列在哪一个选片里
	    JNC YXP                     ;为0则跳到右选片处
            MOV A,COLUMN
	    ORL A,#40H                  ;设置列地址指令
	    MOV B,A
	    LCALL WCL0                  ;写指令到左选片
	    MOV A,PAGES                 
	    ORL A,#0B8H                 ;设置页指令
	    MOV B,A                     ;写指令到左选片
	    LCALL WCL0                   
  DISPDATA1:INC COLUMN
            MOV A,R0
	    MOVC A,@A+DPTR
	    MOV B,A
	    LCALL WCL1                  ;写数据到左选片
	    LJMP NEXTDISP
    YXP:MOV A,COLUMN
        CLR C
        SUBB A,#64                     ;右选片的第0列
        ORL A,#40H
        MOV B,A
        LCALL WCR0
        MOV A,PAGES
        ORL A,#0B8H
        MOV B,A
        LCALL WCR0
DISPDATA2:INC COLUMN
          MOV A,R0
	  MOVC A,@A+DPTR
	  MOV B,A
	  LCALL WCR1
NEXTDISP:INC R0
         DJNZ R4,DISPWORD
	 MOV A,COLUMN
	 CLR C
	 SUBB A,#10H
	 MOV COLUMN, A
         INC PAGES
	 DJNZ R1,DISP
	 RET 

WCL0:    CLR     CS1              ;写指令左选片
         SETB    CS2     
         CLR     RS            
         SETB    RW         
WCL00:   MOV     P2,#0FFH     
         SETB    E               ;输入输出使能信号       
         MOV     A,P2        
         CLR     E          
         JB      ACC.7,WCL00
         CLR     RW        
         MOV     P2, B ;写左片指令  
         SETB    E  
         NOP      
         CLR     E  
         RET

WCL1:    CLR     CS1               ;写数据左选片
         SETB    CS2      
         CLR     RS            
         SETB    RW         
WCL11:   MOV     P2,#0FFH     
         SETB    E           
         MOV     A,P2       
         CLR     E          
         JB      ACC.7,WCL11
         CLR     RW
         SETB    RS       
         MOV     P2, B   
         SETB    E        
         CLR     E
         RET 
WCR0:                           ;写指令到右选片
        SETB    CS1             ;右选片
        CLR     CS2
        CLR     RS            
        SETB    RW         
WCR00:  MOV     P2,#0FFH     
        SETB    E           
        MOV    A,P2        
        CLR     E          
        JB       ACC.7,WCR00
        CLR     RW        
        MOV    P2, B    
        SETB    E        
        CLR     E
        RET
WCR1:                           ;写右选片数据
        SETB    CS1 
        CLR     CS2
        CLR     RS            
        SETB    RW        
WCR11:  MOV     P2,#0FFH     
        SETB    E           
        MOV     A,P2       
        CLR     E          
        JB      ACC.7,WCR11
        CLR     RW 
        SETB    RS       
        MOV     P2, B    
        SETB    E        
        CLR     E
        RET


TAB0:DB 000H,000H,080H,0BEH,0A2H,0A2H,0A2H,0A2H,0A2H,0A2H,0A2H,0BEH,080H,000H,000H,000H
     DB 084H,084H,044H,044H,024H,014H,00CH,007H,00CH,014H,024H,064H,0C4H,044H,004H,000H;吴
TAB1:DB 000H,000H,0F8H,001H,006H,0F0H,090H,092H,092H,0F2H,082H,082H,002H,0FEH,000H,000H
     DB 000H,000H,0FFH,000H,002H,002H,002H,002H,002H,00AH,010H,04FH,080H,07FH,000H,000H;闯
TAB2:DB 000H,000H,000H,0C0H,070H,020H,000H,0FFH,000H,010H,020H,0C0H,080H,000H,000H,000H
     DB 004H,002H,001H,000H,000H,040H,080H,07FH,000H,000H,000H,000H,001H,007H,002H,000H ;小
TAB3:DB 080H,040H,020H,0F8H,007H,022H,018H,00CH,0FBH,048H,048H,048H,068H,048H,008H,000H
     DB 000H,000H,000H,0FFH,000H,000H,000H,000H,0FFH,004H,004H,004H,004H,006H,004H,000H;作
TAB4:DB 000H,000H,000H,000H,07EH,022H,022H,022H,022H,022H,022H,07EH,000H,000H,000H,000H
     DB 000H,07FH,021H,021H,021H,021H,07FH,000H,07FH,021H,021H,021H,021H,07FH,000H,000H;品
TAB5:DB 040H,030H,0EFH,028H,028H,044H,064H,0DCH,010H,054H,0FFH,054H,054H,07CH,010H,000H
     DB 001H,001H,07FH,021H,051H,022H,014H,00FH,014H,025H,03FH,045H,045H,045H,044H,000H;键
TAB6:DB 080H,040H,0F0H,02FH,002H,004H,0E4H,0A4H,0B4H,0AFH,0A6H,0A4H,0E4H,004H,000H,000H
     DB 000H,000H,0FFH,000H,040H,040H,07FH,04AH,04AH,04AH,04AH,04AH,07FH,040H,040H,000H;值
TAB7:DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H
     DB 000H,000H,036H,036H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H;:

TAB8:DB 000H,080H,080H,080H,080H,080H,080H,080H,080H,080H,080H,080H,080H,0C0H,080H,000H
     DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H   ;一
TAB9:DB 000H,000H,004H,004H,004H,004H,004H,004H,004H,004H,004H,006H,004H,000H,000H,000H
     DB 000H,010H,010H,010H,010H,010H,010H,010H,010H,010H,010H,010H,010H,018H,010H,000H   ;二
TAB10:DB 000H,004H,084H,084H,084H,084H,084H,084H,084H,084H,084H,084H,084H,004H,000H,000H
      DB 000H,020H,020H,020H,020H,020H,020H,020H,020H,020H,020H,020H,020H,020H,020H,000H  ;三
TAB11:DB 000H,0FEH,002H,002H,002H,0FEH,002H,002H,0FEH,002H,002H,002H,002H,0FEH,000H,000H
      DB 000H,07FH,028H,024H,023H,020H,020H,020H,021H,022H,022H,022H,022H,07FH,000H,000H  ;四
TAB12:DB 000H,002H,082H,082H,082H,082H,0FEH,082H,082H,082H,0C2H,082H,002H,000H,000H,000H
      DB 020H,020H,020H,020H,020H,03FH,020H,020H,020H,020H,03FH,020H,020H,030H,020H,000H  ;五
TAB13:DB 010H,010H,010H,010H,010H,091H,012H,01EH,094H,010H,010H,010H,010H,010H,010H,000H
      DB 000H,040H,020H,010H,00CH,003H,001H,000H,000H,001H,002H,00CH,078H,030H,000H,000H  ;六
TAB14:DB 000H,040H,040H,040H,040H,040H,040H,0FEH,020H,020H,020H,020H,020H,020H,020H,000H
      DB 000H,000H,000H,000H,000H,000H,000H,03FH,040H,040H,040H,040H,040H,038H,000H,000H  ;七
TAB15:DB 000H,000H,000H,000H,080H,07CH,008H,000H,000H,07EH,084H,000H,000H,000H,000H,000H
      DB 020H,010H,008H,006H,001H,000H,000H,000H,000H,000H,001H,006H,018H,030H,010H,000H  ;八
TAB16:DB 000H,010H,010H,010H,010H,090H,07FH,010H,010H,010H,0F8H,010H,000H,000H,000H,000H
      DB 000H,040H,020H,010H,00CH,003H,000H,000H,000H,000H,07FH,040H,040H,078H,020H,000H  ;九
TAB17:DB 040H,040H,040H,040H,040H,040H,040H,0FFH,040H,040H,040H,040H,040H,040H,040H,000H
      DB 000H,000H,000H,000H,000H,000H,000H,07FH,000H,000H,000H,000H,000H,000H,000H,000H  ;十
TAB18:DB 000H,00CH,004H,055H,055H,055H,085H,07FH,085H,055H,055H,055H,005H,00CH,004H,000H
      DB 004H,004H,004H,00AH,00AH,009H,02AH,0CCH,028H,019H,009H,002H,006H,002H,002H,000H  ;零


END


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -