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

📄 8279.asm

📁 又是本人自己编写的8279键盘显示芯片的程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
		NAME	MPU51A_8279
       ;/* 8279的A0连接到A0  */
CMD_8279        EQU 	 0F001H	;8279命令字、状态字地址
DATA_8279       EQU 	 0F000H	;8279读写数据口的地址
EXTRN	CODE(T_61C1024,T_25045)
EXTRN	CODE(START_8155,A_D,D_A,START_232,START_485,START_PHO,R485_Send_Receive0)
EXTRN	CODE(Read_Time, Write_Time, ReadAlarm, WriteAlarm,Init_12887,DELAY500MS,ALARM)
EXTRN	CODE(START0,Send_Receive0,INIT8155,Test8155Ram,Test8155IO)
EXTRN	CODE(START_8250)
PUBLIC	START_8279,INIT8279,SCAN_KEY,KKK

bit_seg		SEGMENT BIT
RSEG 		bit_seg
WR_FLAG:	DBIT	 1
RD_FLAG:	DBIT	 1
TEMP_FLAG:	DBIT	 1

data_seg	SEGMENT DATA 
RSEG	 	data_seg
WR_COUNTER:	DS	1
NUM_COUNTER:	DS	1
DATA_LED:	DS	1

code_seg	SEGMENT CODE
RSEG	 	code_seg

START_8279:	ACALL	INIT8279
         	LCALL	ALARM            ;CLOSE SPEAKER
           	CLR	WR_FLAG          ;清理标志位
           	CLR	RD_FLAG	
           	CLR	TEMP_FLAG 
           	MOV	NUM_COUNTER,#00H
           	MOV	DATA_LED,#84H		
           	MOV	A,#90H           ;指向第一位数码管,下次写自动指向下一位
           	ACALL	WRITE_CMD
RE_SCAN:  	ACALL	SCAN_KEY         ;扫键,所得键值
	   	CJNE	A,#0FFH,KEY_DEPR
	   	SJMP	RE_SCAN          ;无键按下
KEY_DEPR:  	ACALL	KEY_NUM          ;键值转换为键号
           	CJNE	A,#10H,$+3
           	JC	LOW1
           	ANL	A,#0FH		 ;功能键处理程序段
           	MOV	B,A
           	RL	A
           	ADD	A,B
		MOV	DPTR,#FUNC_KEY
           	JMP	@A+DPTR          ;根据键值跳至功能程序跳转列表
LOW1:	                                 ;数字键处理程序段
           	MOV	B,A              ;B暂存键号
           	CLR	RD_FLAG	 
           	CLR	WR_FLAG       
           	INC	NUM_COUNTER
           	MOV	A,NUM_COUNTER
           	CJNE	A,#5,$+3
           	JNC	NEQ4
           	MOV	A,B
           	ACALL	LED_DISP
           	JMP	RE_SCAN
NEQ4:    	MOV	A,DATA_LED
           	MOV	C,TEMP_FLAG       
           	MOV	ACC.0,C
           	MOV	DATA_LED,A
           	ACALL	WRITE_CMD
           	MOV	A,B
           	ACALL	LED_DISP
           	CPL	TEMP_FLAG        ;在84H和85H中循环修改
           	JMP	RE_SCAN  
;功能跳转列表
FUNC_KEY: 	LJMP	MON
           	LJMP	RD_FUNC
           	LJMP	WR_FUNC
           	LJMP	EXE  
;8279初始化
INIT8279:  	MOV	A,#00H          ;模式设置命令
		MOV	DPTR,#CMD_8279  ;CMD_8279为写命令地址、读状地址
	   	MOVX	@DPTR,A
           	MOV	A,#34H          ;可编程时钟设置,设置分频系数
	   	MOVX	@DPTR,A
		ACALL	CLEAR
		MOV	A,#90H
		LCALL	WRITE_CMD
		MOV	A,#00H
		MOV	R6,#6		;检查数码管是否都正常
RE8279:		LCALL	WRITE_DATA
		DJNZ	R6,RE8279
		LCALL	DELAY500MS
		ACALL	CLEAR
		mov	a,#80h
	   	movx	@dptr,a 	;在第一位显示‘P’
		mov	dptr,#DATA_8279
		mov	a,#0Eh          ;"P"	
	   	movx	@dptr,a
	   	RET
;清屏程序          
CLEAR:    	PUSH 	DPL
           	PUSH 	DPH
           	PUSH	ACC
           	MOV 	A,#0DFH            ; 清除命令
           	MOV 	DPTR,#CMD_8279
           	MOVX 	@DPTR,A
