急求:关于CH451与8951的接口

小弟最近在做一个课程设计,我想用CH451(DIP28)来扫描4*4的键盘,但是用自己写的代码CH451始终无法动作

硬件上,我使用的引脚如下: D0至D3,S0至S3,9、10连接在一起后接地,VCC直接接电源(电源已配去耦电容,100+0.1)DOUT至INT0,LOAD至P2.4,DIN至P2.5,DCLK至P2.6

我使用的是汇编语言,代码如下: 初始化函数: ;1.INIT_CH451:初始化CH451键盘扫描模块 INIT_CH451: PUSH PSW PUSH A ;Step 1:在DIN引脚上产生负脉冲,使能4线串行接口 CLR DIN SETB DCLK SETB LOAD SETB DOUT SETB DIN

;Step 2:设定系统参数:使能键盘扫描 ; 低八位操作码: 0000 0010 B CLR LOAD

MOV CH451_BUFF1,#08H MOV A,#03H

SEND_LOW: RRC A CLR DCLK MOV DIN,C NOP NOP SETB DCLK DJNZ CH451_BUFF1,SEND_LOW

; 高八位操作码: 0000 0100 B MOV CH451_BUFF1,#04H MOV A,#00000100B

SEND_HIGH: RRC A CLR DCLK MOV DIN,C NOP NOP SETB DCLK DJNZ CH451_BUFF1,SEND_HIGH

; 发送执行指令 SETB LOAD NOP NOP

;使能中断,并设置为低电平触发: CLR IT0 CLR IE0 MOV IE,#10000001B

POP A POP PSW RET

2.读取键值的函数: ;2.RD_KEY:中断产生后,读取按键的值 RD_KEY: ;Step 1:发送读按键指令 ; 八位指令: 0000 0111 B CLR LOAD

MOV CH451_BUFF1,#4 MOV A,#00000111B

SEND_RECEIVE: CLR DCLK RRC A MOV DIN,C NOP NOP SETB DCLK DJNZ CH451_BUFF1,SEND_RECEIVE

; 发送执行指令 SETB LOAD NOP NOP

;Step 2:接收按键代码: MOV CH451_BUFF1,#6 CLR A

RECEIVE: CLR DCLK MOV C,DOUT RLC A SETB DCLK DJNZ CH451_BUFF1,RECEIVE RET

按键处理采用中断的方式,我中断的部分为了测试,代码如下: KEYIN: PUSH PSW PUSH A CLR EX0 ; CALL RD_KEY ;此功能暂不启用 JMP $

我个人的想法如下:此时如按下键值,INTO引脚应能探测到低电平,可是却一直是高电平

执行程序后,引脚电平如下: S0至S3均为低电平,D0至D3均为高电平,DOUT恒为高电平

跪求达人帮忙!小弟昨天试了一晚上,始终无法让它动作,感激不尽!!! [Emot]20[/Emot]

操作CH451其实很简单,主要是注意以下两点: (1).查看芯片上的小字批号。如果是2027开头的就是新批号,否则是老批号,老批号的芯片在发命令之前,要操作一下DIN引脚,也就是给一个低电平脉冲,通知CH451选择四线接口方式,然后再发其他的命令,如果是新批号的芯片,则无需此步; (2).设置系统参数的命令0x0403是很重要的,这条命令发送完后,在CH451的DIG引脚上,就会有脉冲,如果没有,就说明发的命令有问题,你用示波器去查看DCLK,DIN引脚,看发送的数据是否正确,最终确定程序哪有问题。


只有登录才能回复,可以选择微信账号登录