版主请看,CH423显示不正常

硬件:AVR162,14.7456MHz 代码:网站提供的源代码 CH423_SOFT.c //本例子程序提供操作方法,仅供参考 // ******************************************************************* // Website: http://wch.cn // Email: tech@wch.cn // Author: TECH 2008.11.25 // *******************************************************************

//ATMEGA16 PC0 ------- CH423 SCL //ATMEGA16 PC1 ------- CH423 SDA

我用这个代码驱动一片CH423,带动15个数码管,显示0-9的数字。其中会出现数字显示不正常,主要出现在6-9之间的数字,请问这是怎么回事?

您好,发的代码不全. 不太清楚您那边现在的现象,不正常,也就是显示6-9的时候,不正常的现象是什么?是显示缺段?还是其他的现象?是否很有规律?比如缺段,所有的管子显示6-9的时候所缺的段是否一样的,如果是,请检查是否电路连接问题,如果不是缺段,具体现象是什么?


具体代码:

//本例子程序提供操作方法,仅供参考 // ******************************************************************* // Website: http://wch.cn // Email: tech@wch.cn // Author: TECH 2008.11.25 // *******************************************************************

//ATMEGA16 PC0 ------- CH423 SCL //ATMEGA16 PC1 ------- CH423 SDA

//ICCAVR下编译

// ************************************** // 加载头文件 // ************************************** #include #include

// ************************************** // CH423定义 // ************************************** #define CH423_SDA_OUT { DDRC |= (1<#define CH423_SDA_IN { PORTC |= (1<#define CH423_SDA_SET PORTC |= (1<#define CH423_SDA_CLR PORTC&=~(1<#define CH423_SDA ( PINC & (1<#define CH423_SCL_OUT { PORTC |= (1<#define CH423_SCL_SET PORTC |= (1<#define CH423_SCL_CLR PORTC &= ~(1<#define DELAY { NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP(); }

// ************************************** // 延时毫秒,不准 // ************************************** void mDelaymS( unsigned char ms ) // 延时毫秒,不准 { unsigned short i; while ( ms -- ) { for( i = 0; i != 3000; i++ ); } }

// ************************************** // BCD码表 // ************************************** const unsigned char BCD_decode_tab[ 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 }; const unsigned char BCD_decode_tab_2[10] = { 0X28, 0XB5, 0XD5, 0XC9, 0X5D, 0X7D, 0XC4, 0XFD, 0XDD, 0XFC }; const unsigned char dp2 = 0X02; const unsigned char BCD_decode_tab_34[10] = { 0X41, 0XB3, 0XBA, 0X7A, 0XDA, 0XDB, 0XA8, 0XFB, 0XFA, 0XEB }; const unsigned char dp34 = 0X04; // ************************************** // I2C START // ************************************** void CH423_I2c_Start( void ) { CH423_SDA_SET; /*发送起始条件的数据信号*/ CH423_SDA_OUT; /* 设置SDA为输出方向 */ DELAY; CH423_SCL_SET;/* 设置SCL为输出方向 */ DELAY; CH423_SDA_CLR; /*发送起始信号*/ DELAY; CH423_SCL_CLR; /*钳住I2C总线,准备发送或接收数据 */ DELAY; }

// ************************************** // I2C STOP // ************************************** void CH423_I2c_Stop( void ) { CH423_SDA_CLR; CH423_SDA_OUT; /* 设置SDA为输出方向 */ DELAY; CH423_SCL_SET; DELAY; CH423_SDA_SET; /*发送I2C总线结束信号*/ DELAY; CH423_SDA_IN; /* 设置SDA为输入方向 */ DELAY; }

// ************************************** // I2C 写一个字节 // ************************************** void CH423_I2c_WrByte( unsigned char c ) //写一个字节数据 { unsigned char i; CH423_SDA_SET; CH423_SDA_OUT; /* 设置SDA为输出方向 */ DELAY; for( i = 0; i != 8; i++ ) { if( c & 0x80 ) { CH423_SDA_SET; } else { CH423_SDA_CLR; } DELAY; CH423_SCL_SET; c <<= 1; DELAY; CH423_SCL_CLR; } CH423_SDA_IN; /* 设置SDA为输入方向 */ DELAY; CH423_SCL_SET; DELAY; CH423_SCL_CLR; DELAY; }

