電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 3185|回復(fù): 1
收起左側(cè)

單片機(jī)C語(yǔ)言實(shí)例-214-紅外遙控鍵值解碼12864液晶顯示(匯編語(yǔ)言)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2022-2-24 11:15:29 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)C語(yǔ)言實(shí)例-214-紅外遙控鍵值解碼12864液晶顯示(匯編語(yǔ)言)




        IRCOM  EQU  20H       ;20H-23H IR使用
        X     EQU  26H        ;LCD 地址變量

        IRIN   EQU  P3.2
        BEEP   EQU  P3.7
        RELAY  EQU  P1.3

        RS        EQU        P2.0
        RW        EQU        P2.1
        EN         EQU        P2.2
        PSB        EQU        P2.3
        RST        EQU        P2.5
;------------------------------------------------
         ORG 0000H
         JMP  MAIN

         ORG 0003H         ;外部中斷INT0入口地址
         JMP  IR_IN        ;中斷服務(wù)程序
;------------------------------------------------
MAIN:
          MOV   SP,#40H
          MOV   A,#00H
          MOV   R0,#20H
LOOP0:    MOV   @R0,A          ;20H-26H清零
          INC   R0
          CJNE  R0,#27H,LOOP0
          MOV  IE,#81H       ;允許總中斷中斷,使能 INT0 外部中斷
          MOV  TCON,#01H     ;觸發(fā)方式為脈沖負(fù)邊沿觸發(fā)
          SETB  IRIN
          SETB        RST
          NOP
          SETB        PSB            ;8位數(shù)據(jù),并口

          CALL  SET_LCD        ;初始化TS12864A-3
          CALL  MENU1
          CALL  MENU2
          CALL  MENU3
          CALL  MENU4
LOOP1:
          MOV  A,22H
          CJNE  A,#40H,LOOP2    ;K17鍵按下
          CLR   RELAY           ;繼電器吸合
LOOP2:    CJNE  A,#04H,LOOP3    ;K19鍵按下
          SETB  RELAY           ;繼電器關(guān)閉
LOOP3:    JMP   LOOP1

;=============================================
;  LCD 初始化設(shè)置
;=============================================-
SET_LCD:
          CLR  EN
          MOV  A,#34H     ;34H--擴(kuò)充指令操作
          CALL  WCOM
          CALL  DELAY1
          MOV  A,#30H     ;30H--基本指令操作
          CALL  WCOM
          CALL  DELAY1

          MOV  A,#0CH     ;開(kāi)顯示,關(guān)光標(biāo),
          CALL  WCOM
          CALL  DELAY1
          MOV  A,#01H     ;清除 LCM 顯示屏
          CALL  WCOM
          CALL  DELAY1
          RET
;===================================================
;在 LCM 各行顯示信息字符
;===================================================
LCD_SHOW:

          CJNE  A,#1,LINE2  ;判斷是否為第一行
  LINE1:  MOV  A,#80H       ;設(shè)置 LCD 的第一行地址
          CALL  WCOM        ;寫(xiě)入命令
          CALL  CLR_LINE    ;清除該行字符數(shù)據(jù)
          MOV  A,#80H       ;設(shè)置 LCD 的第一行地址
          CALL  WCOM        ;寫(xiě)入命令
          JMP  FILL

  LINE2:  CJNE  A,#2,LINE3  ;判斷是否為第三行
          MOV  A,#090H      ;設(shè)置 LCD 的第三行地址
          CALL  WCOM        ;寫(xiě)入命令
          CALL  CLR_LINE    ;清除該行字符數(shù)據(jù)
          MOV  A,#090H      ;設(shè)置 LCD 的第三行地址
          CALL  WCOM
          JMP  FILL

  LINE3:  CJNE  A,#3,LINE4  ;判斷是否為第三行
          MOV  A,#088H      ;設(shè)置 LCD 的第三行地址
          CALL  WCOM        ;寫(xiě)入命令
          CALL  CLR_LINE    ;清除該行字符數(shù)據(jù)
          MOV  A,#088H      ;設(shè)置 LCD 的第三行地址
          CALL  WCOM
          JMP  FILL

  LINE4:  CJNE  A,#4,LINE5  ;判斷是否為第三行
          MOV  A,#098H      ;設(shè)置 LCD 的第三行地址
          CALL  WCOM        ;寫(xiě)入命令
          CALL  CLR_LINE    ;清除該行字符數(shù)據(jù)
          MOV  A,#098H      ;設(shè)置 LCD 的第三行地址
          CALL  WCOM

  FILL:   CLR  A            ;填入字符
          MOVC  A,@A+DPTR   ;由消息區(qū)取出字符
          CJNE  A,#0,LC1    ;判斷是否為結(jié)束碼
  LINE5:  RET
  LC1:    CALL  WDATA       ;寫(xiě)入數(shù)據(jù)
          INC  DPTR         ;指針加1
          JMP  FILL         ;繼續(xù)填入字符
          RET
