ch422芯片驱动

描述

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);                                                                    //读取键值
}



  审核编辑:汤梓红
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分