|
ORG 0000H ;初始位置00H
JMP STARET ;跳到主程序
ORG 000BH ;定時(shí)器0中斷起始單元
JMP TIME0 ;跳到中斷程序
STARET: MOV TMOD,#00000001B;設(shè)定工作方式為1
MOV IE, #10000010B ;開(kāi)中斷允許
SETB TR0
L1: CALL KEY ;調(diào)用鍵盤(pán)掃描程序
CLR EA ;關(guān)中斷總允許
JB F0,L1 ;查詢(xún)鍵盤(pán)按下標(biāo)志
MOV A,22H ;將鍵盤(pán)碼送單元A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR ;將查詢(xún)的數(shù)碼管顯示碼送A
MOV P0,A ;將數(shù)碼管顯示碼送數(shù)碼管
MOV A,22H ;將鍵盤(pán)碼送單元A
RL A ;數(shù)據(jù)倍乘
MOV DPTR,#TABLE
MOVC A,@A+DPTR;將聲音編碼送A
MOV TH0,A;將聲音編碼高位給TH0
MOV 21H,A;送聲音編碼給21H單元儲(chǔ)存
MOV A,22H
RL A
INC A
MOVC A,@A+DPTR;取聲音編碼地位給A
MOV TL0,A;將聲音編碼送TL0
MOV 20H,A;將聲音編碼低位送20H儲(chǔ)存
L2: CALL KEY;調(diào)用江畔掃描程序
SETB EA;開(kāi)斷總允許
JB F0,L1;查詢(xún)鍵盤(pán)按下標(biāo)志
JMP L2 ;沒(méi)有轉(zhuǎn)L2循環(huán)
/*******鍵盤(pán)掃描程序*********/
KEY: SETB F0 ;鍵盤(pán)按下標(biāo)志至1
MOV R3,#0F7H;R3送掃描碼
MOV R1,#00H;R1初始為0
L3: MOV A,R3;將掃描碼送A
MOV P2,A;將掃描碼送描p2掃描
MOV A,P2;讀取鍵盤(pán)狀態(tài)
SETB C;進(jìn)位至1
MOV R5,#04H;將4給R5單元,用于行掃描
L4: RLC A
JNC KEYIN;有鍵按下跳到KEYIN
INC R1;無(wú)鍵按下R1加1
DJNZ R5,L4;判斷一行有沒(méi)有判斷完畢
MOV A,R3;掃描完畢后,再次送掃描碼給A
SETB C;進(jìn)位置1
RRC A;對(duì)A進(jìn)行右移
MOV R3 ,A ;送新的掃描碼給R3
JC L3 ;判斷是否掃描完畢,是則循環(huán)
RET;返回主程序
KEYIN: MOV 22H,R1;將鍵盤(pán)碼送22H儲(chǔ)存
CLR F0;對(duì)鍵盤(pán)按下標(biāo)志清0
RET;返回主程序
TIME0: PUSH ACC;將A壓入堆棧
PUSH PSW;將PSW壓入堆棧
MOV TL0,20H;將聲音編碼低位送TL0
MOV TH0,21H;將聲音編碼高位送TH0
CPL P1.0;對(duì)輸出口聲音信號(hào)取反
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
/********共陽(yáng)極數(shù)碼編碼*********/
|
|