基于单片机的步进电机控制器的设计

MOV A,#0D1H ;置清显示命令字 MOVX @DPTR,A ;送清显示命令 WEIT:MOVX A,@DPTR ;读状态

JB ACC.7,WEIT ;等待清显示RAM结束 MOV A,#34H ;置分频系数,晶振12MHz MOVX @DPTR,A ;送分频系数 MOV A,#00H ;置键盘/显示命令 MOVX @DPTR,A ;送键盘/显示命令 MOV IE,#84H ;允许8279中断 RET

显示子程序如下:

DIS:MOV DPTR,#7FFFH ;置8279命令/状态口地址 MOV R0,#30H ;字段码首地址 MOV R7,#08H ;8位显示 MOV A,#90H ;置显示命令字 MOVX @DPTR,A ;送显示命令 MOV DPTR,#7FFEH ;置数据口地址 LP:MOV A,@R0 ;取显示数据 ADD A,#6 ;加偏移量

MOVC A,@A+PC ;查表,取得数据的段码 MOVX @DPTR,A ;送段码显示 INC R0 ;调整数据指针 DJNZ R7,LP ; RET

SEG:DB 3FH,06H,5BH,4FH,66H,6DH ;字符0、1、2、3、4、5段码

44

DB 7DH,07H,7EH,6FH,77H,7CH ;字符6、7、8、9、A、B段码 DB 39H,5EH,79H,71H,73H,3EH ;字符C、d、E、F、P、U段码 DB 76H,38H,40H,6EH,FFH,00H ;字符H、L、-、Y、“空”段码

键盘中断子程序如下:

KEY:PUSH PSW PUSH DPL PUSH DPH PUSH ACC PUSH B SETB PSW.3

MOV DPTR,#7FFFH ;置状态口地址 MOVX A,@DPTR ;读FIFO状态 ANL A,#0FH ; JZ PKYR ;

MOV A,#40H ;置读FIFO命令 MOVX @DPTR,A ;送读FIFO命令 MOV DPTR,#7FFEH ;置数据口地址 MOVX A,@DPTR ;读数据

LJMP KEY1 ;转键值处理程序 PKYR: POP B POP ACC POP DPH POP DPL

45

POP PSW

RETI ;

KEY1: … … ;键值处理程序 键盘程序清单:

KEY1: ACALL KS1 ; 有无键按下子程序 JNZ LK1 ;有键按下,转去抖延时

AJMP

KEY1

;无键按下,继续扫描

LK1: ACALL DELA12 ;12ms延时程序调用 ACALL KS1 ;判断键是否真正按下 JNZ LK2 ;有键按下,转逐列扫描 AJMP

KEY1

;无键按下,继续扫描

LK2: MOV R2,#0FEH ;设置首列扫描字 MOV R4,#00H

;保存首列号

LK4: MOV DPTR,#7F01H;列扫描字送至PA口 MOV

A,R2

MOVX

@DPTR,A

INC DPTR ;指向PC口

INC DPTR MOVX

A,@DPTR ;读入行状态

JB ACC.0,LONE ;第0行无键按下,转LONE MOV A,#00H ;有键按下,设置行首键号 AJMP

LKP ;转求键号

LONE: JB ACC.1,LTWO ;第1行无键按下,转LTWO MOV A,#08H ;有键按下,设置行首键号 AJMP

LKP ;转求键号

46

LTWO: JB ACC.2,LTHR ;第2行无键按下,转LTHR MOV A,#10H ;有键按下,设置行首键? AJMP LKP ;转求键号

LTHR: JB ACC.3,NEXT ;第3行无键按下,查下一列 MOV A,#18H ;有键按下,设置行首键 LKP: ADD A,R4 ;求键号,键号=行首键号+列号 PUSH

ACC ;保护键号

LK3: ACALL KS1 ;等待键释放

JNZ LK3 ;键未释放,继续等待 POP ACC ;键释放,键号送A AJMP

OVER

;键扫描结束

NEXT: INC R4 ;列号加1,指向下一列 MOV A,R2

;判断8列扫描完否

JNB ACC.7,KND ;8列扫描完,继续 RL A ;扫描字左移一位 MOV R2,A ;送扫描字

AJMP

LK4 ;转下一列扫描

KND: AJMP

KEY1

OVER: RET ;键扫描结束 KS1: MOV DPTR,#7F01H

;指向PA口

MOV A,#00H ;设置扫描字 MOVX

@DPTR,A

;扫描字送PA口

INC DPTR ;指向PC口

INC DPTR MOVX

A,@DPTR ;读入PC口状态

47

CPL ;以高电平表示有键按下 ANL A,#0FH ;屏蔽高4位 RET

初始化程序如下:

INIT:MOV DPTR,#7FFFH ;置8279命令/状态口地址 MOV A,#0D1H ;置清显示命令字 MOVX @DPTR,A ;送清显示命令 WEIT:MOVX A,@DPTR ;读状态

JB ACC.7,WEIT ;等待清显示RAM结束 MOV A,#34H ;置分频系数,晶振12MHz MOVX @DPTR,A ;送分频系数 MOV A,#00H ;置键盘/显示命令 MOVX @DPTR,A ;送键盘/显示命令 MOV IE,#84H ;允许8279中断 RET 显示子程序如下:

DIS:MOV DPTR,#7FFFH ;置8279命令/状态口地址 MOV R0,#30H ;字段码首地址 MOV R7,#08H ;8位显示 MOV A,#90H ;置显示命令字 MOVX @DPTR,A ;送显示命令 MOV DPTR,#7FFEH ;置数据口地址 LP:MOV A,@R0 ;取显示数据 ADD A,#6 ;加偏移量

MOVC A,@A+PC ;查表,取得数据的段码 MOVX @DPTR,A ;送段码显示

48

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4