?? bjdj.asm
字號(hào):
;**************************************************
; 平凡單片機(jī)工作室
; http://www.mcustudio.com
; Copyright 2003 pingfan's McuStudio
; All rights Reserved
;作者:周堅(jiān)
;測速實(shí)驗(yàn)
;**************************************************
StartEnd bit 01H ;起動(dòng)及停止標(biāo)志
MinSpd EQU 25 ;起始轉(zhuǎn)動(dòng)速度
MaxSpd EQU 100 ;最高轉(zhuǎn)動(dòng)速度
Speed DATA 23H ;流動(dòng)速度計(jì)數(shù)
DjCount DATA 24H ;控制電機(jī)輸出的一個(gè)值,初始為1110 1111
Hidden EQU 10H ;消隱碼
Counter DATA 57H ;顯示計(jì)數(shù)器
DISPBUF DATA 58H ;顯示緩沖區(qū)
ORG 0000H
AJMP MAIN
ORG 000BH
JMP DISP
ORG 001BH
JMP DJZD
ORG 30H
MAIN:
MOV SP,#5FH
MOV P1,#0FFH
MOV A,#Hidden
MOV DispBuf,A
MOV DispBuf+1,A
MOV DispBuf+2,A
MOV DjCount,#11110111B
MOV SPEED,#MinSpd ;起始轉(zhuǎn)動(dòng)速度送入計(jì)數(shù)器
CLR StartEnd ;啟動(dòng)時(shí)處于停止?fàn)顟B(tài)
MOV TMOD,#00010001B ;
MOV TH0,#HIGH(65536-3000)
MOV TL0,#LOW(65536-3000)
MOV TH1,#0FFH;
MOV TL1,#0FFH
SETB TR0
SETB EA
SETB ET0
SETB ET1
LOOP: ACALL KEY ;鍵盤程序
JNB F0,m_NEXT1 ;無鍵按下繼續(xù)
ACALL KEYPROC ;否則調(diào)用鍵盤處理程序
m_NEXT1:
MOV A,Speed
MOV B,#10
DIV AB
MOV DispBuf+5,B ;最低位
MOV B,#10
DIV AB
MOV DispBuf+4,B
MOV DispBuf+3,A
JB StartEnd,m_Next2
CLR TR1 ;關(guān)閉電機(jī)
JMP LOOP
ORL P1,#11110000B
m_Next2:
SETB TR1 ;啟動(dòng)電機(jī)
AJMP LOOP ;反復(fù)循環(huán),主程序到此結(jié)束
;---------------------------------------
D10ms:
PUSH PSW
SETB RS0
MOV R7,#10
D1: MOV R6,#100
DJNZ R6,$
DJNZ R7,D1
POP PSW
RET
;---------延時(shí)程序,鍵盤處理中調(diào)用
KEYPROC:
MOV A,B ;從B寄存器中獲取鍵值
JB ACC.2,StartStop ;分析鍵的代碼,某位被按下,則該位為1
JB ACC.3,KeySty
JB ACC.4,UpSpd
JB ACC.5,DowSpd
AJMP KEY_RET
StartStop:
SETB StartEnd ;啟動(dòng)
AJMP KEY_RET
KeySty:
CLR StartEnd; ;停止
AJMP KEY_RET
UpSpd:
INC SPEED;
MOV A,SPEED
CJNE A,#MaxSpd,K1 ;是否到了最多的次數(shù)
DEC SPEED ;否則減去1,保證下次仍為該值
K1:
AJMP KEY_RET
DowSpd:
DEC SPEED
MOV A,SPEED
CJNE A,#MAXSPD,KEY_RET ;不等(未到最大值),返回
MOV SPEED,#MinSpd;
KEY_RET:
RET
KEY:
CLR F0 ;清F0,表示無鍵按下。
ORL P3,#00111100B ;將P3口的接有鍵的四位置1
MOV A,P3 ;取P3的值
ORL A,#11000011B ;將其余4位置1
CPL A ;取反
JZ K_RET ;如果為0則一定無鍵按下
CALL D10ms ;否則延時(shí)去鍵抖
ORL P3,#00111100B
MOV A,P3
ORL A,#11000011B
CPL A
JZ K_RET
MOV B,A ;確實(shí)有鍵按下,將鍵值存入B中
SETB F0 ;設(shè)置有鍵按下的標(biāo)志
K_RET:
ORL P3,#00111100B ;此處循環(huán)等待鍵的釋放
MOV A,P3
ORL A,#11000011B
CPL A
JZ K_RET1 ;直到讀取的數(shù)據(jù)取反后為0說明鍵釋放了,才從鍵盤處理程序中返回
AJMP K_RET
K_RET1:
RET
DjZd: ;定時(shí)器T1用于電機(jī)轉(zhuǎn)速控制
PUSH ACC
PUSH PSW
MOV A,Speed
SUBB A,#MinSpd ;減基準(zhǔn)數(shù)
MOV DPTR,#DjH
MOVC A,@A+DPTR
MOV TH1,A
MOV A,Speed
SUBB A,#MinSpd
MOV DPTR,#DjL
MOVC A,@A+DPTR
MOV TL1,A
MOV A,DjCount
CPL A
ORL P1,A
MOV A,DjCount
JNB ACC.7,d_Next1
JMP d_Next2
d_Next1:
MOV DjCount,#11110111B
d_Next2:
MOV A,DjCount
RL A
MOV DjCount,A ;回存
ANL P1,A
POP PSW
POP ACC
RETI
DjH: DB 76,82,89,95,100,106,110,115,119,123,127,131,134,137,140,143,146,148,151
DB 153,155,158,160,162,165,166,167,169,171,172,174,175,177,178,179,181,182
DB 183,184,185,186,187,188,189,190,191,192,193,194,195,196,196,197,198,199
DB 199,200,201,201,202,203,203,204,204,205,206,206,207,207,208,208,209,209
DB 210,210,211
DjL: DB 0,236,86,73,212,0,214,96,163,165,110,0,97,148,158,128,62,219,89,186,0
DB 44,65,64,42,0,196,119,24,171,47,165,13,106,187,0,59,108,147,176,197,210,214
DB 211,200,183,158,128,91,48,0,202,143,78,10,192,114,31,201,110,15,173,70,221
DB 112,0,141,22,157,33,162,32,155,21,140,0
DISP:
;定時(shí)器T0做顯示用
PUSH ACC ;ACC入棧
PUSH PSW ;PSW入棧
MOV TH0,#HIGH(65536-3000);定時(shí)時(shí)間為3000個(gè)周期
MOV TL0,#LOW(65536-3000)
MOV A,#DISPBUF ;顯示緩沖區(qū)首地址
ADD A,Counter
MOV R0,A
MOV A,@R0 ;根據(jù)計(jì)數(shù)器的值取相應(yīng)的顯示緩沖區(qū)的值
MOV DPTR,#DISPTAB ;字形表首地址
MOVC A,@A+DPTR ;取字形碼
MOV P0,A ;將字形碼送P0位(段口)
MOV A,Counter ;取計(jì)數(shù)器的值
MOV R0,A
MOV DPTR,#BitTab
MOVC A,@A+DPTR ;取位
ORL P2,#11111100B
ANL P2,A
INC Counter ;計(jì)數(shù)器加1
MOV A,Counter
CJNE A,#6,DISPEXIT
MOV Counter,#0 ;如果計(jì)數(shù)器計(jì)到6,則讓它回0
DISPEXIT:
POP PSW
POP ACC
RETI
BitTab: DB 7Fh,0BFH,0DFH,0EFH,0F7H,0FBH
DISPTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -