.MODEL TINY
EXTRN InitKeyDisplay:NEAR, GetKeyA:NEAR, DisPlay8:NEAR
IO8259_0 EQU 0250H
IO8259_1 EQU 0251H
Con_8253 EQU 0263H
T0_8253 EQU 0260H
T1_8253 EQU 0261H
IO8255_Con EQU 0273H ;CS3
IO8255_PC EQU 0272H
.STACK 100
.DATA
StepControl DB 0 ;下一次送给步进电机的值
buffer DB 8 DUP(0) ;显示缓冲区,8个字节
SpeedNo DB 0;选择哪一级速度
StepDelay DB 0;转动一步后,延时常数
StartStepDelay DB 0;若选择速度过快,延时由长到短,最终使用对应延时常数
StartStepDelay1 DB 0;StartStepDelay
bFirst DB 0 ;有没有转动过步进电机
bClockwise DB 0 ; =1 顺时针方向 =0 逆时针方向转动
bNeedDisplay DB 0 ;已转动一步,需要显示新步数
StepCount DW 0 ;需要转动的步数
Carry_bit DW 0 ;进位
Counts DB 0
Seconds DW 0
Minutes DW 0
Cspeed DB 0
Ctime DW 0
Ccounts DB 0
StepDelayTab: DB 250,125,83,62,50,42,36,32,28,25,22,21;
Flag DB 0
WR_COM_AD_L EQU 0244H ;写左半屏指令地址
WR_COM_AD_R EQU 0240H ;写右半屏指令地址
WR_DATA_AD_L EQU 0246H ;写左半屏数据地址
WR_DATA_AD_R EQU 0242H ;写右半屏数据地址
RD_BUSY_AD EQU 0241H ;查忙地址
RD_DATA_AD EQU 0243H ;读数据地址
X EQU 0B8H ;起始显示行基址
Y EQU 040H ;起始显示列基址
FirstLine EQU 0C0H ;起始显示行 .STACK 100
;-- 文字: ☆ --
;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --
Line1_1 DB 40H,0C0H,40H,40H,40H,60H,1CH,03H,1CH,60H,40H,40H,40H,0C0H,40H,00H
DB 00H,00H,41H,39H,26H,10H,10H,08H,08H,10H,26H,39H,41H,00H,00H,00H
;-- 文字: 洗 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --
Line1_2 DB 10H,61H,06H,0F0H,0A0H,98H,8EH,88H,88H,0FFH,88H,88H,88H,80H,80H,00H
DB 04H,04H,0FFH,00H,40H,20H,18H,07H,00H,00H,3FH,40H,40H,40H,70H,00H
;-- 文字: 衣 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --
Line1_3 DB 04H,04H,04H,04H,84H,44H,25H,3EH,0C4H,04H,04H,84H,64H,44H,04H,00H
DB 08H,04H,02H,41H,0FFH,40H,20H,00H,00H,03H,0DH,10H,20H,60H,20H,00H
;-- 文字: 机 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --
Line1_4 DB 08H,08H,0C8H,0FFH,48H,88H,08H,00H,0FEH,02H,02H,02H,0FEH,00H,00H,00H
DB 04H,03H,00H,0FFH,00H,41H,30H,0CH,03H,00H,00H,00H,3FH,40H,78H,00H
;-- 文字: 控 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --
Line1_5 DB 08H,08H,08H,0FFH,88H,48H,00H,98H,48H,28H,0AH,2CH,48H,0D8H,08H,00H
DB 02H,42H,81H,7FH,00H,00H,40H,42H,42H,42H,7EH,42H,42H,42H,40H,00H
;-- 文字: 制 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --
Line1_6 DB 00H,50H,4FH,4AH,48H,0FFH,48H,48H,48H,00H,0FCH,00H,00H,0FFH,00H,00H
DB 00H,00H,3FH,01H,01H,0FFH,21H,61H,3FH,00H,0FH,40H,80H,7FH,00H,00H
;-- 文字: 器 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --
Line1_7 DB 40H,40H,4FH,49H,49H,0C9H,0CFH,70H,0C0H,0CFH,49H,59H,69H,4FH,00H,00H
DB 02H,02H,7EH,45H,45H,44H,7CH,00H,7CH,44H,45H,45H,7EH,06H,02H,00H
;-- 文字: 暂 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --
Line2_1 DB 80H,92H,9AH,96H,0FBH,52H,52H,80H,7EH,12H,12H,12H,0F2H,12H,10H,00H
DB 00H,00H,00H,7EH,4BH,4AH,4BH,4AH,4AH,4AH,4AH,7EH,01H,00H,00H,00H
;-- 文字: 停 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --
Line2_2 DB 80H,40H,20H,0F8H,07H,02H,04H,74H,54H,55H,56H,54H,74H,04H,04H,00H
DB 00H,00H,00H,0FFH,00H,03H,01H,05H,45H,85H,7DH,05H,05H,05H,03H,00H
;-- 文字: 正 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --
Line3_1 DB 00H,02H,02H,0C2H,02H,02H,02H,02H,0FEH,82H,82H,82H,82H,82H,02H,00H
DB 20H,20H,20H,3FH,20H,20H,20H,20H,3FH,20H,20H,20H,20H,20H,20H,00H
;-- 文字: 在 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --
Line3_2 DB 00H,04H,04H,0C4H,64H,9CH,87H,84H,84H,0E4H,84H,84H,84H,84H,04H,00H
DB 04H,02H,01H,7FH,00H,20H,20H,20H,20H,3FH,20H,20H,20H,20H,20H,00H
;-- 文字: 洗 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --
Line3_3 DB 10H,61H,06H,0F0H,0A0H,98H,8EH,88H,88H,0FFH,88H,88H,88H,80H,80H,00H
DB 04H,04H,0FFH,00H,40H,20H,18H,07H,00H,00H,3FH,40H,40H,40H,70H,00H
;-- 文字: 衣 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --
Line3_4 DB 04H,04H,04H,04H,84H,44H,25H,3EH,0C4H,04H,04H,84H,64H,44H,04H,00H
DB 08H,04H,02H,41H,0FFH,40H,20H,00H,00H,03H,0DH,10H,20H,60H,20H,00H
;-- 文字: 定 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --
Line4_1 DB 00H,10H,0CH,0A4H,24H,24H,25H,0E6H,24H,24H,24H,24H,14H,0CH,04H,00H
DB 40H,20H,18H,07H,08H,10H,20H,7FH,42H,42H,42H,42H,40H,40H,00H,00H
;-- 文字: 时 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --
Line4_2 DB 00H,0FCH,44H,44H,44H,0FCH,10H,90H,10H,10H,10H,0FFH,10H,10H,10H,00H
DB 00H,07H,04H,04H,04H,07H,00H,00H,03H,40H,80H,7FH,00H,00H,00H,00H
.CODE
START: MOV AX,@DATA
MOV DS,AX
MOV ES,AX
NOP
CALL InitKeyDisplay ;初始化键盘、数码管控制器(8255)
MOV bFirst,1 ;有没有转动过步进电机
MOV bClockwise,1 ;顺时针方向
MOV StepControl,33H ;下一次送给步进电机的值
MOV SpeedNo,5 ;第五级速度
CALL LCD_INIT ;液晶初始化
CALL DisLine_Welcome
CALL Init8255
CALL Init8253
CALL Init8259
CALL WriIntver
MOV buffer,0 ;显示缓冲器初始化
MOV buffer+1,0
MOV buffer+2,11H ;间隔
MOV buffer+3,0
MOV buffer+4,0
MOV buffer+5,10H
MOV AL,SpeedNo
MOV buffer+6,AL
MOV buffer+7,10H
STAR2:
LEA SI,buffer
CALL Display8
STAR3: CALL GetKeyA
JB STAR5 ;是1,跳转
CMP bNeedDisplay,0
JZ STAR3
MOV bNeedDisplay,0
CALL Adjust_Step
JMP STAR2
STAR5: CLI ;终止步进电机转动
CMP AL,10
JNB STAR1 ;大于等于十,跳转
CMP Flag,0
JZ timer
Shift: MOV AH,buffer+3
MOV buffer+4,AH
MOV AH,buffer+1
MOV buffer+3,AH
MOV AH,buffer
MOV buffer+1,AH
MOV buffer,AL
MOV Flag,1
JMP STAR2
STAR1: CMP AL,14 ;暂停
JNB pause
LEA SI,DriverTab
SUB AL,10 ;AL-10
SHL AL,1 ;AL左移一位
XOR AH,AH ;AH置零
MOV BX,AX
JMP CS:[SI+BX]
pause:
CALL LCDClear
CALL DisLine_Pause
JMP STAR2
timer:
CALL LCDClear
CALL DisLine_timer
JMP Shift
DriverTab:
DW Direction ;转动方向
DW Speed_up ;提高转速
DW Speed_Down ;降低转速
DW Exec ;步进电机根据方向、转速、步数开始转动
Direction:
MOV Flag,0
CALL LCDClear
CALL DisLine_Pause
CMP bClockwise,0
JZ Clockwise ;如果相等,跳转
MOV bClockwise,0 ;如果不相等,继续
;MOV buffer+7,1
AntiClockwise:
CMP bFirst,0 ;设置送给步进电机的值
JZ AntiClockwise1
MOV StepControl,91H ;10010001
JMP Direction1
AntiClockwise1:
MOV AL,StepControl
ROR AL,2 ;循环右移两位
MOV StepControl,AL
JMP Direction1
Clockwise:
MOV bClockwise,1 ;设置方向
;MOV buffer+7,0
CMP bFirst,0
JZ Clockwise1
MOV StepControl,33H ;设置送给步进电机的值
JMP Direction1
Clockwise1:
MOV AL,StepControl
ROL AL,2
MOV StepControl,AL
Direction1: JMP STAR2
Speed_up:
MOV Flag,0
CALL LCDClear
CALL DisLine_Pause
MOV AL,SpeedNo ;加速
CMP AL,11
JZ Speed_up2
Speed_up1:
INC AL ;自加一
MOV SpeedNo,AL
MOV buffer+6,AL
Speed_up2:
JMP STAR2
Speed_Down:
MOV Flag,0
CALL LCDClear
CALL DisLine_Pause ;减速
MOV AL,SpeedNo
CMP AL,0
JZ Speed_Down1
DEC AL ;自减1
MOV SpeedNo,AL
MOV buffer+6,AL
Speed_Down1: JMP STAR2
Exec:
MOV Flag,0
CALL LCDClear
CALL DisLine_Running
MOV bFirst,0 ;执行
CALL TakeStepCount ;转动步数送入StepCount
LEA BX,StepDelayTab
MOV AL,SpeedNo
XLAT ;AL = BX+AL
MOV StepDelay,AL
CMP AL,50
JNB Exec1
MOV AL,50
Exec1: MOV StartStepDelay,AL
MOV StartStepDelay1,AL
STI ;允许中断
JMP STAR2
TIMER0: PUSH AX
PUSH DX
DEC StartStepDelay ;自减1
JNZ TIMER0_1 ;不为零时跳转143
MOV AL,StartStepDelay1
CMP AL,StepDelay
JZ TIMER0_2
DEC AL
MOV StartStepDelay1,AL
TIMER0_2:
MOV StartStepDelay,AL
CMP Ctime, 0
JZ dont
MOV AL,StepControl
MOV DX,IO8255_PC
OUT DX,AL
dont: CMP bClockwise,0
JNZ TIMER0_3
ROR AL,1
JMP TIMER0_4
TIMER0_3:
ROL AL,1
TIMER0_4:
MOV StepControl,AL
CMP StepCount,0
JZ TIMER0_1
MOV bNeedDisplay,1
DEC StepCount
JNZ TIMER0_1
add sp,8 ;小写部分不允许使用
评论0