// ************************************** // I2C 读一个字节 // ************************************** unsigned char CH423_I2c_RdByte( void ) //读一个字节数据 { unsigned char c, i; CH423_SDA_IN; /* 设置SDA为输入方向 */ c = 0; for( i = 0; i != 8; i++ ) // 输入8位数据 { CH423_SCL_SET; DELAY; c <<= 1; if( CH423_SDA ) c++; // 输入1位 CH423_SCL_CLR; DELAY; } CH423_SDA_SET; CH423_SDA_OUT; CH423_SCL_SET; // 发出无效应答 DELAY; CH423_SCL_CLR; DELAY; return(c); }

// ************************************** // CH423写命令 // ************************************** void CH423_Write( unsigned short command ) //写命令 { CH423_I2c_Start(); /*启动总线*/ CH423_I2c_WrByte( (unsigned char)(command>>8) ); CH423_I2c_WrByte( (unsigned char)command ); /*发送数据*/ CH423_I2c_Stop(); /*结束总线*/ }

// ************************************** // CH423初始化 // ************************************** void CH423_Init( void ) { CH423_SCL_OUT; CH423_SDA_SET; CH423_SDA_OUT; }

void Clear( void )//清除显示 { CH423_Write( 0x6000 ); CH423_Write( 0x6200 ); CH423_Write( 0x6400 ); CH423_Write( 0x6600 ); CH423_Write( 0x6800 ); CH423_Write( 0x6A00 ); CH423_Write( 0x6C00 ); CH423_Write( 0x6E00 ); CH423_Write( 0x7000 ); CH423_Write( 0x7200 ); CH423_Write( 0x7400 ); CH423_Write( 0x7600 ); CH423_Write( 0x7800 ); CH423_Write( 0x7A00 ); CH423_Write( 0x7C00 ); CH423_Write( 0x7E00 ); }

// ************************************** // 主函数 // ************************************** void main( void ) { unsigned char count = 0; unsigned char dot = 0; unsigned char val; CH423_Init(); mDelaymS( 30 ); CH423_Write( 0x4800 | 0x17 );//启用数码管自动扫描功能 Clear();//清除显示

for( ; ; ) { val = BCD_decode_tab[count] | dot; CH423_Write( 0x6000 | val ); //16位数码管显示 CH423_Write( 0x6200 | val ); CH423_Write( 0x6400 | val ); CH423_Write( 0x6600 | val ); CH423_Write( 0x6800 | val ); CH423_Write( 0x6A00 | val ); CH423_Write( 0x6C00 | val ); CH423_Write( 0x6E00 | val ); CH423_Write( 0x7000 | val ); CH423_Write( 0x7200 | val ); CH423_Write( 0x7400 | val ); CH423_Write( 0x7600 | val ); CH423_Write( 0x7800 | val ); CH423_Write( 0x7A00 | val ); CH423_Write( 0x7C00 | val ); CH423_Write( 0x7E00 | val ); if( count != 15 ) count++; else { count = 0; if( dot == 0 ) dot = 0x80; else dot = 0; } mDelaymS( 255 ); mDelaymS( 255 ); } while(1); }


BCD_decode_tab 只用了这一个 const unsigned char BCD_decode_tab[ 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 };


这是你们网站的源码。代码应该是没错的。 问题不是缺段,是出现乱码。


您好: 出现乱码可能是数据线上受到干扰或者是电源引脚处没有接退藕电容等。 为了更详细的了解及解决问题,您可以拨打我们的技术支持直拨电话025-52638373,或者留下号码我们联系您。


我也是这样想,我的QQ号:48058265 msn:个人信息保护,已隐藏


麻烦您直接留电话给我们.我们会及时与您联系.


这是我给另外家公司做的私活,所以平时上班不方便。还是QQ或者MSN联系吧。 :)


只有登录才能回复,可以选择微信账号登录