為什么我的程序,按照你的例子來。不管是鍵盤顯示,還是光是顯示,總是沒有效果什么原因??!
用示波器看你輸出的數(shù)據(jù)波形是否正確,前提的你的硬件沒有問題。
SCL SDA INT 都可以接STM8S普通的I/O口,沒有問題吧!那個(gè)中間的那個(gè)下降沿上升沿是不是不能太長啊!只能是1us嗎?
接STM8S沒有關(guān)系的,這個(gè)只要是保證你時(shí)鐘的寬度和數(shù)據(jù)線的寬度就可以。具體的時(shí)間要求在手冊中有的。主要的是發(fā)送的數(shù)據(jù)一定要正確,另外,如果你用的是CH452的兩線接口,H3L2的引腳要接地,這樣CH452才能工作在兩線接口。
我用的ch455,我還是找不到錯(cuò)誤 我可不以發(fā)電路圖還有程序給你幫我看看??!謝謝了!真不知道哪里錯(cuò)了!
#include "stm8s105c_s.h" /* 2線接口的連接,與實(shí)際電路有關(guān) */ //STM8S PD4 ------- CH455 SCL //STM8S PC3 ------- CH455 INT# //STM8S PD5 ------- CH455 SDA /* 2線接口的位操作,與單片機(jī)有關(guān) */ #define CH455_SCL_SET {PD_ODR|=0x10;}//設(shè)置SCL輸出1 #define CH455_SCL_CLR {PD_ODR&=~0x10;}//設(shè)置SCL輸出0 #define CH455_SCL_D_OUT {PD_DDR|=0x10;PD_CR1&=~0x10;} // 設(shè)置SCL為輸出方向,對于雙向I/O需切換為輸出 #define CH455_SDA_SET {PD_ODR|=0x20;}//設(shè)置SDA輸出1 #define CH455_SDA_CLR {PD_ODR&=~0x20;}//設(shè)置SDA輸出0 #define CH455_SDA_D_OUT {PD_DDR|=0x20;PD_CR1&=~0x20;} // 設(shè)置SDA為輸出方向,對于雙向I/O需切換為輸出 #define CH455_SDA_D_IN {PD_DDR&=~0x20;PD_CR1|=0x20;} // 設(shè)置SDA為輸入方向,對于雙向I/O需切換為輸入 #define CH455_INT_IN {PC_DDR&=~0x08;PC_CR1|=0x08;}//設(shè)置PC3輸入
/* ********************************************************************************************* */ // 設(shè)置系統(tǒng)參數(shù)命令
#define CH455_BIT_ENABLE 0x01 // 開啟/關(guān)閉位 #define CH455_BIT_SLEEP 0x04 // 睡眠控制位 #define CH455_BIT_7SEG 0x08 // 7段控制位 #define CH455_BIT_INTENS1 0x10 // 1級(jí)亮度 #define CH455_BIT_INTENS2 0x20 // 2級(jí)亮度 #define CH455_BIT_INTENS3 0x30 // 3級(jí)亮度 #define CH455_BIT_INTENS4 0x40 // 4級(jí)亮度 #define CH455_BIT_INTENS5 0x50 // 5級(jí)亮度 #define CH455_BIT_INTENS6 0x60 // 6級(jí)亮度 #define CH455_BIT_INTENS7 0x70 // 7級(jí)亮度 #define CH455_BIT_INTENS8 0x00 // 8級(jí)亮度
#define CH455_SYSOFF 0x0400 // 關(guān)閉顯示、關(guān)閉鍵盤 #define CH455_SYSON ( CH455_SYSOFF | CH455_BIT_ENABLE ) // 開啟顯示、鍵盤 #define CH455_SLEEPOFF CH455_SYSOFF // 關(guān)閉睡眠 #define CH455_SLEEPON ( CH455_SYSOFF | CH455_BIT_SLEEP ) // 開啟睡眠 #define CH455_7SEG_ON ( CH455_SYSON | CH455_BIT_7SEG ) //開啟七段模式 #define CH455_8SEG_ON ( CH455_SYSON | 0x00 ) //開啟八段模式 #define CH455_SYSON_4 ( CH455_SYSON | CH455_BIT_INTENS4 ) // 開啟顯示、鍵盤、4級(jí)亮度 #define CH455_SYSON_8 ( CH455_SYSON | CH455_BIT_INTENS8 ) // 開啟顯示、鍵盤、8級(jí)亮度
// 加載字?jǐn)?shù)據(jù)命令 #define CH455_DIG0 0x1400 // 數(shù)碼管位0顯示,需另加8位數(shù)據(jù) #define CH455_DIG1 0x1500 // 數(shù)碼管位1顯示,需另加8位數(shù)據(jù) #define CH455_DIG2 0x1600 // 數(shù)碼管位2顯示,需另加8位數(shù)據(jù) #define CH455_DIG3 0x1700 // 數(shù)碼管位3顯示,需另加8位數(shù)據(jù) /* 與單片機(jī)有關(guān),與中斷連接方式有關(guān) */
#define DISABLE_KEY_INTERRUPT {_asm("sim");} #define ENABLE_KEY_INTERRUPT {_asm("rim");}
// 讀取按鍵代碼命令 #define CH455_GET_KEY 0x0700 // 獲取按鍵,返回按鍵代碼
// CH455接口定義 #define CH455_I2C_ADDR 0x40 // CH455的地址 #define CH455_I2C_MASK 0x3E // CH455的高字節(jié)命令掩碼
void DELAY( unsigned char ms )//延時(shí) { while ( ms -- );
} void CH455_I2c_Start( void ) // 操作起始 { DISABLE_KEY_INTERRUPT; //禁止鍵盤中斷,防止開始時(shí)被CH455中斷而進(jìn)入中斷服務(wù)程序中的START CH455_SDA_SET; /*發(fā)送起始條件的數(shù)據(jù)信號(hào)*/ CH455_SDA_D_OUT; /* 設(shè)置SDA為輸出方向 */ CH455_SCL_SET; CH455_SCL_D_OUT; /* 設(shè)置SCL為輸出方向 */ DELAY(1); CH455_SDA_CLR; /*發(fā)送起始信號(hào)*/ DELAY(1); CH455_SCL_CLR; /*鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) */ }
void CH455_I2c_Stop( void ) // 操作結(jié)束 { CH455_SDA_CLR; CH455_SDA_D_OUT; /* 設(shè)置SDA為輸出方向 */ DELAY(1); CH455_SCL_SET; DELAY(1); CH455_SDA_SET; /*發(fā)送I2C總線結(jié)束信號(hào)*/ DELAY(1); CH455_SDA_D_IN; /* 設(shè)置SDA為輸入方向 */ ENABLE_KEY_INTERRUPT; }
void CH455_I2c_WrByte( unsigned char dat ) //寫一個(gè)字節(jié)數(shù)據(jù) { unsigned char i; CH455_SDA_D_OUT; /* 設(shè)置SDA為輸出方向 */ for( i = 0; i != 8; i++ ) // 輸出8位數(shù)據(jù) { if( dat & 0x80 ) { CH455_SDA_SET; } else { CH455_SDA_CLR; } DELAY(1); CH455_SCL_SET; dat <<= 1; DELAY(1); // 可選延時(shí) CH455_SCL_CLR; } CH455_SDA_D_IN; /* 設(shè)置SDA為輸入方向 */ CH455_SDA_SET; DELAY(1); CH455_SCL_SET; // 接收應(yīng)答 DELAY(1); CH455_SCL_CLR; }
unsigned char CH455_I2c_RdByte( void ) //讀一個(gè)字節(jié)數(shù)據(jù) { unsigned char dat,i; CH455_SDA_SET; CH455_SDA_D_IN; /* 設(shè)置SDA為輸入方向 */ dat = 0; for( i = 0; i != 8; i++ ) // 輸入8位數(shù)據(jù) { DELAY(1); // 可選延時(shí) CH455_SCL_SET; DELAY(1); // 可選延時(shí) dat <<= 1; if( PD_IDR &=0X20 ) dat++; // 輸入1位 CH455_SCL_CLR; } CH455_SDA_SET; DELAY(1); CH455_SCL_SET; // 發(fā)出無效應(yīng)答 DELAY(1); CH455_SCL_CLR; return dat; }
void CH455_Write( unsigned int cmd ) //寫命令 { CH455_I2c_Start(); //啟動(dòng)總線 CH455_I2c_WrByte(((unsigned char)(cmd>>7)&CH455_I2C_MASK)|CH455_I2C_ADDR); CH455_I2c_WrByte((unsigned char)cmd); //發(fā)送數(shù)據(jù) CH455_I2c_Stop(); //結(jié)束總線 }
unsigned char CH455_Read( void ) //讀取按鍵 { unsigned char keycode; CH455_I2c_Start(); //啟動(dòng)總線 CH455_I2c_WrByte((unsigned char)(CH455_GET_KEY>>7)&CH455_I2C_MASK|0x01|CH455_I2C_ADDR); keycode=CH455_I2c_RdByte(); //讀取數(shù)據(jù) CH455_I2c_Stop(); //結(jié)束總線 return keycode; } void CH455_Init( void ) { CH455_SCL_D_OUT; CH455_SDA_SET; CH455_SDA_D_OUT; CH455_INT_IN; }
/* MAIN.C file * * Copyright (c) 2002-2005 STMicroelectronics */ #include "STM8S105C_S.h" /* Registers and memory mapping file. */ #include "CH455顯示.H" // 修改該文件以適應(yīng)硬件環(huán)境/單片機(jī)型號(hào)等 const unsigned char BCD_decode_tab[]={0x08,0x04,0x02,0x01,0x10,0x20,0x40,0x08,0x04,0x02,0x01,0x10,0x20,0x40,0x10,0x20,0x40};//BCD const unsigned int CH455_DIG[]={0x1700,0x1700,0x1700,0x1700,0x1700,0x1700,0x1700,0x1600,0x1600,0x1600,0x1600,0x1600,0x1600,0x1500,0x1500,0x1500}; void mDelaymS( unsigned char ms )// 延時(shí)毫秒 { unsigned int i; while ( ms -- ) { for( i = 0; i != 1000; i++ ); } }void GPIO_Init(void) { PC_DDR |= 0x10; PC_CR1 |= 0x10; PC_CR2 = 0x00; /*設(shè)置PC4為推挽輸出狀態(tài),輸出速率為2M */
} void CLK_Init(void) { /* Configure HSI prescaler*/ CLK_CKDIVR &= ~0x10; /*設(shè)置主時(shí)鐘為8M */
/* Configure CPU clock prescaler */ CLK_CKDIVR |= 0x01; //設(shè)置CPU頻率為2M }
main() {unsigned char i; _asm("sim"); /* Disable interrupts */ CLK_Init(); GPIO_Init(); mDelaymS(20); CH455_Init(); CH455_Write( CH455_SYSON | CH455_BIT_7SEG ); while(1) for(i=0;i<=16;i++) CH455_Write(CH455_DIG[i]|BCD_decode_tab[i]); } 主函數(shù)
while(1) for(i=0;i<=16;i++) CH455_Write(CH455_DIG|BCD_decode_tab); 你的程序有問題吧。建議好好修改一下你的程序。 另外,發(fā)送完CH455_Write( CH455_SYSON | CH455_BIT_7SEG );后,用示波器觀察DIG引腳的狀態(tài),如果有矩形波出來,那就說明寫函數(shù)沒有問題,否則,CH455_I2c_WrByte()有問題。查程序吧。
哦 謝謝哦!我會(huì)認(rèn)真查的
那個(gè)是復(fù)制的有問題。。
比如 #define CH454_DIG0_LO 0x0800 // 數(shù)碼管位0LO顯示,需另加8位數(shù)據(jù)
而pdf中該位為命令格式為 01 01 00 00 應(yīng)該為 0x5000吧 我的郵箱是個(gè)人信息保護(hù),已隱藏
回復(fù)樓上,是的。沒錯(cuò),確實(shí)是0x5000。
怎么沒有鍵盤掃描程序呢
程序中都包含了鍵盤掃描程序,當(dāng)然前提是您要使用的芯片支持鍵盤功能。