CH4XX系列的技术手册和例子程序下载

为什么我的程序,按照你的例子来。不管是键盘显示,还是光是显示,总是没有效果什么原因啊!


用示波器看你输出的数据波形是否正确,前提的你的硬件没有问题。


SCL SDA INT 都可以接STM8S普通的I/O口,没有问题吧!那个中间的那个下降沿上升沿是不是不能太长啊!只能是1us吗?


接STM8S没有关系的,这个只要是保证你时钟的宽度和数据线的宽度就可以。具体的时间要求在手册中有的。主要的是发送的数据一定要正确,另外,如果你用的是CH452的两线接口,H3L2的引脚要接地,这样CH452才能工作在两线接口。


我用的ch455,我还是找不到错误 我可不以发电路图还有程序给你帮我看看啊!谢谢了!真不知道哪里错了!



#include "stm8s105c_s.h" /* 2线接口的连接,与实际电路有关 */ //STM8S PD4 ------- CH455 SCL //STM8S PC3 ------- CH455 INT# //STM8S PD5 ------- CH455 SDA /* 2线接口的位操作,与单片机有关 */ #define CH455_SCL_SET {PD_ODR|=0x10;}//设置SCL输出1 #define CH455_SCL_CLR {PD_ODR&=~0x10;}//设置SCL输出0 #define CH455_SCL_D_OUT {PD_DDR|=0x10;PD_CR1&=~0x10;} // 设置SCL为输出方向,对于双向I/O需切换为输出 #define CH455_SDA_SET {PD_ODR|=0x20;}//设置SDA输出1 #define CH455_SDA_CLR {PD_ODR&=~0x20;}//设置SDA输出0 #define CH455_SDA_D_OUT {PD_DDR|=0x20;PD_CR1&=~0x20;} // 设置SDA为输出方向,对于双向I/O需切换为输出 #define CH455_SDA_D_IN {PD_DDR&=~0x20;PD_CR1|=0x20;} // 设置SDA为输入方向,对于双向I/O需切换为输入 #define CH455_INT_IN {PC_DDR&=~0x08;PC_CR1|=0x08;}//设置PC3输入

/* ********************************************************************************************* */ // 设置系统参数命令

#define CH455_BIT_ENABLE 0x01 // 开启/关闭位 #define CH455_BIT_SLEEP 0x04 // 睡眠控制位 #define CH455_BIT_7SEG 0x08 // 7段控制位 #define CH455_BIT_INTENS1 0x10 // 1级亮度 #define CH455_BIT_INTENS2 0x20 // 2级亮度 #define CH455_BIT_INTENS3 0x30 // 3级亮度 #define CH455_BIT_INTENS4 0x40 // 4级亮度 #define CH455_BIT_INTENS5 0x50 // 5级亮度 #define CH455_BIT_INTENS6 0x60 // 6级亮度 #define CH455_BIT_INTENS7 0x70 // 7级亮度 #define CH455_BIT_INTENS8 0x00 // 8级亮度

#define CH455_SYSOFF 0x0400 // 关闭显示、关闭键盘 #define CH455_SYSON ( CH455_SYSOFF | CH455_BIT_ENABLE ) // 开启显示、键盘 #define CH455_SLEEPOFF CH455_SYSOFF // 关闭睡眠 #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级亮度 #define CH455_SYSON_8 ( CH455_SYSON | CH455_BIT_INTENS8 ) // 开启显示、键盘、8级亮度

// 加载字数据命令 #define CH455_DIG0 0x1400 // 数码管位0显示,需另加8位数据 #define CH455_DIG1 0x1500 // 数码管位1显示,需另加8位数据 #define CH455_DIG2 0x1600 // 数码管位2显示,需另加8位数据 #define CH455_DIG3 0x1700 // 数码管位3显示,需另加8位数据 /* 与单片机有关,与中断连接方式有关 */

#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的高字节命令掩码

void DELAY( unsigned char ms )//延时 { while ( ms -- );

} void CH455_I2c_Start( void ) // 操作起始 { DISABLE_KEY_INTERRUPT; //禁止键盘中断,防止开始时被CH455中断而进入中断服务程序中的START CH455_SDA_SET; /*发送起始条件的数据信号*/ CH455_SDA_D_OUT; /* 设置SDA为输出方向 */ CH455_SCL_SET; CH455_SCL_D_OUT; /* 设置SCL为输出方向 */ DELAY(1); CH455_SDA_CLR; /*发送起始信号*/ DELAY(1); CH455_SCL_CLR; /*钳住I2C总线,准备发送或接收数据 */ }

