CH451S求救请高手帮忙谢谢

小弟使用的是PIC24FJ256GA106,16位的单片机程序是参照网站上例子写的,只做按键实用没有接数码管,硬件是参照PDF15页的例子去掉了数码管与二极管部分,以下是程序目前的问题是,按键没有任何反应DOUT始终是高电平,5V供电与3.3V供电都试过了现象一样总是按键后没有中断,请高手帮忙看下程序有什么问题?另外请问LOAD、DIN、LDCK这些引脚MCU在输出高低电平时,高低电平各自要保持的时间范围是多少?谢谢! /************************************************************************************** *功能描述:IO口初始化 *输入; 无 *输出:无 *返回:无 /************************************************************************************** *功能描述:外部中断函数 *输入; 无 *输出:无 *返回:无 **************************************************************************************/ void __attribute__((__interrupt__))_INT0Interrupt() { IFS0bits.INT0IF=0; //清中断标志位 delaytime(50); ch451_read(); EX1=1; } /************************************************************************************** *功能描述:键盘初始化 *输入; 无 *输出:无 *返回:无 **************************************************************************************/ void ch451_init(void) { //INTCON2bits.INT0EP=1; TRISDbits.TRISD9=0; //PORTDbits.RD9=1; //DIN=1 //delaytime(9); PORTDbits.RD9=0; //先低后高,选择4线输入DIN=0 delaytime(9); PORTDbits.RD9=1; //DIN=1 delaytime(9); CH451_Write(0x0201); CH451_Write(0x0403); } /************************************************************************************** *功能描述:输出命令子程序 定义一无符号整型变量存储12字节的命令字。 *输入; 无 *输出:无 *返回:无 **************************************************************************************/ void CH451_Write(unsigned int command) { unsigned char i; TRISDbits.TRISD9=0; TRISDbits.TRISD0=0; TRISDbits.TRISD8=0; PORTDbits.RD0=0; //命令开始 LOAD=0 delaytime(9); //d=command; for(i=0;i<12;i++) //送入12位数据,低位在前 { if((command& 0x00001)==0x0001) { PORTDbits.RD9=1; } else { PORTDbits.RD9=0; } //delaytime(10); PORTDbits.RD8=0; //DCLK=0 delaytime(9); command>>=1; PORTDbits.RD8=1; //上升沿有效DCLK=1 delaytime(9); } PORTDbits.RD0=1; //加载数据LOAD=1 delaytime(9);

} /************************************************************************************** *功能描述:输入命令子程序,MCU从451读一字节 *输入; 无 *输出:无 *返回:无 **************************************************************************************/ void ch451_read (void) { uchar i; uchar command; // CH451命令字暂存单元 TRISDbits.TRISD0=0; TRISDbits.TRISD9=0; TRISDbits.TRISD8=0; //TRISFbits.TRISF6=1; // 单片机向CH451输入读CH451的命令字 command = 0x07; PORTDbits.RD0=0; //LOAD delaytime(9); //d=command; for (i=0; i<4; i++) { // 向CH451送入4位命令字,低位在前 //DIN if((d & 0x0001) ==0x0001) { PORTDbits.RD9=1; } else { PORTDbits.RD9=0; } //delaytime(10); PORTDbits.RD8=0; //DCLK delaytime(9); d>>=1; // 右移一位 PORTDbits.RD8=1; // 时钟上升沿通知CH451输入位数据DCLK delaytime(9); } PORTDbits.RD0=1; // 产生加载上升沿通知CH451处理命令数据LOAD delaytime(9); ch451_key=0; // 清除上个按键信息,为接收新键码准备 for (i=0; i<7; i++) { ch451_key <<= 1; // 数据移入,高位在前,低位在后 ch451_key |= PORTFbits.RF6; // 从高到低读入CH451的数据

PORTDbits.RD8=0; // 产生时钟下升沿通知CH451输出下一位 delaytime(9); PORTDbits.RD8=1; delaytime(9); } }

/************************************************************************************** *功能描述:主函数 *输入; 无 *输出:无 *返回:无 **************************************************************************************/ void main() {

Init_Io(); Init_Uart(); Init_Int0(); ch451_init(); while(1) {

; } } /************************************************************************************** *功能描述:延时 *输入; 无 *输出:无 *返回:无 **************************************************************************************/ void delaytime(uint b) { uint j; for(j=0;j { ; } }

您好,你的程序在上电初始化CH451的时候,发了复位命令以后再发的0X0403,这样会导致0X0403的命令丢失,应该在复位后延时50MS或者更多以后再发0X0403,或者不发0X0201复位命令,直接发0x0403. 另外,判断芯片是否正常工作,可以用示波器观察每个DIG引脚,如果有规则的矩形波,那就说明0x0403的命令起作用了,如果是一直高电平,那芯片没有收到0x0403的命令,没有工作,检查你的输出波形是否正确,波形宽度要求在手册中的参数里有体现,您参考一下。


下雨的天您好,按照您所说已经补发0201复位命令了直接发送0403,但是按键后还是没有产生中断DOUT脚一直为高电平,另外用示波器观察了其余各脚的波形显示正常,请您仔细帮忙看下是否还有其他错误,谢谢


另外还有一个问题就是用手碰下芯片的地也就是9脚和10脚连接的地方有时就会有个中断信号但是读出来的键值是7f


我现在想问您的是发了0x0403命令以后DIG引脚有矩形波吗?如果有的话,芯片已经正常工作了,有按键按下后,DOUT会变低,直到你发了读命令后,输出键值,最后DOUT变高。


您好我看了一下发完0x0403后DIG引脚没有波形


那检查程序中的发送部分吧。用示波器看一个整周期的数据。


你好DIG的波形已经看到,并且也看到了我发0403的波形只是中断后没有读到键值读到的是7fh另外,DIG的波形也不是每次都能读到有时连续几次程序运行停止再运行后发0403能看到波形有时连续几次都看不到,要重新上电才行


你主程序上来延时500毫秒以后再运行程序,如下: void main() { delayms(250); delayms(250); Init_Io(); Init_Uart(); Init_Int0(); ch451_init(); while(1) {

; }


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