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

📄 pc-mcu.asm

📁 8052单片机和计算机串口通信的试验。已经成功演示
💻 ASM
字号:

;******************************端口设定***************************************************************************************************
CH451_DCLK		BIT   P1.5             ;串行数据时钟,上升沿激活
CH451_DIN		BIT   P1.6             ;串行数据输出,接CH451的数据输入
CH451_LOAD		BIT   P1.7            ;串行命令加载,上升沿激活
CH451_DOUT		BIT   P3.3            ;INT1,键盘中断和键值数据输入,接CH451的数据输出
CH451_KEY		DATA  30H             ;存放键盘中断中读取的键值
CH451_SIN		DATA  31H             ;有健标志
;********************************************主程序***********************************************************************
				ORG   00H
				AJMP MAIN
				ORG   13H            ;键盘中断向量
				AJMP  CH451_INTER
				ORG 23H
				AJMP SUBK
				ORG 30H
 MAIN:
 	 			MOV PCON,#80H
 				MOV SCON,#50H
 				MOV TMOD,#21H
				MOV TL1,#0FDH
				MOV TH1,#0FDH
				MOV IE,#92H
				SETB TR0
				SETB TR1
				SETB PS
				CLR PX1
				CLR ET0
				CLR   IT1              ;置外部信号为低电平触发			
				CLR   IE1              ;清中断标志
				SETB  EX1              ;允许键盘中断
				SETB EA				   ;开总中断	
;***************************CH451的初始化**********************************************************************************
   				MOV CH451_SIN,#00H
				MOV CH451_KEY,#00H
				CLR   CH451_DIN        ;先低后高,输出上升沿通知CH451选择4线串行接口
				SETB  CH451_DCLK       ;置为默认的高电平
				SETB  CH451_DIN
				SETB  CH451_LOAD
				SETB  CH451_DOUT       ;置为输入

				MOV   B,#02H		   ;CH451内部复位
				MOV   A,#01H
				CALL  CH451_WRITE

				MOV  B,#05H			  ;CH451显示设置
				MOV  A,#00H
				CALL CH451_WRITE
							
				MOV   B,#04H           ;设置系统参数命令
				MOV   A,#03H           ;禁止看门狗,使能键盘功能,使能显示驱动
				CALL  CH451_WRITE      ;发出命令

				MOV   B,#09H           ;加载字数据到DIG1对应的数据寄存器
				MOV   A,#5BH           ;字数据,如果是数码管,则第二个数码管显示"2"
				CALL  CH451_WRITE      ;发出命令
W:ACALL WRITE
MOV A,CH451_KEY
MOV P2,CH451_KEY
   AJMP W
;*********************************串口处理程序********************************************************************************
SUBK:			
				PUSH  PSW              ;现场保护
				PUSH  ACC
				CLR EX1
				JBC RI,RECEIVE
 	 			JBC TI,SENDOK
RECEIVE:		MOV A,SBUF
				MOV CH451_KEY,A
				CLR RI
				AJMP BACK
SENDOK:			MOV R5,#0FFH
BACK:			SETB EX1
				POP   ACC
				POP   PSW				
				RETI
;****************************键值判断*******************************************************************************
KEY_TEST:		CJNE A,#19H,D1
				MOV A,#00H
				AJMP BREAK
 D1:			CJNE A,#10H,D2
 				MOV A,#01H
				AJMP BREAK
D2:			   CJNE A,#11H,D3
 				MOV A,#02H
				AJMP BREAK
D3:			   CJNE A,#12H,D4
 				MOV A,#03H
				AJMP BREAK
D4:			   CJNE A,#8H,D5
 				MOV A,#04H
				AJMP BREAK
D5:			   CJNE A,#9H,D6
 				MOV A,#05H
				AJMP BREAK
D6:			   CJNE A,#0AH,D7
 				MOV A,#06H
				AJMP BREAK
D7:			   CJNE A,#00H,D8
 				MOV A, #07H
				AJMP BREAK
D8:			   CJNE A,#01H,D9
 				MOV A,#08H
				AJMP BREAK
D9:			   CJNE A,#02H,BREAK
 				MOV A, #09H			
BREAK:			RET
;****************************************************************************
WRITE: 	MOV   B,#09H 
	MOV DPTR,#TAB1
	MOV A,CH451_KEY
	MOVC A,@A+DPTR
	ACALL CH451_WRITE
	RET
;******************************CH451写入***************************************************************************************************
; ENTRY: B-ACC 待写的12位数据, 低8位在ACC中, 高4位在B的低4位中
; USE:   ACC, B, R7
CH451_WRITE:	CLR   EX1              ;禁止键盘中断
				CLR   CH451_LOAD       ;命令开始,此命令可以放在后面
				MOV   R7,#08H          ;将ACC中8位送出
