📄 pc-mcu.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 + -