数码管驱动及键盘控制芯片 CH455 STM32F407使用

1、概述
CH455 是数码管显示驱动和键盘扫描控制芯片。CH455内置时钟振荡电路,可以动态驱动4 位数
码管或者32 只LED;同时还可以进行28 键的键盘扫描;CH455 通过SCL 和SDA 组成的2 线串行接口
与单片机等交换数据。

 2、键盘扫描

    下表是在DIG3~DIG0 与SEG6~SEG0 之间7×4 矩阵的按键编址,也是数码管段位和发光管LED
阵列的顺序编址。由于按键代码是8 位,键按下时位6 总是1,所以当键按下时,CH455 所提供的实
际按键代码是表中的按键编址加上40H,也就是说,此时的按键代码应该在44H 到7FH 之间。

   在编程时,可以使判断读取的数值第六位是否为1判断是否有按键按下以及按键是否松开。

3、LED 灯驱动

    CH455 内部具有4个8位的数据寄存器,用于保存4个字数据,分别对应于CH455 所驱动的4个
数码管或者4 组每组8个的发光二极管。数据寄存器中字数据的位7~位0 分别对应各个数码管的小
数点和段G~段A,对于发光二极管阵列,则每个字数据的数据位唯一地对应一个发光二级管。当数
据位为1 时,对应的数码管的段或者发光管就会点亮;当数据位为0 时,则对应的数码管的段或者发
光管就会熄灭。

4、串行通信接口

    CH455 具有硬件实现的2线串行接口,包含2个主要信号线:串行数据时钟输入线SCL、串行数
据输入和输出线SDA;以及1个辅助信号线:中断输出线INT#。其中,SCL 是带上拉的输入信号线,默认是高电平;SDA是带上拉的准双向信号线,默认是高电平;INT#是带上拉的开漏输出,在启用键
盘扫描功能后作为键盘中断输出线,默认是高电平。
    SDA 用于串行数据输入和输出,高电平表示位数据1,低电平表示位数据0,串行数据输入的顺
序是高位在前,低位在后。
    SCL 用于提供串行时钟,CH455 在其上升沿从SDA 输入数据,在其下降沿从SDA 输出数据。
在SCL 为高电平期间发生的SDA 下降沿定义为串行接口的启动信号,在SCL 为高电平期间发生
的SDA 上升沿定义为串行接口的停止信号。CH455只在检测到启动信号后才接收并分析命令。所以在
单片机I/O引脚资源紧张时,可以在保持SDA 引脚状态不变的情况下,将SCL引脚与其它接口电路共
用;如果能够确保SDA引脚的变化仅在SCL引脚为低电平期间发生,那么SCL引脚和SDA 引脚都可以
与其它接口电路共用。
    INT#用于键盘中断输出,默认是高电平。当CH455 检测到有效按键时,INT#输出低电平有效的
键盘中断;单片机被中断后,对CH455执行读操作,CH455将INT#恢复为高电平,并从SDA 输出按键
代码,单片机从SDA 获得一个字节的数据,即按键代码。
    单片机与CH455 的通讯过程总是分为6 个步骤,按单片机的操作方向分成两种类型,一种是写
操作,用于输出数据,一种是读操作,用于输入数据。具体过程可以参考例子程序中的说明。
    写操作包括以下6 个步骤:输出启动信号、输出字节1、应答1、输出字节2、应答2、输出停
止信号。其中,启动信号和停止信号如上所述,应答1 和应答2 总是固定为1,输出字节1和输出字
节2 各自包含8个数据位,即一个字节数据。
    读操作包括以下6 个步骤:输出启动信号、输出字节1、应答1、输入字节2、应答2、输出停
止信号。其中,启动信号和停止信号如上所述,应答1 和应答2 总是固定为1,输出字节1和输入字
节2 各自包含8个数据位,即一个字节数据。

  下图是一个写操作的实例,字节1为01001000B,即48H;字节2 为00000001B,即01H

5、编程例程

主要是两个函数:


/*********************************************************************
函数名:     CH455_Read
功能:       读取CH455一个字节数据数据(按键码值)
输入:       
输出:      
返回:       
*********************************************************************/
unsigned char CH455_Read(void)
{
    unsigned char keycode;
    
    CH455_I2C_Start();                   //启动总线
    CH455_I2C_WriteByte(0x4F);
    keycode = CH455_I2C_ReadByte();      //读取数据
    CH455_I2C_Stop();                    //结束总线
    return keycode;    
}	

/*********************************************************************
函数名:     CH455_Write
功能:       向CH455寄存器写入命令值
输入:       写入命令值
输出:       
返回:       
*********************************************************************/
unsigned char CH455_Write(unsigned short cmd)	
{
   
    CH455_I2C_Start();                                      //启动总线
    CH455_I2C_WriteByte(((unsigned char)(cmd>>7)&CH455_I2C_MASK)|CH455_I2C_ADDR);
    CH455_I2C_WriteByte((unsigned char)cmd);                //发送数据
    CH455_I2C_Stop();                                       //结束总线 
    return 0;

}

点亮LED灯

CH455_Write(CH455_DIG0 | 0x01);
CH455_Write(CH455_DIG1 | 0x02);
CH455_Write(CH455_DIG0 | 0x04);
CH455_Write(CH455_DIG1 | 0x08);

/* */

获取按键码值

void Keyboard_proc(void)
{	
    unsigned char keyID; 
	
    keyID = CH455_Read();
	
    if(0xFF == keyID)
    {
        /* 无按键按下 */
        return;
    }
    else if(keyID & 0x40)     
    {
        /* 有按键按下,记录下按键键值 */
        keyID &= ~0x40;        
        gu8KeyID = keyID;
    }
    else                      
    {
        /* 按键松开,处理键值 */
        if(keyID == gu8KeyID)
        {

             /* 处理函数 */

            gu8KeyID = 0xFF;
        }
        else
        {
            gu8KeyID = 0xFF;
        }
    }    
    return; 
}
// 加载字数据命令
#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 CH455_GET_KEY	0x0700			// 获取按键,返回按键代码

/*CH455接口定义*/
#define	CH455_I2C_ADDR		0x40			// CH455的地址
#define	CH455_I2C_MASK		0x3E			// CH455的高字节命令掩码



#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级亮度   
    
    

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章