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); //读取键值
}
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !