小弟最近在做一个课程设计,我想用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]