
源程序: ;******************************************************************************** ;* 標(biāo)題: 偉納電子ME300B單片機(jī)開發(fā)系統(tǒng)演示程序 - 12864LCD顯示遙控鍵值讀取器 * ;* 文件: IR_12864LCD.asm * ;* 日期: 2005-3-20 * ;* 版本: 1.0 * ;* 作者: gguoqing * ;* 郵箱: gguoqing@willar.com * ;* 網(wǎng)站: http://www.willar.com ; * ;******************************************************************************** ;* 描述: * ;* 12864LCD(帶漢字庫(kù))顯示遙控鍵值讀取器 * ;* LCD型號(hào):TS12864A-3(帶漢字庫(kù))或兼容型號(hào) 控制器ST7920 * ;* MCU:AT89S52 ,晶體頻率:11.0592MHz * ;* P0口為128*64LCD的數(shù)據(jù) D0-D7 * ;* K17鍵按下,繼電器吸合。K19鍵按下,繼電器關(guān)閉 * ;* 顯示程序在中斷服務(wù)程序之中 * * ;* * ;* * ;******************************************************************************** ;* 【版權(quán)】 Copyright(C)偉納電子 www.willar.com All Rights Reserved * ;* 【聲明】 此程序僅用于學(xué)習(xí)與參考,引用請(qǐng)注明版權(quán)和作者信息! * ;********************************************************************************
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 ;開顯示,關(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 ;寫入命令 CALL CLR_LINE ;清除該行字符數(shù)據(jù) MOV A,#80H ;設(shè)置 LCD 的第一行地址 CALL WCOM ;寫入命令 JMP FILL
LINE2: CJNE A,#2,LINE3 ;判斷是否為第三行 MOV A,#090H ;設(shè)置 LCD 的第三行地址 CALL WCOM ;寫入命令 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 ;寫入命令 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 ;寫入命令 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 ;寫入數(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.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 ;============================================= ;寫數(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 ;寫入命令 POP ACC ;由堆棧取出A CALL WDATA ;寫入數(shù)據(jù) RET
LCDP4: ;在LCD的第四行顯示字符 PUSH ACC ; MOV A,B ;設(shè)置顯示地址 ADD A,#098H ;設(shè)置LCD的第四行地址 CALL WCOM ;寫入命令 POP ACC ;由堆棧取出A CALL WDATA ;寫入數(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)離開
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 |
|