小弟使用的是PIC24FJ256GA106,16位的單片機(jī)程序是參照網(wǎng)站上例子寫(xiě)的,只做按鍵實(shí)用沒(méi)有接數(shù)碼管,硬件是參照PDF15頁(yè)的例子去掉了數(shù)碼管與二極管部分,以下是程序目前的問(wèn)題是,按鍵沒(méi)有任何反應(yīng)DOUT始終是高電平,5V供電與3.3V供電都試過(guò)了現(xiàn)象一樣總是按鍵后沒(méi)有中斷,請(qǐng)高手幫忙看下程序有什么問(wèn)題?另外請(qǐng)問(wèn)LOAD、DIN、LDCK這些引腳MCU在輸出高低電平時(shí),高低電平各自要保持的時(shí)間范圍是多少?謝謝! /************************************************************************************** *功能描述:IO口初始化 *輸入; 無(wú) *輸出:無(wú) *返回:無(wú) /************************************************************************************** *功能描述:外部中斷函數(shù) *輸入; 無(wú) *輸出:無(wú) *返回:無(wú) **************************************************************************************/ void __attribute__((__interrupt__))_INT0Interrupt() { IFS0bits.INT0IF=0; //清中斷標(biāo)志位 delaytime(50); ch451_read(); EX1=1; } /************************************************************************************** *功能描述:鍵盤(pán)初始化 *輸入; 無(wú) *輸出:無(wú) *返回:無(wú) **************************************************************************************/ 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); } /************************************************************************************** *功能描述:輸出命令子程序 定義一無(wú)符號(hào)整型變量存儲(chǔ)12字節(jié)的命令字。 *輸入; 無(wú) *輸出:無(wú) *返回:無(wú) **************************************************************************************/ void CH451_Write(unsigned int command) { unsigned char i; TRISDbits.TRISD9=0; TRISDbits.TRISD0=0; TRISDbits.TRISD8=0; PORTDbits.RD0=0; //命令開(kāi)始 LOAD=0 delaytime(9); //d=command; for(i=0;i<12;i++) //送入12位數(shù)據(jù),低位在前 { 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; //加載數(shù)據(jù)LOAD=1 delaytime(9);
} /************************************************************************************** *功能描述:輸入命令子程序,MCU從451讀一字節(jié) *輸入; 無(wú) *輸出:無(wú) *返回:無(wú) **************************************************************************************/ void ch451_read (void) { uchar i; uchar command; // CH451命令字暫存單元 TRISDbits.TRISD0=0; TRISDbits.TRISD9=0; TRISDbits.TRISD8=0; //TRISFbits.TRISF6=1; // 單片機(jī)向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; // 時(shí)鐘上升沿通知CH451輸入位數(shù)據(jù)DCLK delaytime(9); } PORTDbits.RD0=1; // 產(chǎn)生加載上升沿通知CH451處理命令數(shù)據(jù)LOAD delaytime(9); ch451_key=0; // 清除上個(gè)按鍵信息,為接收新鍵碼準(zhǔn)備 for (i=0; i<7; i++) { ch451_key <<= 1; // 數(shù)據(jù)移入,高位在前,低位在后 ch451_key |= PORTFbits.RF6; // 從高到低讀入CH451的數(shù)據(jù)
PORTDbits.RD8=0; // 產(chǎn)生時(shí)鐘下升沿通知CH451輸出下一位 delaytime(9); PORTDbits.RD8=1; delaytime(9); } }
/************************************************************************************** *功能描述:主函數(shù) *輸入; 無(wú) *輸出:無(wú) *返回:無(wú) **************************************************************************************/ void main() {
Init_Io(); Init_Uart(); Init_Int0(); ch451_init(); while(1) {
; } } /************************************************************************************** *功能描述:延時(shí) *輸入; 無(wú) *輸出:無(wú) *返回:無(wú) **************************************************************************************/ void delaytime(uint b) { uint j; for(j=0;j { ; } }