⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tiaoshi7.asm

📁 步进电机控制程序:该控制软件所要实现的功能是通过控制压电陶瓷自动寻找两极间最佳放电间隙
💻 ASM
字号:
KeyValue          EQU   30H                                   ;显示键值存储变量
DisplayCode       EQU   31H                                   ;显示码存贮变量
ROW               EQU   32H                                   ;行代码存贮变量
Column            EQU   33H                                   ;列代码存贮变量
ScanCount         EQU   34H                                   ;扫描圈数存贮变量
ScanCode          EQU   35H                                   ;扫描码存贮变量
DisplayBuffer     EQU   36H                                   ;以此开始的连续四个单元用以存放显示码
KeyvaluBuffer     EQU   40H                                   ;以此开始的连续四个单元用以存放键值
QIANWEI           EQU   44H                                   ;显示数值千位存贮变量
BAIWEI            EQU   45H                                   ;显示数值百位存贮变量
SHIWEI            EQU   46H                                   ;显示数值十位存贮变量
GEWEI             EQU   47H                                   ;显示数值个位存贮变量
LSCOUNT1          EQU   48H                                   ;步进电机1左转点动计数
RSCOUNT1          EQU   49H                                   ;步进电机1右转点动计数
LSCOUNT2          EQU   4AH                                   ;步进电机2左转点动计数
RSCOUNT2          EQU   4BH                                   ;步进电机2右转点动计数


                  ORG    0
                  SJMP   Start

Start:
                  MOV    SP,#5FH                               ;初始化程序
                  MOV    DisplayCode,#00H                      ;设定初始不显示
                  MOV    ScanCode,#0EFH                        ;设定扫描顺序
                  MOV    ScanCount,#5
                  MOV    P2,#00H
                  MOV    R2,#02H
                  MOV    R3,#19H
                  MOV    R6,#19H
                  MOV    R1,#4                                 ;显示码缓存区清零
                  MOV    R0,#DisplayBuffer
DisplayLoop:
                  MOV    @R0,#00H
                  INC    R0
                  DJNZ   R1,DisplayLoop
                  MOV    R1,#4                                ;键值缓存区清零
                  MOV    R0,#KeyvaluBuffer
Keyvaluloop:
                  MOV    @R0,#00H
                  INC    R0
                  DJNZ   R1,Keyvaluloop

Main:                                                         ;扫描程序开始,采用逐行查询扫描的方式
                  MOV    A,ScanCode
                  RR     A
                  ORL    A,#0F0H
                  MOV    ScanCode,A
                  MOV    P2,#00H
                  MOV    P3,A
                  MOV    A,P3
                  MOV    R5,A
                  XRL    A,ScanCode
                  JZ     NotKey                               ;若未检测到按键按下,则继续扫描下一行
                  AJMP    HaveKey                             ;若检测到按键按下,则跳至相应程序执行


NotKey:
                  MOV    LSCOUNT1,#00H
                  MOV    RSCOUNT1,#00H
                  MOV    LSCOUNT2,#00H
                  MOV    RSCOUNT2,#00H
                  DJNZ   ScanCount,KELO                       ;记录扫描圈数,一轮扫描完成后重新置入初值
                  MOV    ScanCount,#5
                  MOV    ScanCode,#0EFH
             


KELO:             PUSH  ScanCode                              ;将主程序当前扫描行代码压入堆栈

DECI:             MOV    R0,#35H                              ;循环显示缓存区内的数值
                  MOV    R4,#04H
                  MOV    ScanCode,#0FFH
                  CLR    C
LIU:              INC    R0
                  MOV    P2,@R0
                  MOV    A,ScanCode
                  RLC    A
                  MOV    ScanCode,A
                  MOV    P3,A
                  AJMP   Delay1
PEN:              DJNZ   R4,LIU

FIJ:              DJNZ   R3,DECI
                  MOV    R3,#19H
                  DJNZ   R6,FIJ
                  MOV    R6,#19H
                  POP    ScanCode                             ;释放主程序当前扫描行代码
                  AJMP   Main                                 ;跳至主程序继续执行扫描


CLEA:
                  MOV  R2,#02H                                ;清除显示缓存区内数据
                  MOV  R0,#DisplayBuffer
                  MOV  R1,#4
DELSHOW:
                  MOV   @R0,#00H
                  INC   R0
                  DJNZ  R1,DELSHOW
                  MOV   R0,#KeyvaluBuffer
                  MOV   R1,#4
DELKEY:
                                                              ;清除键值缓存区内数据
                  MOV   @R0,#00H
                  INC   R0
                  DJNZ  R1,DELKEY
                  AJMP  NotKey

HaveKey:

                  AJMP   FindKeyValue
LOOP:             MOV    A,KeyValue
                  AJMP   Decode

