?? 6t.asm
字號:
;*************************************
;* (SEND.ASM) *
;* 十五路遙控發送控制器 *
;* 2001.7.18 *
;*************************************
;
;**********************************************************************
;* *
;* KEYX0 P1.0 1 40 VCC *
;* KEYX1 P1.1 2 39 P0.0 KEYY0 *
;* KEYX2 P1.2 3 38 P0.1 KEYY1 *
;* KEYX3 P1.3 4 37 P0.2 KEYY2 *
;* P1.4 5 36 P0.3 KEYY3 *
;* P1.5 6 35 P0.4 KEYY4 *
;* P1.6 7 34 P0.5 KEYY5 *
;* P1.7 8 33 P0.6 KEYY6 *
;* RST 9 32 P0.7 KEYY7 *
;* P3.0 10 MCS-51 31 EA VDD *
;* P3.1 11 30 ALE *
;* P3.2 12 29 PSEN *
;* P3.3 13 28 P2.7 *
;* P3.4 14 27 P2.6 *
;* REMOTEOUT T1 P3.5 15 26 P2.5 *
;* P3.6 16 25 P2.4 *
;* P3.7 17 24 P2.3 *
;* XTAL2 18 23 P2.2 *
;* XTAL1 19 22 P2.1 *
;* VSS 20 21 P2.0 *
;* *
;* *
;**********************************************************************
;
;
;
;偽定義
KEYX0 EQU P1.0 ;P1.0 -- P1.3位鍵盤行掃描
KEYX1 EQU P1.1 ;本系統采用4 * 8 鍵盤陣列
KEYX2 EQU P1.2
KEYX3 EQU P1.3
KEYY EQU P0 ;P0 口鍵盤列掃描
;
;
;
;
;*************************************
;* *
;* 主程序和中斷程序入口 *
;* *
;*************************************
ORG 0000H ;程序執行開始地址
AJMP START ;跳至START執行
ORG 0003H ;外中斷0中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 000BH ;定時器T0中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 0013H ;外中斷1中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 001BH ;定時器T1中斷入口地址
LJMP INTT1 ;跳至INTT1中斷服務程序
ORG 0023H ;串行口中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 002BH ;定時器T2中斷入口地址
RETI ;中斷返回(不開中斷)
;
;*************************************
;* *
;* 初 始 化 程 序 *
;* *
;*************************************
CLEARMEMIO: CLR A ;A清0
DEC A ;A為#0FFH
MOV P0,A ;P0-P3口置1
MOV P1,A ;
MOV P2,A ;
MOV P3,A ;
CLR P3.5 ;關遙控輸出
CLEARMEM: MOV SP,#70H ;設堆?;窞?0H
MOV IE,#00H ;關所有中斷
MOV IP,#01H ;設優先級
MOV TMOD,#22H ;8位自動重裝初值模式
MOV TH1,#0F3H ;定時為13微秒初值
MOV TL1,#0F3H ;
SETB EA ;開總中斷允許
RET ;返回
;
;
;
;
;*************************************
;* *
;* 主 程 序 *
;* *
;*************************************
START: LCALL CLEARMEMIO ;調用初始化子程序
;
MAIN: LCALL KEYWORK ;主體程序。調用查鍵子程序
LJMP MAIN ;轉MAIN循環
NOP ;PC值出錯處理
NOP
NOP
LJMP START ;重新初始化
;
;*************************************
;* *
;* T1中斷服務程序 *
;* *
;*************************************
INTT1: CPL P3.5 ;40KHZ紅外線遙控信號產生
RETI ;中斷返回
;
;
;*************************************
;* *
;* 鍵盤工作子程序(4 * 8 陣列) *
;* 出口為各鍵工作程序入口 *
;*************************************
KEYWORK: MOV KEYY,#0FFH ;置列線輸入狀態
CLR KEYX0 ;行線(P1口)全置0
CLR KEYX1
CLR KEYX2
CLR KEYX3
MOV A,KEYY ;讀入P0口值
MOV B,A ;KEYY口值暫存B中
CJNE A,#0FFH,KEYHIT ;不等于#0FFH,轉KEYHIT(有鍵按下)
KEYOUT: RET ;沒有鍵按下返回
;
KEYHIT: LCALL DL10MS ;延時去抖動
MOV A,KEYY ;再讀入P0口值至A
CJNE A,B,KEYOUT ;A不等于B(是干擾),子程序返回
SETB KEYX1 ;有鍵按下,找鍵號開始,查0行
SETB KEYX2
SETB KEYX3
MOV A,KEYY ;讀入P0口值
CJNE A,#0FFH,KEYVAL0 ;P0不等于#0FFH,按下鍵在第0行
SETB KEYX0 ;不在第0行,開始查1行
CLR KEYX1
MOV A,KEYY ;讀入P0口值
CJNE A,#0FFH,KEYVAL1 ;P0口不等于#0FFH,按下鍵在第1行
SETB KEYX1 ;不在第1行,開始查2行
CLR KEYX2
MOV A,KEYY ;讀入P0口值
CJNE A,#0FFH,KEYVAL2 ;P0口不等于#0FFH,按下鍵在第2行
SETB KEYX2 ;不在第2行,開始查3行
CLR KEYX3
MOV A,KEYY ;讀入P0口值
CJNE A,#0FFH,KEYVAL3 ;P0口不等于#0FFH,按下鍵在第3行
LJMP KEYOUT ;不在第3行,子程序返回
;
KEYVAL0: MOV R2,#00H ;按下鍵在第0行,R2賦行號初值0
LJMP KEYVAL4 ;跳到KEYVAL4
;
KEYVAL1: MOV R2,#08H ;按下鍵在第1行,R2賦行號初值8
LJMP KEYVAL4 ;跳到KEYVAL4
;
KEYVAL2: MOV R2,#10H ;按下鍵在第2行,R2賦行號初值16
LJMP KEYVAL4 ;跳到KEYVAL4
;
KEYVAL3: MOV R2,#18H ;按下鍵在第3行,R2賦行號初值24
LJMP KEYVAL4 ;跳到KEYVAL4
;
KEYVAL4: MOV DPTR,#KEYVALTAB ;鍵值翻譯成連續數字
MOV B,A ;P0口值暫存B內
CLR A ;清A
MOV R0,A ;清R0
KEYVAL5: MOV A,R0 ;查列號開始,R0數據放入A
SUBB A,#08H ;A中數減8
JNC KEYOUT ;借位C為0,查表出錯,返回
MOV A,R0 ;查表次數小于8,繼續查,
MOVC A,@A+DPTR ;查列號表
INC R0 ;R0加1
CJNE A,B,KEYVAL5 ;查得值和P0口值不等,轉KEYVAL5再查
DEC R0 ;查得值和P0口值相等,R0減1
MOV A,R0 ;放入A(R0中數值即為列號值)
ADD A,R2 ;與行號初值相加成為鍵號值(0-31)
MOV B,A ;鍵號乘3處理用于JMP散轉指令
RL A ;鍵號乘3處理用于JMP散轉指令
ADD A,B ;鍵號乘3處理用于JMP散轉指令
MOV DPTR,#KEYFUNTAB ;取散轉功能程序(表)首址
JMP @A+DPTR ;散轉至對應功能程序標號
KEYFUNTAB: LJMP KEYFUN00 ;跳到鍵號0對應功能程序標號
LJMP KEYFUN01 ;跳到鍵號1對應功能程序標號
LJMP KEYFUN02 ;跳到鍵號2對應功能程序標號
LJMP KEYFUN03 ;跳到鍵號3對應功能程序標號
LJMP KEYFUN04 ;跳到鍵號4對應功能程序標號
LJMP KEYFUN05 ;跳到鍵號5對應功能程序標號
LJMP KEYFUN06 ;跳到鍵號6對應功能程序標號
LJMP KEYFUN07 ;跳到鍵號7對應功能程序標號
LJMP KEYFUN08 ;跳到鍵號8對應功能程序標號
LJMP KEYFUN09 ;跳到鍵號9對應功能程序標號
LJMP KEYFUN10 ;跳到鍵號10對應功能程序標號
LJMP KEYFUN11 ;跳到鍵號11對應功能程序標號
LJMP KEYFUN12 ;跳到鍵號12對應功能程序標號
LJMP KEYFUN13 ;跳到鍵號13對應功能程序標號
LJMP KEYFUN14 ;跳到鍵號14對應功能程序標號
LJMP KEYFUN15 ;跳到鍵號15對應功能程序標號
LJMP KEYFUN16 ;跳到鍵號16對應功能程序標號
LJMP KEYFUN17 ;跳到鍵號17對應功能程序標號
LJMP KEYFUN18 ;跳到鍵號18對應功能程序標號
LJMP KEYFUN19 ;跳到鍵號19對應功能程序標號
LJMP KEYFUN20 ;跳到鍵號20對應功能程序標號
LJMP KEYFUN21 ;跳到鍵號21對應功能程序標號
LJMP KEYFUN22 ;跳到鍵號22對應功能程序標號
LJMP KEYFUN23 ;跳到鍵號23對應功能程序標號
LJMP KEYFUN24 ;跳到鍵號24對應功能程序標號
LJMP KEYFUN25 ;跳到鍵號25對應功能程序標號
LJMP KEYFUN26 ;跳到鍵號26對應功能程序標號
LJMP KEYFUN27 ;跳到鍵號27對應功能程序標號
LJMP KEYFUN28 ;跳到鍵號28對應功能程序標號
LJMP KEYFUN29 ;跳到鍵號29對應功能程序標號
LJMP KEYFUN30 ;跳到鍵號30對應功能程序標號
LJMP KEYFUN31 ;跳到鍵號31對應功能程序標號
RET
;列號對應數據表
KEYVALTAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH
;對應列號: 0 1 2 3 4 5 6 7
RET
;
KEYFUN00: MOV A,#02H ;發2個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN01: MOV A,#03H ;發3個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN02: MOV A,#04H ;發4個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN03: MOV A,#05H ;發5個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN04: MOV A,#06H ;發6個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN05: MOV A,#07H ;發7個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN06: MOV A,#08H ;發8個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN07: MOV A,#09H ;發9個脈沖
LJMP REMOTE ;轉發送程序
RET
;
;
KEYFUN08: MOV A,#0AH ;發10個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN09: MOV A,#0BH ;發11個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN10: MOV A,#0CH ;發12個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN11: MOV A,#0DH ;發13個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN12: MOV A,#0EH ;發14個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN13: MOV A,#0FH ;發15個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN14: MOV A,#10H ;發16個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN15: MOV A,#11H ;發17個脈沖
LJMP REMOTE ;轉發送程序
RET
KEYFUN16: RET ;備用功能
KEYFUN17: RET ;備用功能
KEYFUN18: RET ;備用功能
KEYFUN19: RET ;備用功能
KEYFUN20: RET ;備用功能
KEYFUN21: RET ;備用功能
KEYFUN22: RET
KEYFUN23: RET
KEYFUN24: RET
KEYFUN25: RET
KEYFUN26: RET
KEYFUN27: RET
KEYFUN28: RET
KEYFUN29: RET
KEYFUN30: RET
KEYFUN31: RET ;備用功能
;
;
;*************************************
;* *
;* 編 碼 發 射 程 序 *
;* *
;*************************************
;
REMOTE: MOV R1,A ;裝入發射脈沖個數
LJMP OUT3 ;轉第一個碼發射處理
OUT: MOV R0,#55H ;1MS寬低電平發射控制數據
OUT1: SETB ET1 ;開T1中斷
SETB TR1 ;開啟定時器T1
NOP ;延時
NOP
NOP
NOP
NOP
DJNZ R0,OUT1 ;時間不到轉OUT1再循環
MOV R0,#32H ;1MS高電平間隙控制數據
OUT2: CLR TR1 ;關定時器T1
CLR ET1 ;關T1中斷
CLR P3.5 ;關脈沖輸出
NOP ;空操作延時
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R0,OUT2 ;時間不到轉OUT2再循環
DJNZ R1,OUT ;脈沖未發完,轉OUT再循環發射
LCALL DL500MS ;
RET ;
OUT3: MOV R0,#0FFH ;裝發謝3MS寬控制數據
LJMP OUT1 ;轉OUT1
;
;*************************************
;* *
;* 延時513 US *
;* *
;*************************************
;
;513微秒延時程序
DELAY: MOV R2,#0FFH
DELAY1: DJNZ R2,DELAY1
RET
;
;
;
;*************************************
;* *
;* 延時10MS *
;* *
;*************************************
;
;10毫秒延時程序
DL10MS: MOV R3,#14H
DL10MS1: LCALL DELAY
DJNZ R3,DL10MS1
RET
;500毫秒延時程序
DL500MS: MOV R4,#32H
DL500MS1: LCALL DL10MS
DJNZ R4,DL500MS1
RET
;
END ;程序結束
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -