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

📄 noname1.asm

📁 此程序用164扩展键盘和显示功能
💻 ASM
字号:
;************************************************************************
		INCLUDE		HT46F47E.INC
		DATA.SECTION'DATA'
		DISP_RAM1   DB    		?   		;数码管1显示内容寄存器
		DISP_RAM2   DB    		?   		;数码管2显示内容寄存器
		DISP_RAM3   DB    		?  			;数码管3显示内容寄存器
		DISP_RAM4   DB    		?   		;数码管4显示内容寄存器
		DISP_RAM    DB   		?  			;查表得到显示代码
		DISP_NUM	DB			?			;扫描第几位数码寄存器 
		DISP_NUM1   DB    		?  	 		;每个数码管显示时延时寄存器
		DISP_NUM2   DB    		?   		;一次调用显示时延时寄存器	 																		
		ACC_BUF		DB			?			;ACC备份
		STATUS_BUF	DB			?			;STATUS备份
		T_4MS		DB			?			;4毫秒计数 
		T_125US		DB			?			;125US
		T_SEC		DB			?			;秒钟计数 
		T_MIN		DB			?			;分钟计数
		SW			DB			?			;十位
		GW			DB			?			;个位
		FLASH		DB			?			;":"闪动
		T_HOUR		DB			?			;HOUR
		TEMP		DB			?
		TEMP1		DB			?			;显示变量
		COM1		EQU			PA.4			;DISPLAY1
		COM2		EQU			PA.5			;DISPLAY1
		COM3		EQU			PA.7			;DISPLAY1
		COM4		EQU			PA.6			;DISPLAY1
		DATA164		EQU			PA.1			;DATA TO 164	
		CLK164		EQU			PA.0			;CLOCK TO 164
		KM			DB			?			;延按键时寄存器
		KEYB		DB			?			
		KBUF		DB			?			;送到输出的键值
		KBUF1		DB			?			;首次键值
		KBUF2		DB			?			;延时后的键值
		K_ONE		EQU			KEYB.0		;首次进入标志
		K_DOWN		EQU			KEYB.1
		BZ_M		DB			?
		BZ_F		EQU			KEYB.2		;蜂鸣器响标志
		KEYK		EQU			KEYB.3		;开关标志
		BZ_S		DB			?			;蜂鸣器响时间长度寄存器
		code.section'code'
;************************************************************************
   		ORG		000H
   		JMP		STAR 
   		ORG		008H
   		JMP		T0_ISR      		
    	ORG		020H
STAR:	
		MOV		A,00H      					
      	MOV		PAC,A  						;设置PA口为输出口 
		CLR		PA 			
		MOV		A,41H						;内存清零
		MOV		MP0,A
RAM_CLR:
		CLR		IAR0
		INC		MP0
		SZ		MP0.6
		JMP		RAM_CLR

		MOV		A,125						
		MOV		TMR,A
		MOV		A,92H						;4分频*125=500/4(指令周期)=125US	
		MOV		TMRC,A
		MOV		A,05H						;开定时中断和总中断
		MOV		INTC,A						
BEGIN:										
		SET		BZ_F						
		SET		PA.3
		MOV		A,250
		MOV		BZ_S,A
;*********************主程序******************************************
MAIN: 	
		CLR		WDT	
		CALL	SW_TEST 					;按键检测
		CALL	SW_OUT 						;功能输出
		SNZ		KEYK						;是否开机?
 		JMP		MAIN						;NO
      	CALL 	TIME_MAN      				;进制转换
		CALL 	DISPLAY 					;显示扫描
MAIN1:										;4MS执行一次主程序
		SZ		T_125US						;4MS到?
		JMP		MAIN1						;NO等待
		JMP		MAIN						;YES循环
;*********************显示扫描******************************************
DISPLAY:
		CALL	CLR_COM						;清COM
		INC		DISP_NUM					;加一
		MOV		A,DISP_NUM					;
		AND		A,00000011B					;
		ADDM	A,PCL						;
		JMP		DISPLAY1					;扫描第一位
		JMP		DISPLAY2					;扫描第二位
		JMP		DISPLAY3					;扫描第三位
		JMP		DISPLAY4		 			;扫描第四位
DISPLAY1: 					
      	MOV		A,DISP_RAM1   				
      	MOV		TBLP,A        				;取显示值,放入查表的偏移量寄存器
      	TABRDL 	DISP_RAM  					;查表,取显示代码 
      	MOV		A,DISP_RAM    				
		CALL		OUT_164					;输出到164
		SET		COM1						;打开第一个数码管公共端
		RET 
DISPLAY2:
      	MOV		A,DISP_RAM2   				 
      	MOV		TBLP,A        				;取显示值,放入查表的偏移量寄存器
      	TABRDL  DISP_RAM  					;查表,取显示代码 
		SZ		FLASH    					;":"闪动
		SET		DISP_RAM.7
      	MOV		A,DISP_RAM
		CALL	OUT_164
		SET		COM2
		RET