;=================================================
;清除該行 LCM 的字符
;=================================================
CLR_LINE:
          MOV  R0,#16      ;
   CL1:   MOV  A,#' '
          CALL  WDATA
          DJNZ  R0,CL1
          RET
;==================================================
;LCM 顯示工作菜單信息
;==================================================
MENU1:
         MOV   DPTR,#MENU1A
         MOV   A,#1         ;在第一行顯示信息
         CALL  LCD_SHOW
         RET
MENU1A:  DB  "紅外遙控碼讀取器",0

MENU2:
         MOV   DPTR,#MENU2A
         MOV   A,#2         ;在第二行顯示信息
         CALL  LCD_SHOW
         RET
MENU2A:  DB  "--www.saxmcu.com",0

MENU3:
         MOV   DPTR,#MENU3A
         MOV   A,#3         ;在第三行顯示信息
         CALL  LCD_SHOW
         RET
MENU3A:  DB  "鍵值編碼:- - H",0

MENU4:
         MOV   DPTR,#MENU4A
         MOV   A,#4         ;在第四行顯示信息
         CALL  LCD_SHOW
         RET
MENU4A:  DB  "鍵值反碼:- - H",0

;==============================================
; 寫(xiě)指令使能子程序
;RS=L,RW=L,D0-D7=指令碼,E=高脈沖
;==============================================
WCOM:
          MOV  P0,A
          CLR RS
          CLR RW
          SETB EN
          CALL  DELAY0
          CLR EN
          RET
;=============================================
;寫(xiě)數(shù)據(jù)使能子程序
;RS=H,RW=L,D0-D7=數(shù)據(jù),E=高脈沖
;=============================================
WDATA:
          MOV   P0,A
          SETB  RS
          CLR   RW
          SETB  EN
          CALL  DELAY0
          CLR   EN
          RET

DELAY0:   MOV  R7,#250      ;延時(shí)500微秒
          DJNZ  R7,$
          RET
;===============================================
;在 LCM 第三行、第四行顯示字符
;A=ASC DATA, B=LINE X POS
;===============================================
LCDP3:                    ;在LCD的第三行顯示字符
         PUSH  ACC        ;
         MOV  A,B         ;設(shè)置顯示地址
         ADD  A,#088H     ;設(shè)置LCD的第三行地址
         CALL  WCOM       ;寫(xiě)入命令
         POP  ACC         ;由堆棧取出A
         CALL  WDATA      ;寫(xiě)入數(shù)據(jù)
         RET

LCDP4:                    ;在LCD的第四行顯示字符
         PUSH  ACC        ;
         MOV  A,B         ;設(shè)置顯示地址
         ADD  A,#098H     ;設(shè)置LCD的第四行地址
         CALL  WCOM       ;寫(xiě)入命令
         POP  ACC         ;由堆棧取出A
         CALL  WDATA      ;寫(xiě)入數(shù)據(jù)
         RET
;=================================================
; IR 譯碼子程序
;中斷服務(wù)程序
;=================================================
IR_IN:
          CLR EA         ;暫時(shí)關(guān)閉CPU的所有中斷請(qǐng)求
          PUSH  ACC
          PUSH  PSW
          SETB  PSW.3     ;選擇工作寄存器組1
          CLR   PSW.4

          MOV   R0,#IRCOM
          MOV  R1,#04H
I1:       JNB  IRIN,I2       ;等待 IR 信號(hào)出現(xiàn)
          LCALL CONV
          DJNZ  R1,I1
          JMP  IR_OUT
I2:      MOV  R4,#20
I20:     CALL  DEL
          DJNZ  R4,I20
          JB  IRIN,I1        ;確認(rèn)IR信號(hào)出現(xiàn)
I21:     JB  IRIN,I3        ;等 IR 變?yōu)楦唠娖?br />           CALL  DEL
          JMP  I21
I3:      MOV  R3,#0         ;8位數(shù)清為0
LL:      JNB  IRIN,I4       ;等 IR 變?yōu)榈碗娖?br />           CALL  DEL
          JMP  LL
I4:      JB  IRIN,I5        ;等 IR 變?yōu)楦唠娖?br />           CALL  DEL
          JMP  I4
I5:      MOV  R2,#0         ;0.14ms 計(jì)數(shù)
L1:      CALL  DEL
          JB  IRIN, N1       ;等 IR 變?yōu)楦唠娖?br />                              ;IR=0,檢查R2中的計(jì)數(shù)值
          MOV  A,#8
          CLR  C
          SUBB  A,R2         ;判斷高低位
                             ;IF C=0  BIT=0
          MOV  A,@R0
          RRC  A
          MOV  @R0,A         ;處理完一位
          INC  R3
          CJNE  R3,#8,LL     ;需處理完8位
          MOV  R3,#0
          INC  R0
          CJNE  R0,#24H,LL   ;收集到4字節(jié)了
          JMP   IR_SHOW
