本帖最后由 2449748936 于 2021-12-13 16:52 編輯
ORG 00H ;主程序起始地址
JMP START ;跳至主程序
ORG 0BH ;T0中斷起始地址
JMP TIM0 ;跳至T0中斷子程序 設置初值
START: MOV TMOD,#00000001B ;設T0在MODE1
MOV IE,#10000010B ;開通中斷
SETB TR0 ;啟動定時器T0 啟動定時器
L1: ACALL KEY ;調用KEY,判斷是否有鍵按下 開始掃描
CLR EA ; 中斷屏蔽
JB F0,L1 ;沒按則F0=1,有按則F0=0
MOV A,22H ;將取碼指針暫存地址載入A
RL A ;向左移1位乘
MOV DPTR,#TABLE ;存表
MOVC A,@A+DPTR ;至TABLE取碼,取T的值
MOV TH0,A ;取到的高位字節存入TH0
MOV 21H,A ;取到的高位字節存入(21H)
MOV A,22H ;再載入取碼指針值
RL A ;向左移1位
INC A ;加1
MOVC A,@A+DPTR ;至表取低位字節計數值
MOV TL0,A ;取到的低位字節存入TL0 取碼裝入定
MOV 20H,A ;取低位字節存入(20H) 時器初值
L2: ACALL KEY ;調用KEY判斷有按否?
SETB EA ;開通中斷
JB F0,L1 ;有按否?
JMP L2 ;有則跳至L2 再掃描確認
KEY: SETB F0 ;設F0=1
MOV R3,#0F7H ;掃描初值(P3.3=0)
MOV R1,#00H ;取碼指針初值
L3: MOV A,R3 ;載入掃描指針
MOV P3,A ;輸出至P3,開始掃描
MOV A,P3 ;讀入P3
SETB C ;令C=1
MOV R5,#04H ;檢測P3.7~P3.4
L4: RLC A ;左移一位
JNC KEYIN ;檢測行C=0,表示被按
INC R1 ;沒按則取碼指針加1
DJNZ R5,L4 ;4列檢測完畢了?
MOV A,R3 ;載入掃描指針
SETB C ;使C=1
RRC A ; 掃描下一行
MOV R3,A ;存回R3掃描指針寄存器
JC L3 ;C=0表示行掃描完畢
RET ;子程序返回 掃描子程序
KEYIN: MOV 22H,R1 ;取碼指針存入22H地址
CLR F0 ;令F0=0 存指針并標出
RET ;子程序返回 有按鍵(F0=0)
TIM0: PUSH ACC ;將A的值暫存堆棧
PUSH PSW ;將PSW的值暫存于堆棧
MOV TL0,20H ;重設計數值
MOV TH0,21H ;
CPL P1.5 ;將P2.4位反相
POP PSW ;至堆棧取回PSW的值
POP ACC ;至堆棧取回A的值
RETI ;返回主程序 中斷子程序
TABLE: DW 64021,64103,64260,64400 ;
DW 64524,64580,64684,64777 ;
DW 64820,64898,64968,65030 ;
DW 65058,65110,65157,65178 ; 編碼表
END ; 程序結束
程序如上圖所示,單片機下載后有四個按鍵按下后不會自動終止,需要再次點擊第一個按鍵才能終止是為什么?
|