DISPLAY3:
      	MOV		A,DISP_RAM3   				
      	MOV		TBLP,A        				;取显示值,放入查表的偏移量寄存器
      	TABRDL  DISP_RAM  					;查表,取显示代码 
      	MOV		A,DISP_RAM    				
		CALL		OUT_164
		SET		COM3
		RET 
DISPLAY4:
      	MOV		A,DISP_RAM4  				
      	MOV		TBLP,A        				;取显示值,放入查表的偏移量寄存器
      	TABRDL  DISP_RAM  					;查表,取显示代码 
      	MOV		A,DISP_RAM    				
		CALL	OUT_164     				
		SET		COM4
		RET
CLR_COM:        				
		CLR		COM1
		CLR		COM2
		CLR		COM3
		CLR		COM4    
      	RET
;************************164输出******************************************               					
OUT_164:
		MOV		TEMP1,A
		MOV		A,8
		MOV		TEMP,A
OUT_164_1:
		CLR		CLK164
		CLR		DATA164
		SZ		TEMP1.7
		SET		DATA164
		NOP
		SET		CLK164
		RL		TEMP1
		SDZ		TEMP
		JMP		OUT_164_1
		RET
;***********************按键检测*********************************************
SW_TEST:
;		SZ		K_ONE
;		JMP		OUT_164SW1
;		SET		K_ONE
		CALL	CLR_COM
		MOV		A,00H
		CALL	OUT_164
		CALL	OUT_164SW
		RET		
OUT_164SW:
		MOV		A,01H
		MOV		TEMP1,A
		MOV		A,8
;--------------------------------------------------------------------------
OUT_164SW_1:
		CLR		CLK164						;CLOCK清零
		CLR		DATA164						;DATA清零
		SZ		TEMP1.0						;TEMP第0位是否为O
		SET		DATA164						;NO,则置DATA为高
		NOP		
		NOP
		SET		CLK164						;CLOCK拉高,输出数据
		NOP							
		CLR		DATA164						;DATA清零		
		SET		PAC.1						;DATA设置为输入
		NOP
		NOP
		NOP
		NOP
		SZ		DATA164						;是否有按键按下
		JMP		KEY_PRESSED					;有按键按下则处理
		CLR		PAC.1						;PAC.1为输出
		RL		TEMP1						;左移
		SDZ		ACC							;8位是否传完
		JMP		OUT_164SW_1					;未完,返回
		SET		K_DOWN
		RET
KEY_PRESSED:
		CLR		PAC.1						;PAC.1OUTPUT
		CLR		K_DOWN
		MOV		A,TEMP1
		MOV		KBUF,A
		CLR		TEMP
		CLR		TEMP1
		RET
;-------------------------------------------------------------
;OUT_164SW1:
;		CALL	DISPLAY1
;		CALL	DISPLAY2
;		CALL	DISPLAY3
;		CALL	DISPLAY4
;		MOV		A,01H
;		MOV		TEMP1,A
;		MOV		A,8
;OUT_164SW_2:
;		CLR		CLK164						;CLOCK清零
;		CLR		DATA164						;DATA清零
;		SZ		TEMP1.0						;TEMP第0位是否为O
;		SET		DATA164						;NO,则置DATA为高
;		NOP		
;		NOP
;		SET		CLK164						;CLOCK拉高,输出数据
;		NOP							
;		CLR		DATA164						;DATA清零		
;		SET		PAC.1						;DATA设置为输入
;		NOP
;		NOP
;		NOP
;		NOP
;		SZ		DATA164						;是否有按键按下
;		JMP		KEY_PRESSED1				;有按键按下则处理
;		CLR		PAC.1						;PAC.1为输出
;		RL		TEMP1						;左移
;		SDZ		ACC							;8位是否传完
;		JMP		OUT_164SW_1					;未完,返回
;		SET		K_DOWN						;没有按键按下或已释放按键
;		RET
;KEY_PRESSED1:
;		CLR		PAC.1						;PAC.1OUTPUT
;		CLR		K_DOWN						;
;		MOV		A,TEMP1
;		XOR		A,KBUF1
;		SZ		ACC
;		JMP		KEY_CLR
;		MOV		A,TEMP1
;		MOV		KBUF,A
;		CLR		KBUF1
;		CLR		KBUF2
;		CLR		TEMP
;		CLR		TEMP1
;		CLR		K_ONE
;		RET
;KEY_CLR:
;		CLR		KBUF1
;		CLR		KBUF2
;		CLR		TEMP
;		CLR		TEMP1
;		CLR		K_ONE
;		RET
;*********************按键输出********************************
;----------------------时钟加1--------------------------------
SW_OUT:
		SNZ		K_DOWN						;是否释放
		RET									;NO
		MOV		A,KBUF			
		XOR		A,01H
		SZ		ACC
		JMP		SW1
		SNZ		KEYK
		RET
		SET		BZ_F
		SET		PA.3
		MOV		A,20
		MOV		BZ_S,A
		INC		T_HOUR
		CLR		KBUF
		MOV		A,T_HOUR
		XOR		A,24
		SZ		ACC
		RET
		CLR		T_HOUR
		RET
