ORG 0000H ;偽指令,指定一下程序匯編后代碼在入程序存儲器0000H單元開始的連續單元中,不占有內存
AJMP MAIN ;短轉移指令,轉到主程序開始處
ORG 0050H ;偽指令,指定一下程序是從0050H之后連續單元存儲
MAIN:
MOV P1,#0F0H ;給P1口賦值,使得低四位為低電平,所有行為低電平,全掃描 高四位列
ONE:MOV A,P1 ;將P1口值賦值給寄存器A,讀取列值
XRL A,#0F0H ;將A中的值與11110000異或
JZ ONE ;判斷A的值是否為0,為0則沒有鍵按下,繼續判斷,有則進行下面程序
ACALL DELAY ;延時20ms去除按壓時的抖動
MOV A,P1 ;再將P1口的值賦值給寄存器A
XRL A,#0F0H ;與11110000異或
JZ ONE ;判斷若A=0則PC+ONE的地址跳轉
MOV A,#00H ;若不為0,PC值繼續向下運行,給A賦值0
JNB P1.4,TWO ;判斷P1.4引腳是否為0,若不為0跳轉TWO,繼續下面的判斷鍵值
INC A ;若為0,將A 值加1
JNB P1.5,TWO ;繼續判斷P1.5位是否為0,舨晃?跳轉TWO,繼續下面的判斷鍵值
INC A ;若為0,將A 值加1
JNB P1.6,TWO ;繼續判斷P1.6位是否為0,舨晃?跳轉TW,繼續下面的判斷鍵值
INC A ;若為0,將A 值加1
JNB P1.7,TWO ;繼續判斷P1.7位是否為0,舨晃?跳轉TW,繼續下面的判斷鍵值
TWO:MOV R1,A ;將判斷列值的A賦值與R1,暫存于此
MOV R2,#00H ;R2賦值0將作為行值
MOV R3,#0FEH ;R3賦值為11111110,作為后面提取行
FOUR:
MOV A,R3 ;將R3的值賦給寄存器A
MOV P1,A ;將A賦值給P1口,將第一行給低電平
MOV A,P1 ;再將P1口的值賦值給A
XRL A,R3 ;與R3做異或,若某一位不一樣,則該位賦值于1
JNZ THREE ;判斷A是否不為0,若不為0則證明該行有鍵按下,若為0 ,繼續下一行的判斷
MOV A,R3 ;將R3的值給A
RL A ;循環左移一位,將第二行賦于低電平
MOV R3,A ;將A的值給R3,暫存
MOV A,R2 ;將R2的值給R2
INC A ;由于上一行無鍵按下,則自加1
MOV R2,A ;再將A 的值賦值給R2暫存
AJMP FOUR ;挑戰FOUR循環判斷
THREE:
MOV A,R2 ;判斷到具體的某行時,將暫存行數的R2值,賦值給A
MOV B,#04H ;給寄存器B賦值4
MUL AB ;A*B=A,兩者相乘賦值給A
ADD A,R1 ;再將列值相加就得到了該鍵所對應的具體值
MOV P2,#0FEH ;將P2口賦值0FE,喚醒數碼管第一位,作為顯示
MOV DPTR,#TAB ;寄存器間接尋址,采用數據指針(DPTR)作為間接尋址寄存器,將表TAB賦值于DPTR,以查表方式賦值
MOVC A,@A+DPTR ;以查表的方式將DPTR中數值賦值于A
MOV P0,A ;將P0口賦值A中的所查值,P0口控制數碼管段選
AJMP MAIN ;跳轉至MAIN,繼續下一次判斷
DELAY: ;延遲程序20ms
MOV R6,#40 ;該語句占1個機器周期
D1: MOV R5,#246 ;該語句占1個機器周期
D2: DJNZ R5,D2 ;該語句占2個機器周期共執行246*40次
DJNZ R6,D1 ;該語句占2個機器周期共執行40次
RET ;該語句占2個機器周期
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
;表,偽指令DB,通知匯編程序從當前ROM地址開始保留一字節或字節串的存儲單元,并存入DB后面的數據
END ;偽指令,表示END后面所有的匯編語言指令均不予以匯編
|