ORG 0000H ;初始位置00H
JMP STARET ;跳到主程序
ORG 000BH ;定時器0中斷起始單元
JMP TIME0 ;跳到中斷程序
STARET: MOV TMOD,#00000001B;設定工作方式為1
MOV IE, #10000010B ;開中斷允許
SETB TR0
L1: CALL KEY ;調用鍵盤掃描程序
CLR EA ;關中斷總允許
JB F0,L1 ;查詢鍵盤按下標志
MOV A,22H ;將鍵盤碼送單元A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR ;將查詢的數碼管顯示碼送A
MOV P0,A ;將數碼管顯示碼送數碼管
MOV A,22H ;將鍵盤碼送單元A
RL A ;數據倍乘
MOV DPTR,#TABLE
MOVC A,@A+DPTR;將聲音編碼送A
MOV TH0,A;將聲音編碼高位給TH0
MOV 21H,A;送聲音編碼給21H單元儲存
MOV A,22H
RL A
INC A
MOVC A,@A+DPTR;取聲音編碼地位給A
MOV TL0,A;將聲音編碼送TL0
MOV 20H,A;將聲音編碼低位送20H儲存
L2: CALL KEY;調用江畔掃描程序
SETB EA;開斷總允許
JB F0,L1;查詢鍵盤按下標志
JMP L2 ;沒有轉L2循環
/*******鍵盤掃描程序*********/
KEY: SETB F0 ;鍵盤按下標志至1
MOV R3,#0F7H;R3送掃描碼
MOV R1,#00H;R1初始為0
L3: MOV A,R3;將掃描碼送A
MOV P2,A;將掃描碼送描p2掃描
MOV A,P2;讀取鍵盤狀態
SETB C;進位至1
MOV R5,#04H;將4給R5單元,用于行掃描
L4: RLC A
JNC KEYIN;有鍵按下跳到KEYIN
INC R1;無鍵按下R1加1
DJNZ R5,L4;判斷一行有沒有判斷完畢
MOV A,R3;掃描完畢后,再次送掃描碼給A
SETB C;進位置1
RRC A;對A進行右移
MOV R3 ,A ;送新的掃描碼給R3
JC L3 ;判斷是否掃描完畢,是則循環
RET;返回主程序
KEYIN: MOV 22H,R1;將鍵盤碼送22H儲存
CLR F0;對鍵盤按下標志清0
RET;返回主程序
TIME0: PUSH ACC;將A壓入堆棧
PUSH PSW;將PSW壓入堆棧
MOV TL0,20H;將聲音編碼低位送TL0
MOV TH0,21H;將聲音編碼高位送TH0
CPL P1.0;對輸出口聲音信號取反
POP PSW;.從堆棧還原PSW
POP ACC;從堆棧還原ACC
RETI ;中斷返回
/********音符編碼***************/
TABLE: DW 64021,64103,64260,64400
DW 64524,64580,64684,64777
DW 64820,64898,64968,65030
DW 65058,65110,65157,65178
/********共陽極數碼編碼*********/
|