;*************************分钟加1*******************************
SW1:
		MOV		A,KBUF
		XOR		A,02H
		SZ		ACC
		JMP		SW2
		SNZ		KEYK
		RET
		SET		BZ_F
		SET		PA.3
		MOV		A,20
		MOV		BZ_S,A
		INC		T_MIN
		CLR		KBUF
		MOV		A,T_MIN
		XOR		A,60
		SZ		ACC
		RET
		CLR		T_MIN
		RET
;*********************开关**********************************
SW2:	
		MOV		A,KBUF
		XOR		A,08H
		SZ		ACC
		JMP		SW3		
		SET		BZ_F
		SET		PA.3
		MOV		A,20
		MOV		BZ_S,A
		SNZ		K_ONE
		JMP		KEY_ON
		JMP		KEY_OFF
;-----------------------------------------------------------
KEY_ON:
		SET		KEYK
		SET		K_ONE
		CLR		KBUF
		CLR		T_HOUR
		CLR		T_MIN
		CLR		T_4MS
		CLR		T_125US
		RET
;-------------------------------------------------------------
KEY_OFF:
		CLR		KEYK
		CLR		K_ONE
		CLR		KBUF
		RET
;********************清零*******************************
SW3:
		MOV		A,KBUF
		XOR		A,04H
		SZ		ACC
		RET
		SNZ		KEYK
		RET
		SET		BZ_F
		SET		PA.3
		MOV		A,250
		MOV		BZ_S,A
		CLR		T_SEC
		CLR		T_MIN
		CLR		T_HOUR
		CLR		T_125US
		CLR		T_4MS
		CLR		KBUF
		RET	
;**********************进制转换*********************************
TIME_MAN:
		MOV		A,T_MIN
		CALL	H2D
		MOV		A,GW
		MOV		DISP_RAM4,A
		MOV		A,SW
		MOV		DISP_RAM3,A
		MOV		A,T_HOUR
		CALL	H2D
		MOV		A,GW
		MOV		DISP_RAM2,A
		MOV		A,SW
		MOV		DISP_RAM1,A
		RET
;------------------------------------------------------------------------
H2D:
		CLR		SW		
H2D_LOOP:
		MOV		GW,A
		SUB		A,10
		SNZ		C
		RET
		INC		SW
		JMP		H2D_LOOP  			
;**************************定时中断************************************				
T0_ISR:
		MOV		ACC_BUF,A
		MOV		A,STATUS
		MOV		STATUS_BUF,A
		INC		T_125US
		MOV		A,T_125US
		XOR		A,32
		SZ		ACC
		JMP		T0_ISR_EXIT
		CLR		T_125US
		SZ		BZ_F
		JMP		BZ_ON
		JMP		T0_ISR1
BZ_ON:
		DEC		BZ_S
		SZ		BZ_S
		JMP		T0_ISR1
		CLR		PA.3
		CLR		BZ_F
		CLR		BZ_S
T0_ISR1:
		INC		T_4MS
		INC		KM	
		SET		FLASH
		MOV		A,T_4MS
		SUB		A,125
		SNZ		C
		JMP		T0_ISR_EXIT
		CLR		FLASH
		SUB		A,125
		SNZ		C
		JMP		T0_ISR_EXIT
		CLR		T_4MS
		INC		T_SEC
		MOV		A,T_SEC
		SUB		A,60
		SNZ		C
		JMP		T0_ISR_EXIT
		CLR		T_SEC
		INC		T_MIN
		MOV		A,T_MIN
		SUB		A,60
		SNZ		C
		JMP		T0_ISR_EXIT
		CLR		T_MIN
		INC		T_HOUR
		MOV		A,T_HOUR
		XOR		A,24
		SZ		ACC
		JMP		T0_ISR_EXIT
		CLR		T_HOUR
T0_ISR_EXIT:
		MOV		A,STATUS_BUF
		MOV		STATUS,A
		MOV		A,ACC_BUF
		RETI
;***************************************************************
; 表格区,0~9对应的显示代码
;***************************************************************
     	ORG		0700H
TABLE: 
DC		5FH,12H,6BH,07AH,36H,07CH,07DH,1AH,07FH,7EH
;     	 0    1    2     3   4   5   6    7   8   9  
;***************************************************************
      END

⌨️ 快捷键说明

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