void CH455_I2c_Stop( void ) // 操作结束 { CH455_SDA_CLR; CH455_SDA_D_OUT; /* 设置SDA为输出方向 */ DELAY(1); CH455_SCL_SET; DELAY(1); CH455_SDA_SET; /*发送I2C总线结束信号*/ DELAY(1); CH455_SDA_D_IN; /* 设置SDA为输入方向 */ ENABLE_KEY_INTERRUPT; }

void CH455_I2c_WrByte( unsigned char dat ) //写一个字节数据 { unsigned char i; CH455_SDA_D_OUT; /* 设置SDA为输出方向 */ for( i = 0; i != 8; i++ ) // 输出8位数据 { if( dat & 0x80 ) { CH455_SDA_SET; } else { CH455_SDA_CLR; } DELAY(1); CH455_SCL_SET; dat <<= 1; DELAY(1); // 可选延时 CH455_SCL_CLR; } CH455_SDA_D_IN; /* 设置SDA为输入方向 */ CH455_SDA_SET; DELAY(1); CH455_SCL_SET; // 接收应答 DELAY(1); CH455_SCL_CLR; }

unsigned char CH455_I2c_RdByte( void ) //读一个字节数据 { unsigned char dat,i; CH455_SDA_SET; CH455_SDA_D_IN; /* 设置SDA为输入方向 */ dat = 0; for( i = 0; i != 8; i++ ) // 输入8位数据 { DELAY(1); // 可选延时 CH455_SCL_SET; DELAY(1); // 可选延时 dat <<= 1; if( PD_IDR &=0X20 ) dat++; // 输入1位 CH455_SCL_CLR; } CH455_SDA_SET; DELAY(1); CH455_SCL_SET; // 发出无效应答 DELAY(1); CH455_SCL_CLR; return dat; }

void CH455_Write( unsigned int cmd ) //写命令 { CH455_I2c_Start(); //启动总线 CH455_I2c_WrByte(((unsigned char)(cmd>>7)&CH455_I2C_MASK)|CH455_I2C_ADDR); CH455_I2c_WrByte((unsigned char)cmd); //发送数据 CH455_I2c_Stop(); //结束总线 }

unsigned char CH455_Read( void ) //读取按键 { unsigned char keycode; CH455_I2c_Start(); //启动总线 CH455_I2c_WrByte((unsigned char)(CH455_GET_KEY>>7)&CH455_I2C_MASK|0x01|CH455_I2C_ADDR); keycode=CH455_I2c_RdByte(); //读取数据 CH455_I2c_Stop(); //结束总线 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" // 修改该文件以适应硬件环境/单片机型号等 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 )// 延时毫秒 { unsigned int i; while ( ms -- ) { for( i = 0; i != 1000; i++ ); } }void GPIO_Init(void) { PC_DDR |= 0x10; PC_CR1 |= 0x10; PC_CR2 = 0x00; /*设置PC4为推挽输出状态,输出速率为2M */

} void CLK_Init(void) { /* Configure HSI prescaler*/ CLK_CKDIVR &= ~0x10; /*设置主时钟为8M */

/* Configure CPU clock prescaler */ CLK_CKDIVR |= 0x01; //设置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]); } 主函数


while(1) for(i=0;i<=16;i++) CH455_Write(CH455_DIG|BCD_decode_tab); 你的程序有问题吧。建议好好修改一下你的程序。 另外,发送完CH455_Write( CH455_SYSON | CH455_BIT_7SEG );后,用示波器观察DIG引脚的状态,如果有矩形波出来,那就说明写函数没有问题,否则,CH455_I2c_WrByte()有问题。查程序吧。


哦 谢谢哦!我会认真查的


那个是复制的有问题。。


比如 #define CH454_DIG0_LO 0x0800 // 数码管位0LO显示,需另加8位数据

而pdf中该位为命令格式为 01 01 00 00 应该为 0x5000吧 我的邮箱是个人信息保护,已隐藏


回复楼上,是的。没错,确实是0x5000。


怎么没有键盘扫描程序呢


程序中都包含了键盘扫描程序,当然前提是您要使用的芯片支持键盘功能。


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