N1:      INC  R2
          CJNE  R2,#30,L1    ;0.14ms 計(jì)數(shù)過(guò)長(zhǎng)則時(shí)間到自動(dòng)離開(kāi)

IR_OUT:   POP  PSW
          POP  ACC
          SETB  EA
          RETI

;------------------------------------------------------------------
IR_SHOW:
          MOV A,22H
          CPL A                ;將22H取反后和23H比較
          CJNE A,23H,IR_SHOW1  ;如果不等表示接收數(shù)據(jù)發(fā)生錯(cuò)誤,放棄。
          CALL   CONV
          CALL  BEEP_BL        ;蜂鳴器鳴響表示解碼成功
IR_SHOW1:
          JMP  IR_OUT
;===============================================
;編碼轉(zhuǎn)換為 ASCII 碼并顯示
;===============================================
CONV:
          MOV   X,#5        ;設(shè)置顯示起始位置
          MOV   A,22H
          ANL   A,#0F0H      ;取出高四位二進(jìn)制數(shù)
          SWAP  A            ;高四位與低四位互換
          PUSH  ACC          ;壓入堆棧
          CLR   C            ;C=0
          SUBB  A,#0AH       ;減10
          POP   ACC          ;彈出堆棧
          JC    ASCII0       ;該數(shù)小于10,轉(zhuǎn)ASCII0
          ADD   A,#07H       ;大于10的數(shù)加上37H
ASCII0:   ADD   A,#30H       ;小于10的數(shù)加上30H
          MOV   B,X
          CALL  LCDP3

          MOV   A,22H
          ANL   A,#0FH        ;取出低四位二進(jìn)制數(shù)
          PUSH  ACC
          CLR   C
          SUBB  A,#0AH        ;減10
          POP   ACC
          JC    ASCII1        ;該數(shù)小于10,轉(zhuǎn)ASCII0
          ADD   A,#07H        ;大于10的數(shù)加上37H
ASCII1:   ADD   A,#30H        ;小于10的數(shù)加上30H
          INC   X
          MOV   B,X
          CALL  LCDP3

          MOV   X,#5         ;設(shè)置顯示起始位置
          MOV   A,23H        ;反碼
          ANL   A,#0F0H      ;取出高四位二進(jìn)制數(shù)
          SWAP  A            ;高四位與低四位互換
          PUSH  ACC          ;壓入堆棧
          CLR   C            ;C=0
          SUBB  A,#0AH       ;減10
          POP   ACC          ;彈出堆棧
          JC    ASCII2       ;該數(shù)小于10,轉(zhuǎn)ASCII0
          ADD   A,#07H       ;大于10的數(shù)加上37H
ASCII2:   ADD   A,#30H       ;小于10的數(shù)加上30H
          MOV   B,X
          CALL  LCDP4

          MOV   A,23H
          ANL   A,#0FH        ;取出低四位二進(jìn)制數(shù)
          PUSH  ACC
          CLR   C
          SUBB  A,#0AH        ;減10
          POP   ACC
          JC    ASCII3        ;該數(shù)小于10,轉(zhuǎn)ASCII0
          ADD   A,#07H        ;大于10的數(shù)加上37H
ASCII3:   ADD   A,#30H        ;小于10的數(shù)加上30H
          INC   X
          MOV   B,X
          CALL  LCDP4
          RET
;===================================================
;蜂鳴器響一聲子程序
;===================================================
BEEP_BL:
         MOV  R6,#100
  BL1:   CALL  DEX1
         CPL  BEEP
         DJNZ  R6,BL1
         MOV  R5,#25
         CALL  DELAY
         RET
DEX1:   MOV  R7,#180
DEX2:   NOP
         DJNZ  R7,DEX2
         RET
DELAY:                    ;延時(shí)R5×10MS
         MOV  R6,#50
  D1:    MOV  R7,#100
         DJNZ  R7,$
         DJNZ  R6,D1
         DJNZ  R5,DELAY
         RET
;===============================================
; DELAY  R5*0.14MS
DEL:
          MOV  R5,#1       ;IR解碼使用
DEL0:     MOV  R6,#2
DEL1:     MOV  R7,#32
DEL2:     DJNZ  R7,DEL2
          DJNZ  R6,DEL1
          DJNZ  R5,DEL0
          RET

DELAY1:                    ;延時(shí)5MS
         MOV  R6,#25
  DL2:   MOV  R7,#100
         DJNZ  R7,$
         DJNZ  R6,DL2
         RET
;================================================
        END


更多詳情參考附件文檔

游客,如果您要查看本帖隱藏內(nèi)容請(qǐng)回復(fù)

0

主題

11

帖子

62

積分

一級(jí)會(huì)員

Rank: 1

積分
62
沙發(fā)
發(fā)表于 2022-2-24 15:33:41 | 只看該作者
感謝分享,謝謝

發(fā)表回復(fù)

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表