小弟使用的是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 { ; } }