CH451_WRITE_8:	RRC   A                ;低位在前,高位在后
				CLR   CH451_DCLK
				MOV   CH451_DIN,C      ;送出一位数据
				SETB  CH451_DCLK       ;产生时钟上升沿通知CH451输入位数据
				DJNZ  R7,CH451_WRITE_8 ;位数据未完继续
				MOV   A,B
				MOV   R7,#04H          ;将B中4位送出
CH451_WRITE_4:	RRC   A                ;低位在前,高位在后
				CLR   CH451_DCLK
				MOV   CH451_DIN,C      ;送出一位数据
				SETB  CH451_DCLK       ;产生时钟上升沿通知CH451输入位数据
				DJNZ  R7,CH451_WRITE_4 ;位数据未完继续
				SETB  CH451_LOAD       ;产生加载上升沿通知CH451处理命令数据
				SETB  EX1              ;允许键盘中断
				RET
;******************************CH451键值读出**************************************************************************************************
; EXIT:  ACC 键值数据
; USE:   ACC, R7
CH451_READ:		CLR   EX1              ;禁止键盘中断
				CLR   CH451_LOAD       ;命令开始
				MOV   A,#07H           ;读取键值命令的高4位0111B
				MOV   R7,#04H          ;忽略12位命令的低8位
CH451_READ_4:	RRC   A                ;低位在前,高位在后
				CLR   CH451_DCLK
				MOV   CH451_DIN,C      ;送出一位数据
				SETB  CH451_DCLK       ;产生时钟上升沿锁通知CH451输入位数据
				DJNZ  R7,CH451_READ_4  ;位数据未完继续
				SETB  CH451_LOAD       ;产生加载上升沿通知CH451处理命令数据
				CLR   A                ;先清除键值单元以便移位
				MOV   R7,#07H          ;读入7位键值
CH451_READ_7:	MOV   C,CH451_DOUT     ;读入一位数据
				CLR   CH451_DCLK       ;产生时钟下升沿通知CH451输出下一位
				RLC   A                ;数据移入ACC,高位在前,低位在后
				SETB  CH451_DCLK
				DJNZ  R7,CH451_READ_7  ;位数据未完继续
				MOV  CH451_KEY,A			
				CLR   IE1             ;清中断标志,读操作过程中有低电平脉冲
				SETB  EX1             ;允许键盘中断
				RET
;***************************** 键盘中断子程序*********************************************************************************
; USE: A,C,  
CH451_INTER:	PUSH  PSW              ;现场保护
				PUSH  ACC
				CLR	   CH451_LOAD       ;命令开始
			 	MOV   A,#0F7H          ;读键值命令,忽略12位命令的低8位,高4位用作结束标志
CH451_INTER_4:	SETB  C                ;在高位添0以检测位数据结束
				RRC   A                ;低位在前,高位在后
				CLR   CH451_DCLK
				MOV   CH451_DIN,C      ;送出一位数据
				SETB  CH451_DCLK       ;产生时钟上升沿锁通知CH451输入位数据
				CJNE  A,#0FFH,CH451_INTER_4 ;位数据未完继续,共4位,完成后为0FFH
				SETB  CH451_LOAD       ;产生加载上升沿通知CH451处理命令数据
				MOV   A,#0FCH          ;该数据用以检测位数据结束
CH451_INTER_7:	MOV   C,CH451_DOUT     ;读入一位数据
				CLR   CH451_DCLK       ;产生时钟下升沿通知CH451输出下一位
				RLC   A                ;数据移入ACC,高位在前,低位在后
				SETB  CH451_DCLK
				JC    CH451_INTER_7    ;位数据未完继续,共7位,完成后才移出0
				ANL A,#00111111B				
				ACALL KEY_TEST
				MOV CH451_KEY,A		 		;保存键值
				MOV   CH451_SIN,#0FFH
				MOV SBUF,A
				SS:				CJNE R5,#0FFH,SS
			  	POP   ACC
				POP   PSW
		 		CLR   IE1              ;清中断标志,该指令需根据实际情况作修改
INBACK:				RETI                   ;中断返回
;*************************************************************************************************************************
TAB1:DB 00111111B,00000110B,01011011B,01001111B,01100110B,01101101B,01111101B,00000111B,01111111B,01101111B
TAB2:DB 01110111B,01111100B,01011000B,01011110B,01111001B,01110001B,01101111B,01110110B,00111000B,01110011B
		END  

⌨️ 快捷键说明

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