WAIT1:   	MOVX 	A,@DPTR
           	JB 	ACC.7,WAIT1        ; 显示RAM清除完毕吗?
	   	POP 	ACC
	   	POP 	DPH
	   	POP 	DPL
	   	RET 
;写命令	   
WRITE_CMD: 	PUSH 	DPL                 ;命令设置,参数A
           	PUSH 	DPH
           	MOV 	DPTR,#CMD_8279
           	MOVX 	@DPTR,A
           	POP 	DPH
	   	POP 	DPL
           	RET	
;写数据
WRITE_DATA:	PUSH 	DPL             ;命令设置,参数A
           	PUSH 	DPH
           	MOV 	DPTR,#DATA_8279
           	MOVX 	@DPTR,A
           	POP 	DPH
	   	POP 	DPL
           	RET	           
;读数据          
READ_DATA:	PUSH 	DPL              ;读数据,存在A中
           	PUSH 	DPH
           	MOV 	DPTR,#DATA_8279
           	MOVX 	A,@DPTR
           	POP 	DPH
	   	POP 	DPL
           	RET
;读状态
READ_STA: 	PUSH 	DPL              ;读数据,存在A中
           	PUSH 	DPH
           	MOV 	DPTR,#CMD_8279
           	MOVX 	A,@DPTR
           	POP 	DPH
	   	POP 	DPL
           	RET	 
;键扫程序
SCAN_KEY:	MOV	DPTR,#CMD_8279
           	MOVX	A,@DPTR
READ_FIFO: 	ANL	A,#7       	;有键按下
           	JZ	NO_KEY
READ:     	MOV 	A,#40H
           	ACALL 	WRITE_CMD
           	ACALL 	READ_DATA
           	RET
NO_KEY:		MOV	A,#0FFH  	;无键按下,返回FFH  
           	RET
;查表程序,返回被查数据(在A中)在表(首址由DPTR指出)中的位置A
NUM_QUERY:	PUSH	B
		PUSH	07H
		MOV	B,A
          	MOV	R7,#0		;键号计数器
          	SJMP	REP3
CMP_NEXT: 	INC	R7
          	INC 	DPTR      
REP3:  		CLR	A
          	MOVC	A,@A+DPTR
          	CJNE	A,B, CMP_NEXT    ;不等,比较下一个
          	MOV	A,R7
          	POP	07H
          	POP	B
		RET 
;查询键号     
KEY_NUM:  	PUSH 	DPL              
          	PUSH 	DPH
          	MOV	DPTR,#KEY_TAB
          	ACALL	NUM_QUERY
          	POP 	DPH
	  	POP 	DPL
          	RET
;查询LED显示的数据,由段码到键号               
RAM_TO_NUM:	PUSH 	DPL              
          	PUSH 	DPH
          	MOV	DPTR,#LED_TAB
          	ACALL	NUM_QUERY
          	POP 	DPH
	  	POP 	DPL
          	RET
;显示0~F ,A给出参数 送 10H消隐      
LED_DISP: 	PUSH	DPL              
          	PUSH	DPH
          	MOV	DPTR,#LED_TAB
          	MOVC	A,@A+DPTR
          	ACALL	WRITE_DATA 
          	POP 	DPH
	  	POP 	DPL
          	RET  
;显示由DPTR指出的内容于数据数码管(最后两个数码管)
DATA_DISP:	PUSH 	DPL              
          	PUSH 	DPH
          	MOV	A,#94H
          	LCALL	WRITE_CMD
          	MOVX 	A,@DPTR
          	PUSH	ACC
          	ANL	A,#0F0H
          	SWAP	A
          	LCALL	LED_DISP
          	POP	ACC
          	ANL	A,#0FH
          	LCALL	LED_DISP
          	POP 	DPH
	  	POP 	DPL
          	RET  
                  
;参数A给出第几个数码管,返回A显示的数据(0~F)                 
GET_LED:  	ORL	A,#60H
          	ACALL	WRITE_CMD
          	ACALL	READ_DATA
          	ACALL	RAM_TO_NUM
          	RET

WR_LED?:  	ORL	A,#80H
          	ACALL	WRITE_CMD
          	RET
                    
;显示DPTR的内容
DISP_DPTR:	PUSH	DPL              
          	PUSH	DPH
          	MOV	A,#90H
          	ACALL	WRITE_CMD
          	MOV	A,DPH
          	ANL	A,#0F0H
          	SWAP	A
          	ACALL	LED_DISP
          	MOV	A,DPH
          	ANL 	A,#0FH
          	ACALL	LED_DISP
          	MOV	A,DPL
          	ANL	A,#0F0H
          	SWAP	A
          	ACALL	LED_DISP
          	MOV	A,DPL
          	ANL 	A,#0FH
          	ACALL	LED_DISP
          	POP 	DPH
	  	POP	DPL
          	RET	   
