演示圖片:
源程序:
;*??描述:???????????????????????????????????????????????????????????????????????*
;*?????????12864LCD(帶漢字庫)顯示遙控鍵值讀取器?????????????????????????????????*
;*?????????LCD型號:TS12864A-3(帶漢字庫)或兼容型號??????控制器ST7920??????????*
;*?????????MCU:AT89S52?,晶體頻率:11.0592MHz????????????????????????????????????*
;*?????????P0口為128*64LCD的數據?D0-D7??????????????????????????????????????????*
;*?????????K17鍵按下,繼電器吸合。K19鍵按下,繼電器關閉?????????????????????????*
;*?????????顯示程序在中斷服務程序之中???????????????????????????????????????????*???????????????????????????????????*
;*??????????????????????????????????????????????????????????????????????????????*
;*??????????????????????????????????????????????????????????????????????????????*
;****************************************************************
;*?【版權】?Copyright(C)偉納電子?www.willar.com??All?Rights?Reserved????????????*
;*?【聲明】?此程序僅用于學習與參考,引用請注明版權和作者信息!??????????????????*
;******************************************************************
????????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????????;中斷服務程序
;------------------------------------------------
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?????;觸發方式為脈沖負邊沿觸發
??????????SETB??IRIN
??????????SETB?RST
???NOP
???SETB?PSB????????????;8位數據,并口
??????????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???????????;繼電器關閉
LOOP3:????JMP???LOOP1
;=============================================
;??LCD?初始化設置
;=============================================-
SET_LCD:
??????????CLR??EN
??????????MOV??A,#34H?????;34H--擴充指令操作
??????????CALL??WCOM
??????????CALL??DELAY1
??????????MOV??A,#30H?????;30H--基本指令操作
??????????CALL??WCOM
??????????CALL??DELAY1
??????????MOV??A,#0CH?????;開顯示,關光標,
??????????CALL??WCOM
??????????CALL??DELAY1
??????????MOV??A,#01H?????;清除?LCM?顯示屏
??????????CALL??WCOM
??????????CALL??DELAY1
??????????RET
;===================================================
;在?LCM?各行顯示信息字符
;===================================================
LCD_SHOW:
??????????CJNE??A,#1,LINE2??;判斷是否為第一行
??LINE1:??MOV??A,#80H???????;設置?LCD?的第一行地址
??????????CALL??WCOM????????;寫入命令
??????????CALL??CLR_LINE????;清除該行字符數據
??????????MOV??A,#80H???????;設置?LCD?的第一行地址
??????????CALL??WCOM????????;寫入命令
??????????JMP??FILL
??LINE2:??CJNE??A,#2,LINE3??;判斷是否為第三行
??????????MOV??A,#090H??????;設置?LCD?的第三行地址
??????????CALL??WCOM????????;寫入命令
??????????CALL??CLR_LINE????;清除該行字符數據
??????????MOV??A,#090H??????;設置?LCD?的第三行地址
??????????CALL??WCOM
??????????JMP??FILL
??LINE3:??CJNE??A,#3,LINE4??;判斷是否為第三行
??????????MOV??A,#088H??????;設置?LCD?的第三行地址
??????????CALL??WCOM????????;寫入命令
??????????CALL??CLR_LINE????;清除該行字符數據
??????????MOV??A,#088H??????;設置?LCD?的第三行地址
??????????CALL??WCOM
??????????JMP??FILL
??LINE4:??CJNE??A,#4,LINE5??;判斷是否為第三行
??????????MOV??A,#098H??????;設置?LCD?的第三行地址
??????????CALL??WCOM????????;寫入命令
??????????CALL??CLR_LINE????;清除該行字符數據
??????????MOV??A,#098H??????;設置?LCD?的第三行地址
??????????CALL??WCOM
??FILL:???CLR??A????????????;填入字符
??????????MOVC??A,@A+DPTR???;由消息區取出字符
??????????CJNE??A,#0,LC1????;判斷是否為結束碼
??LINE5:??RET
??LC1:????CALL??WDATA???????;寫入數據
??????????INC??DPTR?????????;指針加1
??????????JMP??FILL?????????;繼續填入字符
??????????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.willar.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
;==============================================
;?寫指令使能子程序
;RS=L,RW=L,D0-D7=指令碼,E=高脈沖
;==============================================
WCOM:
??????????MOV??P0,A
??????????CLR?RS
??????????CLR?RW
??????????SETB?EN
??????????CALL??DELAY0
??????????CLR?EN
??????????RET
;=============================================
;寫數據使能子程序
;RS=H,RW=L,D0-D7=數據,E=高脈沖
;=============================================
WDATA:
??????????MOV???P0,A
??????????SETB??RS
??????????CLR???RW
??????????SETB??EN
??????????CALL??DELAY0
??????????CLR???EN
??????????RET
DELAY0:???MOV??R7,#250??????;延時500微秒
??????????DJNZ??R7,$
??????????RET
;===============================================
;在?LCM?第三行、第四行顯示字符
;A=ASC?DATA,?B=LINE?X?POS
;===============================================
LCDP3:????????????????????;在LCD的第三行顯示字符
?????????PUSH??ACC????????;
?????????MOV??A,B?????????;設置顯示地址
?????????ADD??A,#088H?????;設置LCD的第三行地址
?????????CALL??WCOM???????;寫入命令
?????????POP??ACC?????????;由堆棧取出A
?????????CALL??WDATA??????;寫入數據
?????????RET
LCDP4:????????????????????;在LCD的第四行顯示字符
?????????PUSH??ACC????????;
?????????MOV??A,B?????????;設置顯示地址
?????????ADD??A,#098H?????;設置LCD的第四行地址
?????????CALL??WCOM???????;寫入命令
?????????POP??ACC?????????;由堆棧取出A
?????????CALL??WDATA??????;寫入數據
?????????RET
;=================================================
;?IR?譯碼子程序
;中斷服務程序
;=================================================
IR_IN:
??????????CLR?EA?????????;暫時關閉CPU的所有中斷請求
??????????PUSH??ACC
??????????PUSH??PSW
??????????SETB??PSW.3?????;選擇工作寄存器組1
??????????CLR???PSW.4
??????????MOV???R0,#IRCOM
??????????MOV??R1,#04H
I1:???????JNB??IRIN,I2???????;等待?IR?信號出現
??????????LCALL?CONV
??????????DJNZ??R1,I1
??????????JMP??IR_OUT
?I2:??????MOV??R4,#20
?I20:?????CALL??DEL
??????????DJNZ??R4,I20
??????????JB??IRIN,I1????????;確認IR信號出現
?I21:?????JB??IRIN,I3????????;等?IR?變為高電平
??????????CALL??DEL
??????????JMP??I21
?I3:??????MOV??R3,#0?????????;8位數清為0
?LL:??????JNB??IRIN,I4???????;等?IR?變為低電平
??????????CALL??DEL
??????????JMP??LL
?I4:??????JB??IRIN,I5????????;等?IR?變為高電平
??????????CALL??DEL
??????????JMP??I4
?I5:??????MOV??R2,#0?????????;0.14ms?計數
?L1:??????CALL??DEL
??????????JB??IRIN,?N1???????;等?IR?變為高電平
?????????????????????????????;IR=0,檢查R2中的計數值
??????????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字節了
??????????JMP???IR_SHOW
?N1:??????INC??R2
??????????CJNE??R2,#30,L1????;0.14ms?計數過長則時間到自動離開
IR_OUT:???POP??PSW
??????????POP??ACC
??????????SETB??EA
??????????RETI
;------------------------------------------------------------------
IR_SHOW:
??????????MOV?A,22H
??????????CPL?A????????????????;將22H取反后和23H比較
??????????CJNE?A,23H,IR_SHOW1??;如果不等表示接收數據發生錯誤,放棄。
??????????CALL???CONV
??????????CALL??BEEP_BL????????;蜂鳴器鳴響表示解碼成功
IR_SHOW1:
??????????JMP??IR_OUT
;===============================================
;編碼轉換為?ASCII?碼并顯示
;===============================================
CONV:
??????????MOV???X,#5????????;設置顯示起始位置
??????????MOV???A,22H
??????????ANL???A,#0F0H??????;取出高四位二進制數
??????????SWAP??A????????????;高四位與低四位互換
??????????PUSH??ACC??????????;壓入堆棧
??????????CLR???C????????????;C=0
??????????SUBB??A,#0AH???????;減10
??????????POP???ACC??????????;彈出堆棧
??????????JC????ASCII0???????;該數小于10,轉ASCII0
??????????ADD???A,#07H???????;大于10的數加上37H
ASCII0:???ADD???A,#30H???????;小于10的數加上30H
??????????MOV???B,X
??????????CALL??LCDP3
??????????MOV???A,22H
??????????ANL???A,#0FH????????;取出低四位二進制數
??????????PUSH??ACC
??????????CLR???C
??????????SUBB??A,#0AH????????;減10
??????????POP???ACC
??????????JC????ASCII1????????;該數小于10,轉ASCII0
??????????ADD???A,#07H????????;大于10的數加上37H
ASCII1:???ADD???A,#30H????????;小于10的數加上30H
??????????INC???X
??????????MOV???B,X
??????????CALL??LCDP3
??????????MOV???X,#5?????????;設置顯示起始位置
??????????MOV???A,23H????????;反碼
??????????ANL???A,#0F0H??????;取出高四位二進制數
??????????SWAP??A????????????;高四位與低四位互換
??????????PUSH??ACC??????????;壓入堆棧
??????????CLR???C????????????;C=0
??????????SUBB??A,#0AH???????;減10
??????????POP???ACC??????????;彈出堆棧
??????????JC????ASCII2???????;該數小于10,轉ASCII0
??????????ADD???A,#07H???????;大于10的數加上37H
ASCII2:???ADD???A,#30H???????;小于10的數加上30H
??????????MOV???B,X
??????????CALL??LCDP4
??????????MOV???A,23H
??????????ANL???A,#0FH????????;取出低四位二進制數
??????????PUSH??ACC
??????????CLR???C
??????????SUBB??A,#0AH????????;減10
??????????POP???ACC
??????????JC????ASCII3????????;該數小于10,轉ASCII0
??????????ADD???A,#07H????????;大于10的數加上37H
ASCII3:???ADD???A,#30H????????;小于10的數加上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:????????????????????;延時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:????????????????????;延時5MS
?????????MOV??R6,#25
??DL2:???MOV??R7,#100
?????????DJNZ??R7,$
?????????DJNZ??R6,DL2
?????????RET
;================================================
????????END
源程序:
;*??描述:???????????????????????????????????????????????????????????????????????*
;*?????????12864LCD(帶漢字庫)顯示遙控鍵值讀取器?????????????????????????????????*
;*?????????LCD型號:TS12864A-3(帶漢字庫)或兼容型號??????控制器ST7920??????????*
;*?????????MCU:AT89S52?,晶體頻率:11.0592MHz????????????????????????????????????*
;*?????????P0口為128*64LCD的數據?D0-D7??????????????????????????????????????????*
;*?????????K17鍵按下,繼電器吸合。K19鍵按下,繼電器關閉?????????????????????????*
;*?????????顯示程序在中斷服務程序之中???????????????????????????????????????????*???????????????????????????????????*
;*??????????????????????????????????????????????????????????????????????????????*
;*??????????????????????????????????????????????????????????????????????????????*
;****************************************************************
;*?【版權】?Copyright(C)偉納電子?www.willar.com??All?Rights?Reserved????????????*
;*?【聲明】?此程序僅用于學習與參考,引用請注明版權和作者信息!??????????????????*
;******************************************************************
????????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????????;中斷服務程序
;------------------------------------------------
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?????;觸發方式為脈沖負邊沿觸發
??????????SETB??IRIN
??????????SETB?RST
???NOP
???SETB?PSB????????????;8位數據,并口
??????????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???????????;繼電器關閉
LOOP3:????JMP???LOOP1
;=============================================
;??LCD?初始化設置
;=============================================-
SET_LCD:
??????????CLR??EN
??????????MOV??A,#34H?????;34H--擴充指令操作
??????????CALL??WCOM
??????????CALL??DELAY1
??????????MOV??A,#30H?????;30H--基本指令操作
??????????CALL??WCOM
??????????CALL??DELAY1
??????????MOV??A,#0CH?????;開顯示,關光標,
??????????CALL??WCOM
??????????CALL??DELAY1
??????????MOV??A,#01H?????;清除?LCM?顯示屏
??????????CALL??WCOM
??????????CALL??DELAY1
??????????RET
;===================================================
;在?LCM?各行顯示信息字符
;===================================================
LCD_SHOW:
??????????CJNE??A,#1,LINE2??;判斷是否為第一行
??LINE1:??MOV??A,#80H???????;設置?LCD?的第一行地址
??????????CALL??WCOM????????;寫入命令
??????????CALL??CLR_LINE????;清除該行字符數據
??????????MOV??A,#80H???????;設置?LCD?的第一行地址
??????????CALL??WCOM????????;寫入命令
??????????JMP??FILL
??LINE2:??CJNE??A,#2,LINE3??;判斷是否為第三行
??????????MOV??A,#090H??????;設置?LCD?的第三行地址
??????????CALL??WCOM????????;寫入命令
??????????CALL??CLR_LINE????;清除該行字符數據
??????????MOV??A,#090H??????;設置?LCD?的第三行地址
??????????CALL??WCOM
??????????JMP??FILL
??LINE3:??CJNE??A,#3,LINE4??;判斷是否為第三行
??????????MOV??A,#088H??????;設置?LCD?的第三行地址
??????????CALL??WCOM????????;寫入命令
??????????CALL??CLR_LINE????;清除該行字符數據
??????????MOV??A,#088H??????;設置?LCD?的第三行地址
??????????CALL??WCOM
??????????JMP??FILL
??LINE4:??CJNE??A,#4,LINE5??;判斷是否為第三行
??????????MOV??A,#098H??????;設置?LCD?的第三行地址
??????????CALL??WCOM????????;寫入命令
??????????CALL??CLR_LINE????;清除該行字符數據
??????????MOV??A,#098H??????;設置?LCD?的第三行地址
??????????CALL??WCOM
??FILL:???CLR??A????????????;填入字符
??????????MOVC??A,@A+DPTR???;由消息區取出字符
??????????CJNE??A,#0,LC1????;判斷是否為結束碼
??LINE5:??RET
??LC1:????CALL??WDATA???????;寫入數據
??????????INC??DPTR?????????;指針加1
??????????JMP??FILL?????????;繼續填入字符
??????????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.willar.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
;==============================================
;?寫指令使能子程序
;RS=L,RW=L,D0-D7=指令碼,E=高脈沖
;==============================================
WCOM:
??????????MOV??P0,A
??????????CLR?RS
??????????CLR?RW
??????????SETB?EN
??????????CALL??DELAY0
??????????CLR?EN
??????????RET
;=============================================
;寫數據使能子程序
;RS=H,RW=L,D0-D7=數據,E=高脈沖
;=============================================
WDATA:
??????????MOV???P0,A
??????????SETB??RS
??????????CLR???RW
??????????SETB??EN
??????????CALL??DELAY0
??????????CLR???EN
??????????RET
DELAY0:???MOV??R7,#250??????;延時500微秒
??????????DJNZ??R7,$
??????????RET
;===============================================
;在?LCM?第三行、第四行顯示字符
;A=ASC?DATA,?B=LINE?X?POS
;===============================================
LCDP3:????????????????????;在LCD的第三行顯示字符
?????????PUSH??ACC????????;
?????????MOV??A,B?????????;設置顯示地址
?????????ADD??A,#088H?????;設置LCD的第三行地址
?????????CALL??WCOM???????;寫入命令
?????????POP??ACC?????????;由堆棧取出A
?????????CALL??WDATA??????;寫入數據
?????????RET
LCDP4:????????????????????;在LCD的第四行顯示字符
?????????PUSH??ACC????????;
?????????MOV??A,B?????????;設置顯示地址
?????????ADD??A,#098H?????;設置LCD的第四行地址
?????????CALL??WCOM???????;寫入命令
?????????POP??ACC?????????;由堆棧取出A
?????????CALL??WDATA??????;寫入數據
?????????RET
;=================================================
;?IR?譯碼子程序
;中斷服務程序
;=================================================
IR_IN:
??????????CLR?EA?????????;暫時關閉CPU的所有中斷請求
??????????PUSH??ACC
??????????PUSH??PSW
??????????SETB??PSW.3?????;選擇工作寄存器組1
??????????CLR???PSW.4
??????????MOV???R0,#IRCOM
??????????MOV??R1,#04H
I1:???????JNB??IRIN,I2???????;等待?IR?信號出現
??????????LCALL?CONV
??????????DJNZ??R1,I1
??????????JMP??IR_OUT
?I2:??????MOV??R4,#20
?I20:?????CALL??DEL
??????????DJNZ??R4,I20
??????????JB??IRIN,I1????????;確認IR信號出現
?I21:?????JB??IRIN,I3????????;等?IR?變為高電平
??????????CALL??DEL
??????????JMP??I21
?I3:??????MOV??R3,#0?????????;8位數清為0
?LL:??????JNB??IRIN,I4???????;等?IR?變為低電平
??????????CALL??DEL
??????????JMP??LL
?I4:??????JB??IRIN,I5????????;等?IR?變為高電平
??????????CALL??DEL
??????????JMP??I4
?I5:??????MOV??R2,#0?????????;0.14ms?計數
?L1:??????CALL??DEL
??????????JB??IRIN,?N1???????;等?IR?變為高電平
?????????????????????????????;IR=0,檢查R2中的計數值
??????????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字節了
??????????JMP???IR_SHOW
?N1:??????INC??R2
??????????CJNE??R2,#30,L1????;0.14ms?計數過長則時間到自動離開
IR_OUT:???POP??PSW
??????????POP??ACC
??????????SETB??EA
??????????RETI
;------------------------------------------------------------------
IR_SHOW:
??????????MOV?A,22H
??????????CPL?A????????????????;將22H取反后和23H比較
??????????CJNE?A,23H,IR_SHOW1??;如果不等表示接收數據發生錯誤,放棄。
??????????CALL???CONV
??????????CALL??BEEP_BL????????;蜂鳴器鳴響表示解碼成功
IR_SHOW1:
??????????JMP??IR_OUT
;===============================================
;編碼轉換為?ASCII?碼并顯示
;===============================================
CONV:
??????????MOV???X,#5????????;設置顯示起始位置
??????????MOV???A,22H
??????????ANL???A,#0F0H??????;取出高四位二進制數
??????????SWAP??A????????????;高四位與低四位互換
??????????PUSH??ACC??????????;壓入堆棧
??????????CLR???C????????????;C=0
??????????SUBB??A,#0AH???????;減10
??????????POP???ACC??????????;彈出堆棧
??????????JC????ASCII0???????;該數小于10,轉ASCII0
??????????ADD???A,#07H???????;大于10的數加上37H
ASCII0:???ADD???A,#30H???????;小于10的數加上30H
??????????MOV???B,X
??????????CALL??LCDP3
??????????MOV???A,22H
??????????ANL???A,#0FH????????;取出低四位二進制數
??????????PUSH??ACC
??????????CLR???C
??????????SUBB??A,#0AH????????;減10
??????????POP???ACC
??????????JC????ASCII1????????;該數小于10,轉ASCII0
??????????ADD???A,#07H????????;大于10的數加上37H
ASCII1:???ADD???A,#30H????????;小于10的數加上30H
??????????INC???X
??????????MOV???B,X
??????????CALL??LCDP3
??????????MOV???X,#5?????????;設置顯示起始位置
??????????MOV???A,23H????????;反碼
??????????ANL???A,#0F0H??????;取出高四位二進制數
??????????SWAP??A????????????;高四位與低四位互換
??????????PUSH??ACC??????????;壓入堆棧
??????????CLR???C????????????;C=0
??????????SUBB??A,#0AH???????;減10
??????????POP???ACC??????????;彈出堆棧
??????????JC????ASCII2???????;該數小于10,轉ASCII0
??????????ADD???A,#07H???????;大于10的數加上37H
ASCII2:???ADD???A,#30H???????;小于10的數加上30H
??????????MOV???B,X
??????????CALL??LCDP4
??????????MOV???A,23H
??????????ANL???A,#0FH????????;取出低四位二進制數
??????????PUSH??ACC
??????????CLR???C
??????????SUBB??A,#0AH????????;減10
??????????POP???ACC
??????????JC????ASCII3????????;該數小于10,轉ASCII0
??????????ADD???A,#07H????????;大于10的數加上37H
ASCII3:???ADD???A,#30H????????;小于10的數加上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:????????????????????;延時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:????????????????????;延時5MS
?????????MOV??R6,#25
??DL2:???MOV??R7,#100
?????????DJNZ??R7,$
?????????DJNZ??R6,DL2
?????????RET
;================================================
????????END
評論