SHOW:
                  MOV    A,DisplayCode
                  XRL    A,#77H
                  JZ     MOTORCICLE1
                  MOV    A,DisplayCode
                  XRL    A,#7CH
                  JZ     CLEA
                  MOV    A,DisplayCode
                  XRL    A,#39H
                  JZ     DIANDONG
                  MOV    A,DisplayCode
                  XRL    A,#5EH
                  JNZ    YUMEN
                  AJMP   MOTORCICLE2
 YUMEN:           MOV    DisplayBuffer,DisplayBuffer+1
                  MOV    KeyvaluBuffer,KeyvaluBuffer+1
                  MOV    DisplayBuffer+1,DisplayBuffer+2
                  MOV    KeyvaluBuffer+1,KeyvaluBuffer+2
                  MOV    DisplayBuffer+2,DisplayBuffer+3
                  MOV    KeyvaluBuffer+2,KeyvaluBuffer+3
                  MOV    DisplayBuffer+3,DisplayCode
                  MOV    KeyvaluBuffer+3,Keyvalue

PET:              DEC   R2
                  ;INC    R2
                  MOV    A,R2
                  JZ     JACKY
                  AJMP   Notkey                                        ;小数点显示
                  ;CJNE   R2,#02H,Notkey
 JACKY:           MOV    A,DisplayCode
                  ADD    A,#80H
                  MOV    DisplayBuffer+3,A
                  AJMP   NotKey
  DIANDONG:       JNB    P1.4,PANDIN1
                  JNB    P1.5,PANDIN2
                  JNB    P1.6,PANDIN3
                  JNB    P1.7,PANDIN4
                  AJMP   DIANDONG
   PANDIN1:       INC    RSCOUNT1
                  AJMP   RIGHTTURN1
   PANDIN2:       INC    LSCOUNT1
                  AJMP   LEFTTURN1
   PANDIN3:       INC    LSCOUNT2
                  AJMP   LEFTTURN2
   PANDIN4:       INC    RSCOUNT2
                  AJMP   RIGHTTURN2

MOTORCICLE1:
                  MOV    TMOD ,#00000001B
LEFTTURN1:        MOV    QIANWEI,KeyvaluBuffer                ;电机1左转驱动程序
                  MOV    BAIWEI,KeyvaluBuffer+1
                  MOV    SHIWEI,KeyvaluBuffer+2
                  MOV    GEWEI,KeyvaluBuffer+3
                  MOV    TH0,#0F0H
                  MOV    TL0,#0FFH
                  SETB   TR0
PULSE1:           MOV    A,GEWEI
                  JZ     TELI4
                  JNB    TF0,$
                  CLR    TF0
                  CPL    P1.0
                  MOV    TH0,#0F0H
                  MOV    TL0,#0FFH
                  DEC    GEWEI
                  AJMP   PULSE1
TELI4:            MOV    GEWEI,#9
                  MOV    A,SHIWEI
                  JZ     TELI1
                  DEC    SHIWEI
                  AJMP   PULSE1
TELI1:            MOV    SHIWEI,#9
                  MOV    A,BAIWEI
                  JZ     TELI2
                  DEC    BAIWEI
                  AJMP   PULSE1
TELI2:            MOV    BAIWEI,#9
                  MOV    A,QIANWEI
                  JNZ    FENXI1
                  MOV    A,LSCOUNT1
                  CJNE   A,#01H, RIGHTTURN1
                  CLR    TR0
                  AJMP   Notkey
FENXI1:           DEC    QIANWEI
                  AJMP   PULSE1

                  NOP
                  NOP
                  NOP

RIGHTTURN1:       CPL    P1.1                                 ;电机1右转驱动程序
                  MOV    QIANWEI,KeyvaluBuffer
                  MOV    BAIWEI,KeyvaluBuffer+1
                  MOV    SHIWEI,KeyvaluBuffer+2
                  MOV    GEWEI,KeyvaluBuffer+3
                  MOV    TH0,#0F0H
                  MOV    TL0,#0FFH
                  SETB   TR0
PULSE2:           MOV    A,GEWEI
                  JZ     COMU1
                  JNB    TF0,$
                  CLR    TF0
                  CPL    P1.0
                  MOV    TH0,#0F0H
                  MOV    TL0,#0FFH
                  DEC    GEWEI
                  AJMP   PULSE2
COMU1:            MOV    GEWEI,#9
                  MOV    A,SHIWEI
                  JZ     COMU2
                  DEC    SHIWEI
                  AJMP   PULSE2
COMU2:            MOV    SHIWEI,#9
                  MOV    A,BAIWEI
                  JZ     COMU3
                  DEC    BAIWEI
                  AJMP   PULSE2
COMU3:            MOV    BAIWEI,#9
                  MOV    A,QIANWEI
                  JNZ    FENXI2
                  MOV    A,RSCOUNT1
                  CJNE   A,#00H,FAINT
                  CPL    P1.1
                  AJMP   MOTORCICLE1
 FAINT:           CPL    P1.1
                  CLR    TR0
                  AJMP   Notkey
FENXI2:           DEC    QIANWEI
                  AJMP   PULSE2

