STM32F0系列单片机IO口没有位带操作,仿位带比较浪费资源,不太想用模拟IIC。

HAL库的IIC操作做还是很方便的,是24C02之类的EEPROM很好用,本文主要介绍使用HAL库的IIC驱动沁恒的CH455G数码管驱动器。

1.STM32CubeMX部分配置

这部分没有特别的地方,常规设就行

2. CH455G驱动代码

这一部分h文件引用了沁恒提供的代码

CH455G.h

#ifndef __CH455G_H
#define __CH455G_H

#include "main.h"
#include "stdint.h"

// 设置系统参数命令
#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位数据

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

#define BCD_decode_DP   0x0080
#define BCD_decode_NG   0x0040
//extern const uint8_t BCD_decode_tab[0x10];

void CH455G_Write(uint16_t cmd);
void CH455G_Init(void);
void CH455G_Display(short data);

#endif

CH455.C

#include "CH455G.h"
#include "math.h"
volatile const uint8_t BCD_decode_tab[0x10] = { 0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X07, 0X7F, 0X6F, 
                                                       0X77, 0X7C, 0X58, 0X5E, 0X79, 0X71 };//BCD

void CH455G_Write(uint16_t cmd)
{
  uint8_t data1=0;
  uint8_t data2=0;
  data1 = ((uint8_t)(cmd>>7)&CH455_I2C_MASK)|CH455_I2C_ADDR;
  data2 = (uint8_t)(cmd & 0x00ff);
  HAL_I2C_Master_Transmit(&hi2c1,data1,&data2,1,1000);
  __NOP();
}  
                                     
void CH455G_Init(void)
{
  CH455G_Write( CH455_SYSON );// 开启显示和键盘,8段显示方式
  delay_ms(10);
  CH455G_Write( CH455_SYSON_8 );    // 8级亮度显示
}

void CH455G_Display(short data)
{
  uint8_t encode[4]={0};
  
  if(data<0)
  {
    //data = 0-data;
    data = ~(data-1);
    encode[1] = (data % 1000) / 100;
    encode[2] = (data % 100) / 10;
    encode[3] = data % 10;
    //发显示数据
    CH455G_Write( CH455_DIG0 | BCD_decode_NG );    
//    CH455G_Write( CH455_DIG1 | BCD_decode_tab[encode[1]] ); 
//    CH455G_Write( CH455_DIG2 | BCD_decode_tab[encode[2]] | BCD_decode_DP); 
//    CH455G_Write( CH455_DIG3 | BCD_decode_tab[encode[3]] ); 
  }
  else
  {
    encode[0] = data / 1000;
    encode[1] = (data % 1000) / 100;
    encode[2] = (data % 100) / 10;
    encode[3] = data % 10;
  
    //发显示数据
    CH455G_Write( CH455_DIG0 | BCD_decode_tab[encode[0]] );    
//    CH455G_Write( CH455_DIG1 | BCD_decode_tab[encode[1]] ); 
//    CH455G_Write( CH455_DIG2 | BCD_decode_tab[encode[2]] | BCD_decode_DP); 
//    CH455G_Write( CH455_DIG3 | BCD_decode_tab[encode[3]] ); 
  }
    CH455G_Write( CH455_DIG1 | BCD_decode_tab[encode[1]] ); 
    CH455G_Write( CH455_DIG2 | BCD_decode_tab[encode[2]] | BCD_decode_DP); 
    CH455G_Write( CH455_DIG3 | BCD_decode_tab[encode[3]] ); 
}

3. 特别说明

CH455G也有一个设备地址,但是这个地址与24C02不一样,如果用模拟IIC写可以16位依次写入,但是使用HAL库使用

HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

就需要将指令拆分,16位指令部分拆分为高8为与低八位,

data1 = ((uint8_t)(cmd>>7)&CH455_I2C_MASK)|CH455_I2C_ADDR;
  data2 = (uint8_t)(cmd & 0x00ff);

HAL_I2C_Master_Transmit(&hi2c1,data1,&data2,1,1000);

将data1作为DevAddress,data2作为数据部分,长度size设为1。

至此就能往CH455G写数据了