LED_TAB:  	DB	048H,0EBH,8CH,89H,2BH,19H,18H,4BH,08H,09H,0AH,38H
		DB	5CH,0A8H,1CH,1EH,0FFH,0BFH
                        ;0~F字型码、消隐、“-”
KEY_TAB:  	DB	0D0H,0D1H,0D2H,0D3H,0D5H,0D6H,0D7H,0C8H,0CAH,0CBH
          	DB	0CCH,0CDH,0CFH,0C0H,0C1H,0C2H,0C3H,0CEH,0C9H,0D4H 
                        ;键值表,按照要求排列成键号,功能键在最后,
                        ;最后四个依次为EXE,RD,WR,MON
;读LED buffer                        
ReadLED:	ACALL	READ_DATA
           	CJNE	A,#0FFH,ReadLED1   
           	CLR	A		;为FFH则说明没有按键输入地址中某位,默认为输入0
           	RET
ReadLED1:	ACALL	RAM_TO_NUM         ;读到的RAM中的数据转换为键号A
		RET

;将从显存中取出的数组合成两个字节的DPTR
GET_DPTR:       MOV	A,#70H
           	ACALL	WRITE_CMD
           	ACALL	READ_DATA
           	CJNE	A,#0EH,TRUE_READ   ;发现是0EH则说明没有按键
           	MOV	DPTR,#0000         ;没有给出地址要读写就从0000开始
           	RET
TRUE_READ:	MOV	A,#70H             ;从第一个数码管开始读
           	ACALL	WRITE_CMD
RE_READ:  	CALL	ReadLED
		SWAP	A
		MOV	B,A
		CALL	ReadLED
		ORL	A,B
		PUSH	ACC
		CALL	ReadLED
		SWAP	A
		MOV	B,A
		CALL	ReadLED
		ORL	A,B
		MOV	DPL,A
		POP	DPH
		RET

CL_DATALED:	MOV	A,#84H            ;消隐数据数码管,等待输入
		ACALL	WRITE_CMD
		MOV	A,#10H
           	ACALL	LED_DISP
           	MOV	A,#85H
           	ACALL	WRITE_CMD
           	MOV	A,#10H
           	ACALL	LED_DISP  
           	RET  

WR_OVER:   	MOV	A,#84H            ;数据数码管 显示“--”,等待输入
           	ACALL	WRITE_CMD
           	MOV	A,#11H
           	ACALL	LED_DISP
           	MOV	A,#85H
           	ACALL	WRITE_CMD
           	MOV	A,#11H
           	ACALL	LED_DISP  
           	RET   
;*****************MESSAGE***************
OK1:    	ACALL	CLEAR             ;SHOW 'oh'
        	MOV	A,#94H
        	ACALL	WRITE_CMD
        	MOV	A,#0B8H
        	ACALL	WRITE_DATA
        	MOV	A,#3AH
        	ACALL	WRITE_DATA
        	LCALL	DELAY250MS
        	RET
ERR_SHOW: 	ACALL   CLEAR              ;show 'err'
        	MOV	A,#93H
        	ACALL	WRITE_CMD
        	MOV	A,#01CH
        	ACALL	WRITE_DATA
        	MOV	A,#0BEH
        	ACALL	WRITE_DATA
        	MOV	A,#0BEH
        	ACALL	WRITE_DATA
        	RET  

KKK:    	LCALL	SCAN_KEY
		CJNE	A,#0FFH,JUDGE1
		CLR	C
		JMP	RET_KKK
JUDGE1: 	CJNE	A,#0C3H,RET_KKK
        	SETB	C
RET_KKK:	RET         

DELAY250MS:	MOV	 R5,#5
DEL:	   	MOV	 R7,#200
DEL1:   	MOV	 R6,#123
DEL2:   	DJNZ	 R6,DEL2
          	DJNZ	 R7,DEL1
	  	DJNZ	 R5,DEL
	  	RET                                                              
;****************功能键-返回************************0C3H,0CEH,0C9H,0D4H
MON:	   	ACALL	CLEAR
		CLR	RD_FLAG
		CLR	WR_FLAG
           	MOV	A,#80H
	   	ACALL	WRITE_CMD
	   	MOV	A,#0EH
	   	ACALL	WRITE_DATA
	   	MOV	NUM_COUNTER,#0
	   	MOV	A,#90H
	   	ACALL	WRITE_CMD
           	LJMP	RE_SCAN

⌨️ 快捷键说明

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