MOTORCICLE2:
                  MOV    TMOD ,#00000001B
LEFTTURN2:        MOV    QIANWEI,KeyvaluBuffer                ;电机2左转驱动程序
                  MOV    BAIWEI,KeyvaluBuffer+1
                  MOV    SHIWEI,KeyvaluBuffer+2
                  MOV    GEWEI,KeyvaluBuffer+3
                  MOV    TH0,#0F0H
                  MOV    TL0,#0FFH
                  SETB   TR0
WAVE1:            MOV    A,GEWEI
                  JZ     HAI4
                  JNB    TF0,$
                  CLR    TF0
                  CPL    P1.2
                  MOV    TH0,#0F0H
                  MOV    TL0,#0FFH
                  DEC    GEWEI
                  AJMP   WAVE1
HAI4:             MOV    GEWEI,#9
                  MOV    A,SHIWEI
                  JZ     HAI1
                  DEC    SHIWEI
                  AJMP   WAVE1
HAI1:             MOV    SHIWEI,#9
                  MOV    A,BAIWEI
                  JZ     HAI2
                  DEC    BAIWEI
                  AJMP   WAVE1
HAI2:             MOV    BAIWEI,#9
                  MOV    A,QIANWEI
                  JNZ    FENXI3
                  MOV    A,LSCOUNT2
                  CJNE   A,#01H, RIGHTTURN2
                  CLR    TR0
                  AJMP   Notkey
FENXI3:           DEC    QIANWEI
                  AJMP   WAVE1

                  NOP
                  NOP
                  NOP

RIGHTTURN2:       CPL    P1.3                                ;电机2右转驱动程序
                  MOV    QIANWEI,KeyvaluBuffer
                  MOV    BAIWEI,KeyvaluBuffer+1
                  MOV    SHIWEI,KeyvaluBuffer+2
                  MOV    GEWEI,KeyvaluBuffer+3
                  MOV    TH0,#0F0H
                  MOV    TL0,#0FFH
                  SETB   TR0
WAVE2:            MOV    A,GEWEI
                  JZ     JUN1
                  JNB    TF0,$
                  CLR    TF0
                  CPL    P1.2
                  MOV    TH0,#0F0H
                  MOV    TL0,#0FFH
                  DEC    GEWEI
                  AJMP   WAVE2
JUN1:             MOV    GEWEI,#9
                  MOV    A,SHIWEI
                  JZ     JUN2
                  DEC    SHIWEI
                  AJMP   WAVE2
JUN2:             MOV    SHIWEI,#9
                  MOV    A,BAIWEI
                  JZ     JUN3
                  DEC    BAIWEI
                  AJMP   WAVE2
JUN3:             MOV    BAIWEI,#9
                  MOV    A,QIANWEI
                  JNZ    FENXI4
                  MOV    A,RSCOUNT2
                  CJNE   A,#00H,CHENG
                  CPL    P1.3
                  AJMP   MOTORCICLE2
 CHENG:           CPL    P1.3
                  CLR    TR0
                  AJMP   Notkey
FENXI4:           DEC    QIANWEI
                  AJMP   WAVE2


FindKeyValue:                                              ;计算扫描到的按键键值
                  MOV     A,R5

FindRow:
                  SWAP    A
                  ANL     A,#0FH
                  MOV     Row,#0
NextRow:
                  RRC     A
                  JNC     FindColumn
                  INC     Row
                  JMP     NextRow
FindColumn:
                  MOV     A,R5
                  ANL     A,#0FH
                  MOV     Column,#0
NextColumn:
                  RRC     A
                  JNC     CalculateKeyValue
                  INC     Column
                  JMP     NextColumn
CalculateKeyValue:
                  MOV     A,Column
                  MOV     B,#4
                  MUL     AB
                  ADD     A,Row
                  MOV     KeyValue,A
                  AJMP    LOOP
Decode:                                                       ;将计算出的键值进行译码
                  MOV     DPTR,#DisplayCodeTable
                  MOVC    A,@A+DPTR
                  MOV     DisplayCode,A
                  AJMP    SHOW
DisplayCodeTable:
                  DB      3FH                                 ; 显示数字“0”
                  DB      06H                                 ; 显示数字“1”
                  DB      5BH                                 ; 显示数字“2”
                  DB      4FH                                 ; 显示数字“3”
                  DB      66H                                 ; 显示数字“4”
                  DB      6DH                                 ; 显示数字“5”
                  DB      7DH                                 ; 显示数字“6”
                  DB      07H                                 ; 显示数字“7”
                  DB      7FH                                 ; 显示数字“8”
                  DB      6FH                                 ; 显示数字“9” 
                  DB      77H
                  DB      7CH
                  DB      39H
                  DB      5EH
                  DB      79H
                  DB      71H
                  DB      00H

Delay1:
                 MOV     R7,#2
                 DJNZ    R7,$
                 AJMP    PEN

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -