MOV P2,#0FFH
MOV R7,#00H
;R7為電機轉動正反狀態暫存器:為1時為正轉,為2時為反轉,為0時為停止
CLR F0 ;F0為速度狀態,為0慢,為1加速
CLR P3.7 ;關七段數碼顯示開關,為1開,為0關
CLR P3.4 ;同上
MOV 30H,#00H;數碼管要顯示的值
MOV 31H,#00H;第一個數碼管顯示的值
MOV 32H,#00H; 第二個數碼管顯示的值
clr 08h
clr 09h; 按次數正反轉狀態位
MAIN:MOV A,P2; 掃描p2口按鍵
CPL A
JZ NOKEY; 沒鍵就跳到nokey
ACALL qudou ;去抖動
MOV A,P2; 再次掃描p2口看是否為真的按下
CPL A
JB ACC.0,KEY1
JB ACC.1,KEY2
JB ACC.2,KEY3
JB ACC.3,KEY4
NOKEY:CJNE R7,#01H,nokey1
mov dptr,#tab1
acall fuzhi
AJMP main
nokey1:CJNE R7,#02H,finish
mov dptr,#tab2
acall fuzhi
finish:AJMP MAIN
KEY1:JNB P2.0,$ ;按鍵控制正轉
MOV R7,#01H
mov r0,#0
AJMP NOKEY
KEY2:JNB P2.1,$ ;按鍵控制反轉
MOV R7,#02H
mov r0,#0
AJMP NOKEY
KEY3:JNB P2.2,$ ;按鍵控制速度
CPL F0
AJMP NOKEY
KEY4:JNB P2.3,$ ;stop按鍵
CJNE R7,#00H,KEY44;判斷步進電機是否已經停止,沒有就執行停止,否則就調轉動次數
Acall led71
acall led72
ACALL XZCS;調旋轉次數
KEY44:MOV R7,#00H;
CLR F0
AJMP MAIN
LED71:mov dptr,#tab3; 十位數數碼管顯示
MOV A,31H
MOVC A,@A+DPTR
SETB P3.7
MOV P0,A
ACALL QUDOU
CLR P3.7
ret
led72:mov dptr,#tab3; 個位數數碼管顯示
MOV A,32H
MOVC A,@A+DPTR
MOV P0,A
SETB P3.4
ACALL QUDOU
CLR P3.4
RET
XZCS:MOV A,P2
CPL A
JZ MJ;沒鍵按下
ACALL qudou ;去抖動
MOV A,P2
CPL A
JB ACC.0,JIAN1
JB ACC.1,JIAN2
JB ACC.2,JIAN3;第四鍵表示次數已經調好了,按照數碼管顯示次數轉動
JB ACC.3,JIAN4
MJ: ACALL LED71
acall led72
SJMP XZCS
JIAN1:ACALL LED71;十位數數碼管的數值調節,k0按一次加一
acall led72
JNB P2.0,JIAN1
MOV A,31H
CJNE A,#09H,JIA1
MOV 31H,#0
AJMP XZCS
JIA1: INC A
MOV 31H,A
AJMP XZCS
JIAN2:ACALL LED71; 個位數數碼管的數值調節,k1按一次加一
acall led72
JNB P2.1,JIAN2
MOV A,32H
CJNE A,#09H,JIA11
MOV 32H,#0
AJMP XZCS
JIA11: INC A
MOV 32H,A
AJMP XZCS
JIAN4:JNB P2.3,$; 返回並且停止轉動
RET
JIAN3:ACALL LED71 ;控制步進電機的轉動
acall led72
JNB P2.2,JIAN3
MOV A,31H
mov b,#10
mul ab
add a,32h; 求出數碼管顯示的數值
jjxz: MOV R6,A; 控制轉動次數
JXZ: cjne r6,#00h,jxz1 ;如果是0就不要轉了,返回
ajmp xzcs
jxz1: MOV R0,#50; 轉動一圈需要的步距角數
LOOPP:jnb p2.2,fanzhuan; k2鍵控制轉動的方向,按一下就改變一下
jnb p2.3,jian44; k3鍵按一下停止轉動
jian44:acall qudou
jnb p2.3,jian4
sjmp cc
fanzhuan:acall qudou
jnb p2.2,fanzhuan1
fanzhuan1:acall led71
acall led72
jnb p2.2,fanzhuan1
cpl 09h
cc: jnb 09h,aa
mov dptr,#tab2
sjmp bb
aa: MOV DPTR,#TAB1
bb: ACALL FUZHI
djnz R0,LOOPP;一圈完了
MOV A,32H; 數碼管減一
CJNE A,#00H,DEC11
DEC 31H
MOV 32H,#0aH
DEC11:DEC 32H
DJNZ R6,JXZ; 繼續轉
AJMP xzcs
FUZHI:MOV R2,#8; 給p1口送脈衝
MOV R3,#0
LOOP:MOV A,R3
MOVC A,@A+DPTR
MOV P1,A
INC R3
cjne r0,#00h,loop1
ACALL DELAY
sjmp loop2
loop1:push acc
push DPL
push DPH
jnb 08h,loop3
acall led72
ajmp loop4
loop3:acall led71
loop4:cpl 08h
pop dph
pop dpl
pop acc
loop2:DJNZ R2,LOOP
RET
delay: JNB F0,DELAY2;控制步進電機中途延時時間,即速度
MOV R4,#6
AJMP DELAY1
DELAY2:mov r4,#12
delay1:mov r5,#250
djnz r5,$
djnz r4,delay1
ret
QUDOU:MOV R4,#6 ;延時去抖動3ms
QUDOU1:MOV R5,#250
DJNZ R5,$
DJNZ R4,QUDOU1
RET
TAB1:DB 0f7h,0f5h,0fdh,0f9h,0fbh,0fah,0feh,0f6h;正轉
TAB2:DB 0f6h, 0feh,0fah,0fbh,0f9h,0fdh,0f5h,0f7h;反轉
TAB3:DB 08H,3BH,14H,11H,23H,41H,40H,1BH,00H,01H ;七段數碼顯示
END