求助CH451與MEGA128的調(diào)試

你好!我購買了貴公司的CH451,通過MEGA128控制鍵盤和顯示。鍵盤數(shù)值只能讀到7FH,數(shù)碼管不顯示,或偶爾顯示一下。我的程序如下: #include #include #include #define DCLK (1<#define DIN (1<#define LOAD (1<#define DOUT (1<#define CH451_DCLK_HIGH PORTA|=DCLK //時鐘信號 #define CH451_DCLK_LOW PORTA&=~DCLK #define CH451_DIN_HIGH PORTA|=DIN //數(shù)據(jù)輸入 #define CH451_DIN_LOW PORTA&=~DIN #define CH451_LOAD_HIGH PORTA|=LOAD //命令加載信號,上升延激活 #define CH451_LOAD_LOW PORTA&=~LOAD #define CH451_DOUT PIND&DOUT //鍵盤中斷和鍵值數(shù)據(jù)輸出 unsigned char KeyValue;

const unsigned char DSYCode[18]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71, 0x00}; //共陰數(shù)碼管。0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,全部熄滅 const unsigned char DigCode[8]={CH451_DIG0,CH451_DIG1,CH451_DIG2,CH451_DIG3,CH451_DIG4,CH451_DIG5,CH451_DIG6,CH451_DIG7};

//CH451寫命令函數(shù) void CH451_WRITECommand(unsigned int Command) { unsigned char i; CH451_LOAD_LOW; //命令輸入開始 for(i=0;i<12;i++) { //CH451_DCLK_LOW; if((Command&0x001)) //輸入低位數(shù)據(jù) CH451_DIN_HIGH; else CH451_DIN_LOW; CH451_DCLK_LOW; Command>>=1; //輸入下一位 CH451_DCLK_HIGH; //上升沿有效 } CH451_LOAD_HIGH; //加載數(shù)據(jù) }

//CH451初始化 void CH451_Init() {DDRA|=DCLK|DIN|LOAD; PORTA|=DCLK|DIN|LOAD; //CH451_DIN_HIGH; CH451_DIN_LOW; //使能串口 // PORTA&=~(1< CH451_DIN_HIGH; //PORTA|=(1< CH451_WRITECommand(CH451_REST); //復位CH451 CH451_WRITECommand(CH451_WKDDK); //開鍵盤顯示 DDRD&=~DOUT; //INT0(PD0)為輸入方向,用于鍵盤中斷 PORTD|=DOUT; //INT0(PD0)為高電平,用于下降沿中斷 EICRA=0x20; //INT0下降沿中斷 EIMSK=0x01; //開INT0 SEI(); }

//CH451通過INT0讀取鍵值 /*unsigned char CH451_GetKeyValue(void) { unsigned char i; unsigned char GetKeyValue=0x00; // }*/

#pragma interrupt_handler int0_isr:2 void int0_isr(void) { unsigned char i,a,b; unsigned char KeyValue=0x00; //讀取鍵盤數(shù)值 CH451_WRITECommand(CH451_KEY); //發(fā)送讀取鍵盤數(shù)值命令 for(i=0;i<7;i++) //讀取鍵值 { KeyValue<<=1; if(CH451_DOUT) KeyValue|=1; else KeyValue|=0; } a=KeyValue; b=a; }

//CH451顯示一位數(shù)碼管,DIG選擇數(shù)碼管,Data要顯示的數(shù)字,Point是否顯示小數(shù)點 //Point=1顯示小數(shù)點,Point=0不顯示小數(shù)點 void CH451_Display(unsigned char DIG,unsigned char Data,unsigned char Point) { if(Point) CH451_WRITECommand(DigCode[DIG]|(DSYCode[Data]|0x80)); else CH451_WRITECommand(DigCode[DIG]|DSYCode[Data]); }

void main(void) {CH451_Init(); //CH451_WRITECommand(CH451_WKDDK); while(1) { CH451_Display(2,7,0);} //while(1); }

硬件電路中: VCC與GND間要并聯(lián)電源退耦電容,1個不小于220UF的電解電容和1個不小于0.1UF的獨石電容。 程序中: (1)main()函數(shù)中,CH451_Init();前要加入上電延遲 (2)int0_isr()函數(shù)中,讀取鍵盤數(shù)值,要在時鐘的下降沿輸出,此處沒有設(shè)置 (3)寫命令函數(shù)中,指令間加入delay延遲,使其滿足接口時序參數(shù)要求。 請參考以下程序: UploadImages/2009102813235664.rar


非常感謝


求助 CH451鍵盤中斷反復進入。 我接了八個數(shù)碼管和8個鍵盤。鍵盤的一端共連在一起接在DIG7上,另外一端分別接在SEG0到SEG7上。鍵盤和數(shù)碼現(xiàn)在都已調(diào)通,可以正確顯示,也可正確讀鍵值。我用按鍵進行計數(shù),只有SEG7上的那個按鍵可以正確的按一下加個一,其他的按鍵按一下就會產(chǎn)生很多個中斷,我看了波形,除SEG7其他的不按時時高電平,按下時會產(chǎn)生無窮多個低脈沖,不停的觸發(fā)中斷,但是當按下SEG7上的那個按鍵后,其他按鍵又恢復高電平。整個電路都是按貴公司給的CH450的資料上的圖連接的。請貴公司的工程師幫忙診斷診斷!??!


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频