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

📄 ex9-7.asm

📁 《单片机原理实用教程——基于Proteus虚拟仿真》一书的配套光盘
💻 ASM
字号:
 	KD   EQU 40H  		;键值单元
    	ST   EQU 41H		;状态单元
        ORG  0000H              ;复位入口
    	LJMP MAIN
        ORG  0030H
MAIN:   MOV  SP, #50H
 	MOV  7AH,#11H
	MOV  7BH,#10H
	MOV  7CH,#10H
	MOV  7DH,#12H
	MOV  7EH,#10H
	MOV  7FH,#10H
        MOV  ST, #00H
        MOV  KD, #00H
	MOV  DPTR,#7F00H          ;8155命令口地址
	MOV  A,#03H               ;置8155PA、PB口为输出,PC口为输入      
	MOVX @DPTR,A 
ML0:    NOP
        LCALL 	DISP
        LCALL   READKEY             ;调读键值程序
        SJMP    ML0                 ;无键按下,循环等待
READKEY:LCALL   KEY                 ;调按键识别程序 
        MOV     A, R4               ;得到键值在A中
        CJNE    A,#88H,KLD          ;有键按下,转到键值分析
        RET 
KLD:    MOV     KD, A               ;将键值存于KD单元
KDD0:   MOV     A, ST               ;读状态子表入口地址→DPTR
	RL      A
    	PUSH    ACC
    	MOV     DPTR, #TBB1
    	MOVC    A, @A+DPTR
    	MOV     B, A
    	POP     ACC
    	INC     A
    	MOVC    A, @A+DPTR
    	MOV     DPL, A
    	MOV     DPH, B
CTT:    CLR     A
    	MOVC    A, @A+DPTR          ;读判定码
    	CJNE    A, KD, NEE          ;功能键判定
    	SJMP    QEE                 ;是功能键
NEE:    CJNE    A, #0FFH, NCC       ;未用键判定
    	SJMP    QEE                 ;是未用键
NCC:    CJNE    A, #09H, NNN        ;数字键判定
        CJNE    A, KD, NPP
NPP:    JNC     QEE                 ;是数字键
NNN:    INC     DPTR                ;条目不符
        INC     DPTR
        INC     DPTR
        SJMP    CTT                 ;返回,继续读键值并判定
QEE:    CLR     A                   ;判定符合
        INC     DPTR
	MOVC    A, @A+DPTR          ;读次态码→ST
	MOV     ST, A
	JZ      KDD0                ;若为0态,返回KDD0重新进行
	CLR     A
	INC     DPTR
	MOVC    A, @A+DPTR          ;读子程序号
	MOV     DPTR, #SUBJ
	MOV 	R0,A
	RL      A
	ADD	A,R0
	JMP     @A+DPTR             ;散转到子程序入口
SUBJ:   LJMP  SUB0      	    ;转移到不同的子程序
    	LJMP SUB1
    	LJMP SUB2
    	LJMP SUB3
    	LJMP SUB4
    	LJMP SUB5
    	LJMP SUB6
    	LJMP SUB7
    	LJMP SUB8
    	LJMP SUB9
    	LJMP SUB10
    	LJMP SUB11
TBB1:  	DW  TB20 		    ;状态子表入口地址索引表
	DW  TB21
	DW  TB22
	DW  TB23
    	DW  TB24
	DW  TB25 
TB20:   DB  0BH,5,1     	    ;0状态子表
    	DB  0CH,5,2
    	DB  0DH,5,3
    	DB  0EH,5,4
    	DB  0FH,1,0
    	DB  10H,2,0
    	DB  11H,5,5
    	DB  0FFH,5,0
TB21:   DB  09,1,7      ;1状态子表
    	DB  12H,1,8
    	DB  0FH,3,0
    	DB  13H,5,6
    	DB  0FFH,0,0
TB22:  	DB  09,5,9      ;2状态子表
    	DB  13H,5,6
    	DB  0FFH,0,0
TB23:  	DB  09,3,10     ;3状态子表
 	DB  13H,4,0    
	DB  0FFH,0,0
TB24:  	DB  13H,5,6     ;4状态子表
    	DB  0FFH,4,11
TB25:  	DB  0FFH,0,0    ;5状态子表
SUB0:  	MOV 7EH,#0
	MOV 7BH,ST
	RET         ;功能子程序,略
SUB1:  	MOV 7EH,#1
	MOV 7BH,ST
	RET
SUB2:	MOV 7EH,#2
	MOV 7BH,ST  
	RET
SUB3:  	MOV 7EH,#3
	MOV 7BH,ST  
	RET
SUB4:	MOV 7EH,#4
	MOV 7BH,ST   
	RET
SUB5:	MOV 7EH,#5
	MOV 7BH,ST  
	RET
SUB6:	MOV 7EH,#6
	MOV 7BH,ST  
	RET