STM32F030F4P6 IIC HAL库驱动CH455G相关推荐

  1. STM32 HAL库 驱动 MT6701 磁编码器

    写在前面: MT6701 是 MagnTek 推出的新一代基于差分霍尔感应原理的磁性角度编码器芯片.值得一提的是 MT6701不仅提供 0~360° 的角度信号,而且还提供了一个"按压&qu ...

  2. RT-Thread studio配置can hal库 驱动GM6020

    RT-Thread studio配置can hal库 驱动GM6020 最近由裸机系统转战rt-thread,在刚入手RT-Thread的过程中记录一些东西吧,可能是刚做的原因,软件还不是那么完整好用 ...

  3. VL53L0x TOF激光测距的 stm32 HAL库驱动代码

    VL53L0x 是ST公司生成的 TOF激光测距传感器,得益于非常小巧的尺寸,很容易放入手机.无人机中,提供更加精准.稳定的测距方式. 本文代码,使用 STM32F4xx的 HAL库. VL53L0x ...

  4. STM32使用HAL库驱动SDRAM

    1.驱动平台 开发板使用的是野火的STM32H750,需要驱动核心板上的SDRAM(2片装),SDRAM使用的是W9825G6KH-6,32MB@,组合一起成为64M.驱动方式使用STM32H750X ...

  5. 淘宝二手优必选舵机保姆级驱动教程,看不懂来打我(自行修改ID,有HAL库驱动函数)

    1.首先,先检查舵机的好坏. 本身优必选舵机的连接线属于稀缺物品,所以经本人实验,使用PH2.0 3P端子口也可以供电,但要剪掉端口背面的一小段塑料凸起. 另:24齿的舵机也已经测试过可以兼容淘宝有售 ...

  6. 大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制

    1.首先,我们先了解一下大疆开发板A型的资料,官方有提供 官网:RoboMaster 机甲大师赛 芯片型号STM32F427IIH6 2.了解M3508直流无刷电机的资料,官网有提供  3.于是我找到 ...

  7. HAL库驱动NRF24L01实现数据传输

    文章目录 1.NRF24L01介绍 2.驱动程序设计 1.根据原理图进行封装 2.cubemx配置 3.收发测试 4.源代码 本次使用正点原子精英开发板和野火MINI开发板进行采用NRF24L01的数 ...

  8. STM32 Cube IDE HAL库驱动 W25Q128 进行读、写、擦除操作

    一.W25Q128相关理论 W25Q128存储大小为128M-bit=16MB,可编程位(地址)为Flash_Size=16*1024*1024=16777216 B. W25Q128包含256个块. ...

  9. STM32 HAL库IIC驱动

    1. STM32上IIC的一些争议 关于STM32的IIC驱动,网上有很多争论,究竟是使用STM32自带的硬件IIC还是用IO口和软件模拟IIC呢?下面这个图形象展示了这些争论.总结一些:ST为了规避 ...

最新文章

  1. PolarDB-X 2.0:使用一个透明的分布式数据库是一种什么体验?
  2. 柏林的评委还识货,我的打赌也算是赢了
  3. Geary 0.13.0 发布,GNOME 3 Email 客户端应用
  4. 和get redis_SpringBoot整合Redis,你get了吗?
  5. 04_css盒子模型
  6. SpringBoot POM说明
  7. java part part,java泛型指导手册(part1),指导手册part1
  8. java文本框内容覆盖6_java中读入一个TXT文件到文本框空如何覆盖以前读的内容?...
  9. [Java]zxing生成qrcode二维码,带水印图片,中间带一个logo
  10. matlab设计调度方法,基于Matlab的BP神经网络在公交车辆调度中的应用
  11. 雅虎军规——前端优化的35条建议
  12. cmd批量修改文件名 增加文字_如何批量修改文件名称,如何批量修改文件标题
  13. 使用Mob工具实现QQ、微信、新浪微博登录
  14. Ajax访问接口报错NET::ERR_CERT_REVOKED
  15. 微信小程序开发—(八)canvas绘制图形
  16. 怎样删除androidstudio创建的模拟器
  17. 解决前端vue中的Uncaught TypeError: this.Form is undefined
  18. 上海2021高考小三门成绩查询,上海高考小三门怎么算分?附上海小三门等级对应分数...
  19. 电视+私人影院+KTV+游戏厅,爽!
  20. 基于指纹的原则,具体的音乐检索

热门文章

  1. MySQL-学生表以及课程、老师、成绩表的创建
  2. html的class怎么使用方法,HTML的class属性怎么用?使用方法详细总结!
  3. 【知识图谱】两种 Python 方法实现社区发现之标签传播算法(LPA)
  4. Android电视清理系统应用,智能电视删除自带软件,这个方法最简单!
  5. mysqldump和XBK备份
  6. 水银开关控制LED灯灯灭
  7. 位/比特(bit)、字节(Byte)的理解
  8. 【求职】瓜子二手车 Java 方向面经
  9. win10解决PL2303串口错误方法
  10. 【JavaScript】关于基本数据类型和引用数据类型