CH422 芯片可以用于数码管显示驱动或者 I/O 扩展。CH422 内置时钟振荡电路,可以动态驱动 4 位数码管或者 32 只 LED 发光管;CH422 用于 I/O 扩展时,可以提供 8 个双向输入输出引脚和 4 个通 用输出引脚;CH422 通过 2 线串行接口与单片机等交换数据。
C文件
/********************************** (C) COPYRIGHT *******************************
* File Name : 422IF.C
* Author : WCH
* Version : V1.0
* Date : 2014/03/18
* Description : CH422 DEMO接口函数定义
*******************************************************************************/
/******************************************************************************/
/* 头文件包含 */
#include < 422CMD.H >
#include < reg52.h >
/******************************************************************************/
/*******************************************************************************
* Function Name : mInitSTDIO
* Description : 串口初始化函数,用于程序调试
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void mInitSTDIO( )
{
SCON = 0x50;
PCON = 0x80;
TMOD = 0x20;
TH1 = 0xf3; //24MHz晶振, 9600bps
TR1 = 1;
TI = 1;
}
/*******************************************************************************
* Function Name : CH422_I2c_Start
* Description : 两线模式启动信号
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void CH422_I2c_Start( void )
{
CH422_SDA_SET; // 发送起始条件的数据信号
CH422_SCL_SET;
DELAY_0_1US; //根据单片机可选延时
CH422_SDA_CLR; //发送起始信号
DELAY_0_1US;
CH422_SCL_CLR; //钳住I2C总线,准备发送或接收数据
}
/*******************************************************************************
* Function Name : CH422_I2c_Stop
* Description : 两线模式停止信号
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void CH422_I2c_Stop( void )
{
CH422_SDA_CLR;
DELAY_0_1US; //根据单片机型号延时可选
CH422_SCL_SET;
DELAY_0_1US;
CH422_SDA_SET; // 发送I2C总线结束信号
}
/*******************************************************************************
* Function Name : CH422_I2c_WrByte
* Description : 向CH422写入一个字节
* Input : unsigned char dat
* Output : None
* Return : None
*******************************************************************************/
void CH422_I2c_WrByte( unsigned char dat ) // 写一个字节数据
{
unsigned char i;
for( i = 0; i != 8; i++ ) // MCU输出8位数据
{
if( dat&0x80 )
{
CH422_SDA_SET;
}
else
{
CH422_SDA_CLR;
}
DELAY_0_1US;
CH422_SCL_SET;
dat < <= 1;
DELAY_0_1US; // 可选延时
CH422_SCL_CLR;
}
CH422_SDA_SET; //SDA设为输入接收ACK信号
DELAY_0_1US;
CH422_SCL_SET; // 接收应答
DELAY_0_1US;
CH422_SCL_CLR;
}
/*******************************************************************************
* Function Name : CH422_I2c_RdByte
* Description : 从CH422读一个字节
* Input : None
* Output : None
* Return : unsigned char dat
*******************************************************************************/
unsigned char CH422_I2c_RdByte(void)
{
unsigned char dat,i; //注意SDA设置为输入方向接收数据
CH422_SDA_SET;
for(i = 0;i != 8;i++)
{
CH422_SCL_SET;
DELAY_0_1US;
dat < <= 1;
if(CH422_SDA_IN) //读取一位数据
{
dat++;
}
DELAY_0_1US;
CH422_SCL_CLR;
}
CH422_SDA_SET;
DELAY_0_1US;
CH422_SCL_SET;
DELAY_0_1US;
CH422_SCL_CLR;
return(dat);
}
/*******************************************************************************
* Function Name : CH422_I2c_Write
* Description : 向CH422写数据
* Input : unsigned short cmd
* Output : None
* Return : None
*******************************************************************************/
void CH422_I2c_Write(unsigned short cmd)
{
CH422_I2c_Start(); //发送启动信号
CH422_I2c_WrByte((unsigned char)(cmd >>8)); //先发高字节
CH422_I2c_WrByte((unsigned char)cmd);
CH422_I2c_Stop(); //发送结束信号
}
/*******************************************************************************
* Function Name : CH422_I2c_Read
* Description : 从CH422读取键值
* Input : None
* Output : None
* Return : unsigned char dat
*******************************************************************************/
unsigned char CH422_I2c_Read(void)
{
unsigned char dat;
CH422_I2c_Start(); //发送启动信号
CH422_I2c_WrByte((unsigned char)(CH422_GET_KEY>>8)); //发送取键值命令码
dat = CH422_I2c_RdByte(); //接收键值
CH422_I2c_Stop(); //发送结束信号
return dat;
}
H文件
/********************************** (C) COPYRIGHT *******************************
* File Name : 422CMD.H
* Author : WCH
* Version : V1.0
* Date : 2014/03/18
* Description : CH422 DEMO控制命令和接口函数声明
*******************************************************************************/
/******************************************************************************/
/* 头文件包含 */
#include < reg52.h >
#include < intrins.h >
#pragma NOAREGS // 如果MCS51在中断服务程序中调用CH422子程序或者使用键盘中断功能,那么建议加入此编译选项
/******************************************************************************/
/******************************************************************************/
/* 延时0.1uS子程序,与单片机速度有关,对于双向I/O可以不需要延时,对于带上拉的准双向I/O建议加上延时 */
#define DELAY_0_1US {_nop_();} // MCS51>10MHz
/******************************************************************************/
/******************************************************************************/
/* 2线接口的连接,与实际电路有关 */
sbit CH422_SCL=P1^0;
sbit CH422_SDA=P1^1;
sbit CH422_INT=P3^2; // 中断输出引脚
/******************************************************************************/
/******************************************************************************/
/* 2线接口的位操作,与单片机有关 */
#define CH422_SCL_SET {CH422_SCL=1;}
#define CH422_SCL_CLR {CH422_SCL=0;}
#define CH422_SCL_D_OUT {} // 设置SCL为输出方向,对于双向I/O需切换为输出
#define CH422_SDA_SET {CH422_SDA=1;}
#define CH422_SDA_CLR {CH422_SDA=0;}
#define CH422_SDA_IN (CH422_SDA)
#define CH422_SDA_D_OUT {} // 设置SDA为输出方向,对于双向I/O需切换为输出
#define CH422_SDA_D_IN {CH422_SDA=1;} // 设置SDA为输入方向,对于双向I/O需切换为输入
/******************************************************************************/
/******************************************************************************/
/* CH422的常用命令码*/
#define CH422_SYSON 0x4800 //设置系统参数
#define CH422_IO_OE_BIT 0x0001 //IO7-IO0双向输入输出引脚,位1允许输出
#define CH422_A_SCAN_BIT 0x0004 //控制动态扫描控制功能,为0启用IO扩展功能、为1数码管动态显示
#define CH422_OD_EN_BIT 0x0010 //OC0-OC3输出使能,为0推挽输出,为1是开漏输出
#define CH422_SLEEP_BIT 0x0080 //低功耗睡眠控制位
#define CH422_WR_OC 0x4600 //设置通用输出命令,需另加8位数据
#define CH422_GET_KEY 0x4f00 // 获取按键,返回按键代码
//加载段数据命令/设置双向输入输出命令
#define CH422_DIG0 0x7000 // 数码管位0显示,需另加8位数据
#define CH422_DIG1 0x7200 // 数码管位1显示,需另加8位数据
#define CH422_DIG2 0x7400 // 数码管位2显示,需另加8位数据
#define CH422_DIG3 0x7600 // 数码管位3显示,需另加8位数据
//读取双向输入输出命令
#define CH422_RD_IO 0x4d00 //输入字节2为双向输入输出引脚IO7-IO0当前的引脚状态
/******************************************************************************/
/******************************************************************************/
//接口函数声明
extern unsigned char CH422_I2c_Read(void); // 从CH422读取按键代码
extern void CH422_I2c_Write(unsigned short cmd); // 向CH422发出操作命令
extern void mInitSTDIO( ); //串口初始化函数
/******************************************************************************/
驱动程序
/******************************************************************************/
/* 头文件包含 */
#include < stdio.h >
#include "422CMD.H"
/******************************************************************************/
/******************************************************************************/
/*数码管显示的BCD译码表*/
const unsigned char BCD_decode_tab[0x10] = { 0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X07, 0X7F, 0X6F, 0X77, 0X7C, 0X58, 0X5E, 0X79, 0X71 };
/******************************************************************************/
/*******************************************************************************
* Function Name : mDelaymS
* Description : 延时函数
* Input : unsigned char ms
* Output : None
* Return : None
*******************************************************************************/
void mDelaymS( unsigned char ms ) // 延时毫秒
{
unsigned short i;
while ( ms -- )
{
for(i=0;i!=1000;i++);
}
}
/*******************************************************************************
* Function Name : mian
* Description : CH422功能演示,包括驱动数码管,睡眠等
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void main()
{
mDelaymS(60); //CH422上电复位时间
mInitSTDIO(); //初始化串口
CH422_I2c_Write(CH422_SYSON | CH422_A_SCAN_BIT | CH422_IO_OE_BIT | CH422_OD_EN_BIT);//开显示
CH422_I2c_Write(CH422_DIG0 | BCD_decode_tab[0]);
CH422_I2c_Write(CH422_DIG1 | BCD_decode_tab[1]);
CH422_I2c_Write(CH422_DIG2 | BCD_decode_tab[2]);
CH422_I2c_Write(CH422_DIG3 | BCD_decode_tab[3]);
while(1); //读取键值
}
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
振荡电路
+关注
关注
17文章
505浏览量
98937 -
时钟
+关注
关注
11文章
1746浏览量
131748 -
数码管
+关注
关注
32文章
1883浏览量
91368 -
芯片驱动
+关注
关注
0文章
13浏览量
14161
发布评论请先 登录
相关推荐
CH422做拓展IO时IO7~IO0是否可部分配置为Input、部分配置为OUPUT?
如题,如果需要使用CH422做拓展的IO口,其中我们知道IO7~IO0可以作为输入INPUT口或者输出OUPUT口,但是目前查看规格书和推荐的代码,都是初始化IO7~IO0为全部输入口或者全部输出
发表于 10-11 08:27
CH422 SDA和SCL可以直接连接单片机3.3V IO吗?
我的单片机是3.3V ,CH422如果用5V供电,那么SDA 和SCL可以直接连接单片机3.3V IO吗?需要注意什么吗,谢谢
发表于 10-12 07:20
CH451中文资料手册pdf(数码管驱动及键盘控制芯片)
数码管驱动及键盘控制芯片CH451中文手册(第三版)CH451 是一个整合了数码管显示驱动和键盘扫描控制以及μP 监控的多功能外围
发表于 07-20 21:48
•918次下载
CH35芯片PCI驱动下载
CH35芯片PCI驱动下载:CHINESE:PCISETUP.exe是PCI卡的驱动安装工具,您可以用这个工具来安装卡的驱动.相关文件说明-
发表于 12-09 21:13
•178次下载
CH422数码管显示驱动及IO扩展芯片的数据手册
CH422 芯片可以用于数码管显示驱动或者 I/O 扩展。CH422 内置时钟振荡电路,可以动态驱动 4 位数码管或者 32 只 LED 发
发表于 12-29 08:00
•3次下载
评论