[求助]STC89C51連CH452不能驅(qū)動數(shù)碼管..

如題.. 電路圖附上 用兩線接口 C51[P12] ---- SCL ----- CH452[SCL] C51[P23] ---- SDA ----- CH452[SDA]

不知道為什么數(shù)碼管就是不亮

程序如下:

#include //#include #include

// ************************************** // 類型定義 // ************************************** typedef unsigned char UINT8; typedef unsigned short UINT16;

// ************************************** // CH452與單片機的接口連接 // ************************************** sbit CH452_SCL = P3^6; sbit CH452_SDA = P2^5; //sbit ch452_addr0 = P1^5; sbit CH452_INT0 = P3^3; //地址0中斷腳 //sbit ch452_addr1 = P3^0; sbit CH452_INT1 = P3^1; //地址1中斷腳

sbit LEDA = P1^4; sbit LEDB = P1^5; #define LEDAA { LEDA = 0; } #define LEDBB { LEDB = 1; }

// ************************************** // CH452的定義 // **************************************

#define CH452_SCL_SET { CH452_SCL = 1; } #define CH452_SCL_CLR { CH452_SCL = 0; } #define CH452_SDA_SET { CH452_SDA = 1; } #define CH452_SDA_CLR { CH452_SDA = 0; } #define CH452_SDA_IN ( CH452_SDA )

#define CH452_DIG0 0x0800 // 數(shù)碼管位0顯示,需另加8位數(shù)據(jù) #define CH452_DIG1 0x0900 // 數(shù)碼管位1顯示,需另加8位數(shù)據(jù) #define CH452_DIG2 0x0a00 // 數(shù)碼管位2顯示,需另加8位數(shù)據(jù) #define CH452_DIG3 0x0b00 // 數(shù)碼管位3顯示,需另加8位數(shù)據(jù) #define CH452_DIG4 0x0c00 // 數(shù)碼管位4顯示,需另加8位數(shù)據(jù) #define CH452_DIG5 0x0d00 // 數(shù)碼管位5顯示,需另加8位數(shù)據(jù) #define CH452_DIG6 0x0e00 // 數(shù)碼管位6顯示,需另加8位數(shù)據(jù) #define CH452_DIG7 0x0f00 // 數(shù)碼管位7顯示,需另加8位數(shù)據(jù)

#define CH452_I2C_ADDR0 0x40 // CH452的ADDR=0時的地址 #define CH452_I2C_ADDR1 0x60 // CH452的ADDR=1時的地址,默認值 #define CH452_I2C_MASK 0x3E // CH452的2線接口高字節(jié)命令掩碼

#define DELAY_IO { _nop_();_nop_();_nop_();}

// ************************************** // 模擬I2C START // ************************************** void CH452_I2c_Start( void ) { CH452_SDA_SET; /*發(fā)送起始條件的數(shù)據(jù)信號*/ DELAY_IO; CH452_SCL_SET; DELAY_IO;

CH452_SDA_CLR; /*發(fā)送起始信號*/ DELAY_IO;

CH452_SCL_CLR; /*鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù) */ DELAY_IO; }

// ************************************** // 模擬I2C STOP // ************************************** void CH452_I2c_Stop( void ) { CH452_SDA_CLR; DELAY_IO;

CH452_SCL_SET; DELAY_IO;

CH452_SDA_SET; /*發(fā)送I2C總線結(jié)束信號*/ DELAY_IO; }

// ************************************** // 模擬I2C 寫一個字節(jié)數(shù)據(jù) // ************************************** void CH452_I2c_WrByte( UINT8 dat ) { UINT8 i; for( i = 0; i != 8; i++ ) // 輸出8位數(shù)據(jù) { if( dat&0x80 ) { CH452_SDA_SET; } else { CH452_SDA_CLR; } DELAY_IO;

CH452_SCL_SET; dat <<= 1; DELAY_IO;

CH452_SCL_CLR; DELAY_IO; } CH452_SDA_SET;/* 設(shè)置SDA為輸入方向 */ DELAY_IO;

CH452_SCL_SET; // 接收應(yīng)答 DELAY_IO;

CH452_SCL_CLR; DELAY_IO; }

// ************************************** // 模擬I2C 讀一個字節(jié)數(shù)據(jù) // ************************************** UINT8 CH452_I2c_RdByte( void ) { UINT8 dat; UINT8 i;

CH452_SDA_SET;/* 設(shè)置SDA為輸入方向 */ DELAY_IO;

dat = 0; for( i = 0; i != 8; i++ ) // 輸入8位數(shù)據(jù) { CH452_SCL_SET; DELAY_IO;

dat <<= 1; if( CH452_SDA_IN ) dat++; // 輸入1位

CH452_SCL_CLR; DELAY_IO; }

//CH452_SDA_CLR;//ACK CH452_SDA_SET;//NAK DELAY_IO;

CH452_SCL_SET; // 發(fā)出無效應(yīng)答 DELAY_IO;

