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

📄 004.asm

📁 这是一个用汇编语言写的四位数码显示程序(先显示P
💻 ASM
字号:
/********************************************************************
 *                                                              
 *  程序功能 :  实现铵键的移位显示并在按下"A"键后个位闪烁功能                                               

                              
 *  应用软件:   KEIL C                                               
 *                                                                      
 ********************************************************************/ 
;按键行列值表示如下:
;----P1.7---P1.6---P1.5---P1.4-------
;----0----1----2----3----P1.0
;----4----5----6----7----P1.1
;----8----9----A----B----P1.2
;----C----D----E----F----P1.3

ORG	0000H
AJMP	MAIN
ORG	0030H
MAIN:
	MOV	DPTR,#TAB1                	 ;将表头位置送入DPT
	MOV   30H,#00H                   	 ;将30显示单元清零 
	MOV   31H,#0FFH                   	 ;将31显示单元清零 
	MOV   32H,#0FFH                   	 ;将32显示单元清零 
	MOV   33H,#0FFH                   	 ;将33显示单元清零 
	MOV	35H,#00H                 	 ;将35显示单元清零   
LOOP:                                    	
	JB	F0,KK1                   	 ;F0若等于一则跳到KK1处
	MOV	35H,#00H                 	
KK2:    
                               	
	LCALL DISPLAY		         	 ;调用显示程序                    
	LCALL	KEY		         	 ;调用键盘描程序                  
	CPL	A                        	 ;将A的值取反                     
	JZ	LOOP             	 	 ;无键按下则返回                
	MOV	A,34H                    	 ;有键按下将键值送入ACC           
	CJNE A,#0AH,NORP                 	 ;若A键未按下则返回到LOOP处       
	SETB	F0                       	 ;若A键按下则将F0值1   
	LJMP LOOP                        	 ;返回LOOP处不断的循环  
KK1:                                     	
	INC	35H                      	 ;将35H向上加一
	MOV	A,35H                    	 ;将35H中的值送入ACC
	CJNE	A,#10,KK2                	 ;ACC中的值与10相等则跳转至KK2
	MOV	35H,#00H                 	 ;若ACC等于零则将35H清零
	CPL	00H                      	 ;将00H位取反
	AJMP	KK2                      	 ;跳转至KK2处
                                         	
NORP:                                    	
	MOV	33H,32H                  	 ;将32H显示单元的内容送入33H  
	MOV 32H,31H                      	 ;将31H显示单元的内容送入32H  
	MOV 31H,30H                      	 ;将30H单元的内容送入31H      
	MOV	A,34H                    	 ;将键值送入ACC               
	MOV	30H,A                    	 ;将ACC的值送入30H            
	LJMP	LOOP                     	 ;返回主程序循环              
DISPLAY:                ;显示子程序
	MOV  P2,#0FFH            ;将P2口置高电平                           
	MOV R7,#100              ;软件计数器赋值                           
DD1:                                                                                       
	JNB	00H,DD1D         ;若00H等0跳至DD1D
	AJMP	DD1B             ;若00H等于1则跳转至DD1B
DD1D:	MOV A,30H                ;将显示缓冲区30H中的值送入ACC              
	MOVC A,@A+DPTR           ;查表取要显示的数并把查表的结果送入ACC     
	MOV P0,A                 ;将要显示的数送入P0口                      
	CLR P2.0                 ;开个位显示单元                            
	LCALL DELAY100US         ;延时100US                                 
	SETB P2.0                ;关个位显示单                              
	AJMP	DD1C                                                        
DD1B:                                                
	MOV A,30H                ;将显示缓冲区30H中的值送入ACC              
	MOVC A,@A+DPTR           ;查表取要显示的数并把查表的结果送入ACC     
	MOV P0,A                 ;将要显示的数送入P0口                      
	SETB P2.0                ;开个位显示单元                            
	LCALL DELAY100US         ;延时100US                                 
	SETB P2.0                ;开个位显示单元                           
DD1C:                                                                                      
	MOV A,31H                ;将显示缓冲区别31H中的值送入A             
	MOVC A,@A+DPTR           ;查表取要显示的数并把查表的结果送入ACC    
	MOV P0,A                 ;将要显示的数送入P0口                     
	CLR P2.1                 ;开十位显示单元                           
	LCALL DELAY100US         ;延时100US                                
	SETB P2.1                ;关十位显示单元                           
                                                                                            
	MOV A,32H                ;将显示缓冲区32H中的值送入ACC            
	MOVC A,@A+DPTR           ;查表取要显示的数并把查表的结果送入ACC   
	MOV P0,A                 ;将要显示的数送入P0口                    
	CLR P2.2                 ;开百位显示单元                          
	LCALL DELAY100US         ;延时100US                               
	SETB P2.2                ;关百位显示单元                         
                                                                                         
	MOV A,33H                ;将显示缓冲区33H中的值送入ACC                                              

    
	MOVC A,@A+DPTR           ;查表取要显示的数并把查表的结果送入ACC 
	MOV P0,A                 ;将要显示的数送入P0口                  
	CLR P2.3                 ;开千位显示单元                        
	LCALL DELAY100US         ;延时100US                             
	SETB P2.3                ;关千位显示单元                        
	DJNZ R7,DD1              ;R7不等于0返回至DD1处                  
	RET                      ;R7等于0子程序返回                     
	
KEY: 	LCALL KS			         ;调用检测按键子程序                           
     	JNZ K1                                   ;有键按下继续                            
	LJMP	KEY_EXIT                         ;无键按下退出KEY子程序                   
K1:  	LCALL DELAY4MS                              ;返回继续检测有无按键按下                
     	LCALL DELAY4MS                                                                       
     	LCALL KS                                    ;有键按下继续延时去抖动                  
     	JNZ K2                                      ;再一次调用检测按键程序                  
	LJMP	KEY_EXIT                         ;无键按下退出KEY子程序                   
K2:	MOV R2,#0EFH                             ;将扫描值送入 R2暂存                     
     	MOV R4,#00H                              ;将第一列的列值00H送入R4暂存,R4用于存放列
K3:	MOV P1,R2                                ;将R2的值送入P1口                        
L6:	JB P1.0,L1                               ;P1.0等于1跳转到L1                       
     	MOV A,#00H                               ;将第一行的行值00H送入ACC                
     	AJMP LK                                  ;跳转到键值处理程序                      
L1:	JB P1.1,L2                               ;P1.1等于1跳转到L2                       
     	MOV A,#04H                                  ;将第二行的行值04H送入ACC                   
     	AJMP LK                                     ;跳转到键值理程序进行键值处理            
L2: 	JB P1.2,L3                                   ;P1.2等于1跳转到L3                       
     	MOV A,#08H                                  ;将第三行的行值08H送入ACC                   
     	AJMP LK                                     ;跳转到键值处理程序                      
L3:	JB P1.3,NEXT                             ;P1.3等于1跳转到NEXT处                   
     	MOV A,#0CH                                  ;将第四行的行值0CH送入ACC                   
LK:	ADD A,R4                                 ;行值与列值相加后的键值送入A             
	MOV	34H,A                    ;将A中的值送入34H暂存                    
K4:					;LCALL DELAY4MS                          ;                          

 	MOV	DPTR,#TAB                	 ;将表头位置送入DPT               
	LCALL DISPLAY                    ;调用动态显示子程序                      
     	LCALL KS                                    ;                                        
     	JNZ K4                                      ;按键没有松开继续返回检测                
     	RET                                         ;按键松开返回                            
                                                                                          
NEXT:                                                                                     
    	INC  R4                                      ;将列值加一                              
    	MOV A,R2                                     ;将R2的值送入A                           
    	JNB ACC.7,KEY_EXIT                           ;扫描完成跳至KEY处进行下一回合的扫描     
    	RL A                                         ;扫描未完成将A中的值右移一位进行下一列的扫描  
    	MOV R2,A                                     ;将ACC的值送入R2暂存                     
    	AJMP K3                                      ;跳转到K3继续                            
KEY_EXIT:                                                                                 
	MOV A,#0FFH                      ;无键按下则将A赋成0FFH。                 
	RET                                                                       
                                                                                          
KS:	MOV P1,#0FH                              ;将P1口高四位置0低四位值1                
     	MOV A,P1                                    ;读P1口                                  
    	XRL A,#0FH                                  ;将A中的值与A中的值相异或                
     	RET                                         ;子程序返回                              
DELAY4MS:				         ;4MS延时
      	MOV R5,#08H
L7:	MOV R6,#0FAH
L8:	DJNZ R6,L8
     	DJNZ R5,L7
     	RET

DELAY100US:                                      ;100US延时
	MOV R5,#50
	DJNZ	R5,$
	RET

TAB:	DB	0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
TAB1:   DB      8CH
        END

⌨️ 快捷键说明

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