SUB7:	MOV 7EH,#7
	MOV 7BH,ST  
	RET
SUB8:	MOV 7EH,#8
	MOV 7BH,ST  
	RET
SUB9:	MOV 7EH,#9
	MOV 7BH,ST  
	RET
SUB10:	MOV 7EH,#10
	MOV 7BH,ST  
	RET
SUB11:	MOV 7EH,#11
	MOV 7BH,ST  
	RET

;按键识别子程序
KEY:	MOV    R4,#00H             ;0→键号寄存器R4
	MOV    R2,#01H             ;扫描模式01H→R2
KEY1:   MOV    DPTR,#7F02H
	MOV    A,R2
	MOVX   @DPTR,A             ;扫描模式→8155PB口
	INC    DPTR
	MOVX   A,@DPTR             ;读8155 PC口
	JB     ACC.0,KEY2          ;0列无键闭合,转判1列
	LCALL  DELAY1		   ;延时,反弹跳
	MOVX   A,@DPTR
	JB     ACC.0,KEY2          ;0列无键闭合,转判1列
	MOV    A,#00H              ;0列有键闭合,0→A
	AJMP   KEY55
KEY2:  	JB     ACC.1,KEY3          ;1列无键闭合,转判2列
	LCALL  DELAY1		   ;延时,反弹跳
	MOVX   A,@DPTR
	JB     ACC.1,KEY3          ;0列无键闭合,转判1列
	MOV    A,#01H              ;1列有键闭合,列线号01H→A
	AJMP   KEY55
KEY3:  	JB     ACC.2,KEY4          ;2列无键闭合,转判3列
	LCALL  DELAY1		   ;延时,反弹跳
	MOVX   A,@DPTR
	JB     ACC.2,KEY4          ;0列无键闭合,转判1列
	MOV    A,#02H              ;2列有键闭合,02H→A
	AJMP   KEY55
KEY4:  	JB     ACC.3,KEY5          ;3列无键闭合,转判下一行
	LCALL  DELAY1		   ;延时,反弹跳
	MOVX   A,@DPTR
	JB     ACC.3,KEY5          ;0列无键闭合,转判1列
	MOV    A,#03H              ;3列有键闭合,03H→A
	AJMP   KEY55
KEY5:  	JB     ACC.4,NEXT          ;4列无键闭合,转判下一行
	LCALL  DELAY1		   ;延时,反弹跳
	MOVX   A,@DPTR
	JB     ACC.4,NEXT          ;0列无键闭合,转判1列
	MOV    A,#04H              ;4列有键闭合,04H→A
KEY55: 	ADD    A,R4                ;列线号+(R4)作为键值→A
	MOV    R4,A                ;键值→R4
	RET                        ;返回
NEXT:  	MOV    A,R4;
	ADD    A,#05               ;键号寄存器加4
	MOV    R4,A
	MOV    A,R2
	JB     ACC.3,NEXT1         ;判别是否已扫描到最后一行
	RL     A                   ;扫描模式左移一位
	MOV    R2,A
	AJMP   KEY1                ;重新开始扫描下一行
NEXT1: 	MOV    R4,#88H             ;扫描到最后一行仍无按键置无键闭合标志
	RET  
   
;数码管显示子程序
DISP:	MOV   R0,#7AH              ;置显示缓冲器指针初值
	MOV   R3,#01H              ;置扫描模式初值
DISPB1:	MOV   DPTR,#7F02H          ;8155 PB口地址
	MOV   A,#0h		   ;熄灭所有LED
	MOVX  @DPTR,A                             
	MOV   DPTR,#7F01H          ;8155 PA口地址
	MOV   A,  @R0              ;取显示数据
	ADD   A,#014H              ;加偏移量
	MOVC  A, @A+PC             ;查表取段码
	MOVX  @DPTR,A              ;段码→8155 PA口 	
	MOV   A,R3
	MOV   DPTR,#7F02H          ;8155 PB口地址
	MOVX  @DPTR,A              ;扫描模式→8155 PB口       
	ACALL DELAY                ;延时
	INC   R0
	MOV   A,R3
	JB    ACC.6,DISPB2         ;判6位LED显示完否
	RL    A                    ;扫描模式左移1位
	MOV   R3,A
	AJMP  DISPB1
DISPB2:	MOV   R3,#01H
	RET
SEGPT2:	Db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h   ;段码表
	db 7fh,6fh,77h,7ch,39h,5eh,79h,71h
	db 00h,0D0h,09Ch

 ;延时子程序                     
DELAY:	MOV   R4,#0FFH                     
LOOP:	DJNZ  R4,LOOP
	RET

DELAY1:	MOV   R5,#0B0H
LOOP2:	MOV   R6,#0FFH                     
LOOP1:	DJNZ  R6,LOOP1
	DJNZ  R5,LOOP2
	RET
end

⌨️ 快捷键说明

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