CH452_SCL_CLR; DELAY_IO;

return dat; }

// ************************************** // 模擬I2C 寫命令 // ************************************** void ch452_write( UINT16 cmd, UINT8 mADDR ) { CH452_I2c_Start(); /*啟動總線*/

if( mADDR == 0 ) { CH452_I2c_WrByte((UINT8)(cmd>>7)&CH452_I2C_MASK|CH452_I2C_ADDR0); // CH452的ADDR=0時 } else { CH452_I2c_WrByte((UINT8)(cmd>>7)&CH452_I2C_MASK|CH452_I2C_ADDR1); // CH452的ADDR=1時 }

CH452_I2c_WrByte((UINT8)cmd); /*發(fā)送數(shù)據(jù)*/

CH452_I2c_Stop(); /*結(jié)束總線*/ }

// ************************************** // 模擬I2C 讀數(shù)據(jù) // ************************************** UINT8 CH452_Read( UINT16 read_cmd, UINT8 mADDR ) { UINT8 val;

CH452_I2c_Start(); /*啟動總線*/

if( mADDR == 1 ) { CH452_I2c_WrByte((UINT8)(read_cmd>>7)&CH452_I2C_MASK|CH452_I2C_ADDR1|0x01); } else { CH452_I2c_WrByte((UINT8)(read_cmd>>7)&CH452_I2C_MASK|CH452_I2C_ADDR0|0x01); }

val = CH452_I2c_RdByte(); /*讀取數(shù)據(jù)*/

CH452_I2c_Stop(); /*結(jié)束總線*/

return val; }

// ************************************** // 直接譯碼使用 // ************************************** UINT8 BCD[ 29 ] = { 0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X07, 0X7F, 0X6F, 0X77, 0X7C, 0X58, 0X5E, 0X79, 0X71, 0x00, 0x46, 0x40, 0x41, 0x39, 0x0F, 0x08, 0x76, 0x38, 0x73, 0x80, 0xFF, 0x00 };

// ************************************** // mS延時 // ************************************** void delayms( UINT8 i ) { UINT16 j;

do { for( j = 0; j != 1000; j++ ) { ; } } while(--i); }

// ************************************** // 主程序 // ************************************** void main( void ) { UINT8 ch452_key; UINT8 n;

//ch452_addr0 = 0; //ch452_addr1 = 1;

delayms(60); for( n = 0; n != 2; n++ )//地址0和1 { ch452_write( 0x403, n );//開顯示鍵盤 ch452_write( 0x580, n );//BCD譯碼

ch452_write( CH452_DIG0 | ( 0 + ( n<<3 ) ), n ); ch452_write( CH452_DIG1 | ( 1 + ( n<<3 ) ), n ); ch452_write( CH452_DIG2 | ( 2 + ( n<<3 ) ), n ); ch452_write( CH452_DIG3 | ( 3 + ( n<<3 ) ), n ); ch452_write( CH452_DIG4 | ( 4 + ( n<<3 ) ), n ); ch452_write( CH452_DIG5 | ( 5 + ( n<<3 ) ), n ); ch452_write( CH452_DIG6 | ( 6 + ( n<<3 ) ), n ); ch452_write( CH452_DIG7 | ( 7 + ( n<<3 ) ), n );

} LEDAA; LEDBB; while(1)//讀按鍵 { if( CH452_INT0 == 0 )//地址0 CH452按鍵中斷 { ch452_key = CH452_Read( 0x0700, 0 )&0x3F;

ch452_write( 0x300, 0 );//左移兩位 ch452_write( 0x300, 0 ); ch452_write( CH452_DIG1|(ch452_key/10), 0 ); ch452_write( CH452_DIG0|(ch452_key%10), 0 ); }

if( CH452_INT1 == 0 )//地址1 CH452按鍵中斷 { ch452_key = CH452_Read( 0x0700, 1 )&0x3F;

ch452_write( 0x300, 1 );//左移兩位 ch452_write( 0x300, 1 ); ch452_write( CH452_DIG1|(ch452_key/10), 1 ); ch452_write( CH452_DIG0|(ch452_key%10), 1 ); } } } 201341810593537.jpg

補充,其實沒有用到鍵盤/中斷. 只是單純數(shù)碼管顯示.程序鍵盤部分沒修改過來


首先測試一個CH452,在你發(fā)送ch452_write( 0x403, n );//開顯示鍵盤開鍵盤和顯示之后,你看下CH452芯片DIG上面是否有掃描信號?這個應(yīng)該是IIC通信部分有問題。


貌似沒有信號,那怎么辦?求助


沒有信號說明452沒有接受到此命令,所以您用示波器抓下發(fā)出此命令的波形,看波形是不是正確


不知道為什么單片機不能發(fā)命令出去,引腳電平貌似沒變化....


這個需要您查看您單片機的硬件或者軟件了(不同的單片機拉IO程序是有點小差異的),比如晶振是否起振,IO方向是否設(shè)置,寄存器操作是否正確


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

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