本帖最后由 jjh170102 于 2020-6-20 22:15 編輯
做一個簡易的電子表,按鍵是能夠控制啟動暫停和分鐘的加減,但是原理圖和代碼不是很匹配,按鍵控制的是時鐘的加減,顯示也左移了一格,求大神幫忙修改一下程序,求求了.附上代碼:
ORG 0000H
LJMP START
ORG 000BH
LJMP INIT0
START: MOV R0,#70H;主程序開始
MOV R7,#0CH
INIT: MOV @R0,#00H
INC R0
DJNZ R7,INIT
MOV 72H,#10;對連字符進行裝值
MOV 75H,#10
MOV TMOD,#01H;選擇定時器/計數器T0的方式1
MOV TL0,#0B0H;對地位賦初值
MOV TH0,#03CH;高位賦初值
SETB EA
SETB ET0
SETB TR0
START1: LCALL SCAN
LCALL KEYSCAN
SJMP START1
DL1MS: MOV R6,#14H;延時1子程序
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
DL20MS: ACALL SCAN;延時20ms子程序
ACALL SCAN
ACALL SCAN
RET;數碼管顯示程序開始
SCAN: MOV A,78H
MOV B,#0AH
DIV AB;時間秒的十位送給A,時間秒的個位送給B
MOV 71H,A;時間秒要顯示的十位
MOV 70H,B;時間秒要顯示的個位
MOV A,79H
MOV B,#0AH
DIV AB;;時間分的十位送給A,時間分的個位送給B
MOV 74H,A;時間分要顯示的十位送地址
MOV 73H,B;時間分要顯示的個位送地址
MOV A,7AH
MOV B,#0AH
DIV AB;時間時的十位送給A,時間時的個位送給B
MOV 77H,A;;時間時顯示的十位送地址
MOV 76H,B;時間時要顯示的個位送地址
MOV R1,#70H
MOV R5,#01H
MOV R3,#08H
SCAN1: MOV A,R5;數碼管的顯示程序
MOV P2,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR;對字段表取值表示
MOV P0,A
MOV A,R5
LCALL DL1MS
INC R1
MOV A,R5
RL A
MOV R5,A
DJNZ R3,SCAN1
MOV P2,#00H
MOV P0,#0FFH
RET;”0-9”和“-”的字段表
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H;定時/計數器T0中斷程序
INIT0: PUSH ACC
PUSH PSW
CLR ET0
CLR TR0
MOV TL0,#0B0H
MOV TH0,#03CH
SETB TR0
INC 7BH
MOV A,7BH
CJNE A,#19H,OUTT0;50ms是否到20次,沒有到就繼續執行50ms的延時
MOV 7BH,#00
INC 78H
MOV A,78H
CJNE A,#3CH,OUTT0;一秒的延時是否計到60次,沒有就繼續執行
MOV 78H,#00
INC 79H
MOV A,79H
CJNE A,#3CH,OUTT0
MOV 79H,#00
INC 7AH
MOV A,7AH
CJNE A,#18H,OUTT0;60分鐘的延時是否計到24次,沒有就繼續執行程序
MOV 7AH,#00
OUTT0: SETB ET0;啟動定時器T0
POP PSW
POP ACC
RETI;按鍵處理程序
KEYSCAN:CLR EA
JNB P1.0,KEYSCAN0;P1.0有按鍵按下則跳轉到子程序
JNB P1.1,KEYSCAN1;P1.1有按鍵按下則跳轉到子程序
JNB P1.2,KEYSCAN2;P1.2有按鍵按下則跳轉到子程序
KEYOUT: SETB EA
RET
KEYSCAN0:LCALL DL20MS;20ms的延時消抖
JB P1.0,KEYOUT
WAIT0: JNB P1.0,WAIT0;判斷按鍵是否松手,松手就往下執行程序
INC 7CH
MOV A,7CH
CLR ET0
CLR TR0
CJNE A,#03H,KEYOUT;按下第一次和第二次對時、分選定
MOV 7CH,#00;按下第三次時就啟動計時
SETB ET0
SETB TR0
SJMP KEYOUT
KEYSCAN1:LCALL DL20MS;按鍵加一的程序
JB P1.1,KEYOUT
WAIT1: JNB P1.1,WAIT1
MOV A,7CH
CJNE A,#02H,KSCAN11;如果功能鍵按下則對時加一調整
INC 79H
CJNE A,#3CH,KEYOUT;如果加到60則清零?
MOV 79H,#00
SJMP KEYOUT
KSCAN11:INC 7AH;如果功能鍵是按下第二次則對分進行加一調整
MOV A,7AH
CJNE A,#18H,KEYOUT
MOV 7AH,#00
SJMP KEYOUT
KEYSCAN2:LCALL DL20MS;延時消抖程序
JB P1.2,KEYOUT
WAIT2: JNB P1.2,WAIT2;判斷是否放開按鍵
MOV A,7CH
CJNE A,#02H,KSCAN21;如果功能鍵是按下第一次對時進行減一
DEC 79H
MOV A,79H
CJNE A,#0FFH,KEYOUT
MOV 79H,#3BH
SJMP KEYOUT
KSCAN21:DEC 7AH;如果功能鍵是按下第二次則對分進行減一
CJNE A,#0FFH,KEYOUT
MOV 7AH,#17H
SJMP KEYOUT
END
下面是原理圖截圖
|