机器人眼睛电路板驱动

前言

某宝立华家一款8*8点阵模块电路板(机器人眼睛)价格便宜,近期入手多块。该板含两个8*8点阵屏,驱动芯片为FZH119(方中禾),FZH119主要用于8段16位共阴极或16段8位共阳极数码管驱动。经查询FZH119用于点阵屏的例子不多,但点阵屏和数码管是相通的。为实现点阵屏驱动,本文多有借鉴前辈们数码管驱动源码。

同时该电路板可能存在安装和设计缺陷,滤波电容极性反接,走线不走寻常路。本来FZH119只要注意数据低位在前高位在后,可以用IIC驱动点阵。但正常的IIC在该板表现为乱码。为解决乱码问题,加入了2个数组seg_sq[]、grid_sq[]来控制段位输出顺序。本人初学不知道这样控制是否合理,不会是画蛇添足吧。不管怎么说最后实现了正常显示。


话不多直接上源码。

一、源码

1.IIC头文件“my_iic.h”

#ifndef __MY_IIC_H
#define __MY_IIC_H
#include <STC15F2K60S2.H>
#include "intrins.h"sbit I2C_SDA = P3^7;
sbit I2C_SCL = P3^6;void I2C_init(void);
void I2C_Start(void);
void I2C_Stop(void);
void I2C_SendByte(unsigned char Byte);
void I2c_nbByte(unsigned char cmd,unsigned char* str,unsigned char len);
void I2c_cmdSend(signed char cmd);
void I2c_nbREyeByte(unsigned char cmd,unsigned char* str,unsigned char len);#endif

2.IIC实现文件“my_iic.c”

代码如下(示例):

#include "my_iic.h"
#include "intrins.h"int   grid_sq[]={1,3,0,4,6,7,5,2,8,11,9,10,13,15,14,12};
unsigned char seg_sq[]={0x08,0x20,0x40,0x80,0x04,0x10,0x02,0x01};//2微秒
void delay(void)
{
/*  _nop_();
;*/
}/*** @brief   I2C初始化* @param 无* @retval 无* */
void I2C_init(void)
{I2C_SDA = 1;  //delay();I2C_SCL = 1;delay();
}/*** @brief   I2C起始信号* @param    无* @retval 无* 起始条件:SCL高电平期间,SDA从高电平切换到低电平*/
void I2C_Start(void)
{I2C_SDA = 1;  //拼接其他块,确保默认是1I2C_SCL = 1;delay();I2C_SDA = 0; //时序上先拉低delay();I2C_SCL = 0;
}/*** @brief   I2C停止信号* @param    无* @retval 无* 终止条件:SCL高电平期间,SDA从低电平切换到高电平*/
void I2C_Stop(void)
{I2C_SDA = 0;  //确保默认0,保证由低电平拉高至高电平I2C_SCL = 1;delay();I2C_SDA = 1;
}/*** @brief   I2C发送一个字节数据* @param    Byte 要发送的字节* @retval   无* 微处理器的数据通过两线总线接口和 FZH119 通信,在输入数据时当 CLK 是高电平时,DIN 上的信号必须保持不变;只有 CLK 上的时钟信号为低电平时,DIN 上的信号才能改变。数据的输入总是低位在前,高位在后传输.数据输入的开始条件是 CLK 为高电平时,DIN 由高变低;结束条件是 CLK 为高时,DIN 由低电平变为高电平。*/
void I2C_SendByte(unsigned char Byte)
{unsigned char i;for (i = 0; i < 8; i ++){        I2C_SDA = Byte&0x01;       //数据的输入总是低位在前,高位在后传输Byte=Byte>>1;I2C_SCL = 1;I2C_SCL = 0;}
}/*** @brief I2C_SendReyeByte* IIC发送机器人眼睛段信息,数据顺序不常规* 机器人眼睛段地址顺序:* unsigned char seg_sq[]={0x08,0x20,0x40,0x80,0x04,0x10,0x20,0x01};* 时钟下降沿发送数据*/
void I2C_SendREyeByte(unsigned char Byte)
{unsigned char i;for (i = 0; i < 8; i ++){        I2C_SDA=Byte&seg_sq[i];I2C_SCL = 1;I2C_SCL = 0;}
}/**
* @brief 发送多个字节*  start -> command2 -> data1-dataN ->end
*/
void I2c_nbByte(unsigned char cmd,unsigned char* str,unsigned char len){unsigned char i;I2C_Start();//startI2C_SendByte(cmd);//command2for(i=0;i<len;i++){I2C_SendByte(str[i]);}//data1-dataNI2C_Stop();//end
}/*** @brief I2c_nbREyeByte* IIC发送机器人眼睛位信息,数据顺序不常规* 机器人眼睛位地址顺序:* int grid_sq[]={1,3,0,4,6,7,5,2,9,11,8,12,14,15,13,10};* 时钟下降沿发送数据* len设置16*/
void I2c_nbREyeByte(unsigned char cmd,unsigned char* str,unsigned char len)
{unsigned char i;I2C_Start();//startI2C_SendByte(cmd);//command2for(i=0;i<len;i++){I2C_SendREyeByte(str[grid_sq[i]]); //变化了顺序}//data1-dataNI2C_Stop();//end
}/**
* @brief 发送命令* start -> command ->end
*/void I2c_cmdSend(signed char cmd)
{I2C_Start();//startI2C_SendByte(cmd);//commandI2C_Stop();//end
}

3.FZH119定义头文件“FZHxxx.h”

#ifndef __FZHXXX_H
#define __FZHXXX_H
#define cmdData      //010000typedef signed char        int8_t;
typedef unsigned char      uint8_t;
typedef unsigned short     uint16_t;enum GRID{grid1=0xc0,grid2,grid3,grid4,grid5,grid6,grid7,grid8,grid9,grid10,grid11,grid12,grid13,grid14,grid15,grid16
};#define FZH_CMD_ON 0x88
#define FZH_CMD_FF 0x80
#define USAER_CMD_CYCLE_1_16  0
#define USAER_CMD_CYCLE_2_16  1
#define USAER_CMD_CYCLE_4_16  2
#define USAER_CMD_CYCLE_10_16 3
#define USAER_CMD_CYCLE_11_16 4
#define USAER_CMD_CYCLE_12_16 5
#define USAER_CMD_CYCLE_13_16 6
#define USAER_CMD_CYCLE_14_16 7#define USAER_CMD_SHOW_ON     1
#define USAER_CMD_SHOW_OFF    0//与硬件连接相关设置
#define START_SRAM    grid1      //是定开始扫描地址地址int8_t fzh_WriteSram(uint8_t cmd1,uint8_t cmd2,uint8_t *str,uint8_t len,uint8_t cmd3 );int8_t fzh_cmdWrite(uint8_t cmd);
int8_t fzh_cmdWriteDat(uint8_t cmd,uint8_t dat);
/***********************************************************************************************
*
*函数名 :void fzh_SetLightGrade(uint8_t grade,uint8_t onff)
*函数功能描述 :亮度设置
*函数参数 :grade:亮度等级 支持7个等级 参考宏定义USAER_CMD_CYCLE_  onff 0:关闭显示 其它:显示
*函数返回值 :无
*作者 :SY
*函数创建日期 :20211007
*
***********************************************************************************************/
void fzh_SetLightGrade(uint8_t grade,uint8_t onff);
/***********************************************************************************************
*
*函数名 :void fzh_Init(void)
*函数功能描述 :数码管初始化数码管显示驱动 并设为等亮度 默认显示
*函数参数 :无
*函数返回值 :无
*作者 :SY
*函数创建日期 :20211007
*
***********************************************************************************************/
void fzh_Init(void);
int8_t fzh_WriteREyeSram( uint8_t cmd1,uint8_t cmd2,uint8_t* str,uint8_t len,uint8_t cmd3 );
#endif

4.FZH119实现文件“FZHxxx.c”

#include "FZHxxx.h"
#include "intrins.h"
#include "my_iic.h"uint8_t  fzh_light_grade = 0x8c;int8_t fzh_WriteSram( uint8_t cmd1,uint8_t cmd2,uint8_t* str,uint8_t len,uint8_t cmd3 ) {if( ( len==0 )||( len>16 ) ) {return -1;}I2c_cmdSend( cmd1 );I2c_nbByte(cmd2,str,len );I2c_cmdSend( cmd3 );return 0;
}/** * @brief fzh_WriteREyeSram*/
//机器人眼睛FZH119顺序
//len 输入 16
int8_t fzh_WriteREyeSram( uint8_t cmd1,uint8_t cmd2,uint8_t* str,uint8_t len,uint8_t cmd3 ) {I2c_cmdSend( cmd1 );       //显示方式设置I2c_nbREyeByte(cmd2,str,len );I2c_cmdSend( cmd3 );      //显示ON,显示亮度return 0;
}int8_t fzh_cmdWrite( uint8_t cmd ) {I2c_cmdSend( cmd );return 0;
}int8_t fzh_cmdWriteDat( uint8_t cmd,uint8_t dat ) {I2c_nbByte( cmd,&dat,1 );return 0;
}void fzh_SetLightGrade(uint8_t grade,uint8_t onff){if(grade>7)grade=7;fzh_light_grade = 0;if(onff!=0){fzh_light_grade = FZH_CMD_ON|grade;}else {fzh_light_grade = FZH_CMD_FF;}
}void fzh_Init(void){I2C_init();fzh_SetLightGrade(USAER_CMD_CYCLE_11_16,USAER_CMD_SHOW_ON);
}

5.main文件“main.c”

#include <STC15F2K60S2.H>
#include "intrins.h"
#include "FZHxxx.h"unsigned char fangkuang1[]={0x10,0xFE,0x92,0x92,0xFE,0x92,0x10,0x10,0xFF,0xFD,0x91,0xFD,0x9D,0xFD,0x81,0xFF};
unsigned char fangkuang2[]={0x24,0x7E,0xFF,0xFF,0xFF,0x7E,0x3C,0x18,0x24,0x7E,0xFF,0xFF,0xFF,0x7E,0x3C,0x18};void Delay5000ms()        //@11.0592MHz
{unsigned char i, j, k;_nop_();i = 36;j = 5;k = 211;do{do{while (--k);} while (--j);} while (--i);
}//上电时,地址默认设为C0H,grid1
int main(void){fzh_Init();while(1){fzh_SetLightGrade(USAER_CMD_CYCLE_14_16,USAER_CMD_SHOW_ON);//0x40:地址自动加一 //grid1:从grid1开始fzh_WriteREyeSram( 0x40,grid1,fangkuang1,16,FZH_CMD_ON|USAER_CMD_CYCLE_11_16); Delay5000ms();    Delay5000ms();fzh_WriteREyeSram( 0x40,grid1,fangkuang2,16,FZH_CMD_ON|USAER_CMD_CYCLE_2_16); Delay5000ms();  Delay5000ms();/*
//fzh_WriteSram是正常顺序输出的函数,显示乱码fzh_WriteSram( 0x40,grid1,fangkuang1,16,FZH_CMD_ON|USAER_CMD_CYCLE_14_16); Delay5000ms();  Delay5000ms();fzh_WriteSram( 0x40,grid1,fangkuang2,16,FZH_CMD_ON|USAER_CMD_CYCLE_2_16); Delay5000ms();  Delay5000ms();
*/}return 1;
}

总结

本文借鉴了很多前辈关于FZH119数码管驱动、IIC实现的源码。甚至是文件名和函数名都没改直接照搬过来,在此一并感谢。

后有前辈指出FZH119和TM1640兼容,查了一下确实。

本人近期刚学用单片机1个多月,难免有疏漏不到之处,还请谅解。

FZH119 IIC驱动2个8*8点阵屏相关推荐

  1. Exynos4412 IIC总线驱动开发(二)—— IIC 驱动开发

    前面在Exynos4412 IIC总线驱动开发(一)-- IIC 基础概念及驱动架构分析 中学习了IIC驱动的架构,下面进入我们的驱动开发过程 首先看一张代码层次图,有助于我们的理解 上面这些代码的展 ...

  2. MSP430杂谈--AD7745硬件IIC驱动与模拟IIC驱动

    和上一篇AD7793类似,项目中也涉及到利用AD7745读取电容值,来测环境湿度.编写了基于MSP430的AD7745的硬件IIC驱动和模拟IIC驱动,分享给大家. AD7745硬件IIC驱动完整版下 ...

  3. IIC驱动0.96寸OLED屏幕显示(51单片机)

    这篇文章得用到IIC驱动,大家如果不会IIC通信,可以看这篇文章,也是我写的,是有关IIC通信的,有什么不理解的可以在看一下:https://blog.csdn.net/m0_58832575/art ...

  4. stm32的IIC驱动0.96OLED

    IIC原理介绍: IIC是一个总线的结构但不支持总线协议 OLED介绍: 一.0.96寸OLED屏幕介绍 本文采用的是4针的0.96寸OLED显示进行讲解,采用的是SPI协议,速度会比采用I2C协议的 ...

  5. Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析 (iic驱动框架,i2c驱动框架)...

    转载于 : http://blog.csdn.net/zqixiao_09/article/details/50917655 关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸 ...

  6. linux下IIC驱动开发分析

    1.  IIC规范 IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备.IIC总线产生于在80年代,最初为音频和 ...

  7. 基于Stm32f103硬件iic驱动LM75A温度传感器

    这是LM75A温度传感器的概述,本文主要介绍基于Stm32f103的硬件iic驱动LM75A温度传感器. 这是我所使用的硬件电路,很简单. 对于该传感器的使用,主要是读取温度值,查看数据手册我们知道需 ...

  8. 基于Stm32f103利用模拟iic驱动LM75A温度传感器

    这两天一直在搞模拟iic,模拟iic相较于硬件iic的优势在于更稳定,io口的选择更灵活. 这次编写模拟iic驱动程序还是有点坎坷,其中模拟iic的时序不是难点,直接说我遇到的问题1.io口模式的选择 ...

  9. 1.3寸OLED IIC驱动右方出现两列像素白边的解决方法

    问题 因为1.3寸OLED IIC驱动资源网上少很多,买来时以为和0.96寸OLED的驱动一样,没在意,但使用0.96寸的程序调试中,却出现右方一直有两列白边. 思考 在排除其他接线.取模显示等因素后 ...

最新文章

  1. Flask-admin 使用总结
  2. 第一章 面向对象编程
  3. oracle apply handler,做什么BaseHandler.apply_response_修复在django吗?
  4. SQLite学习手册(实例代码二)
  5. 每输入四个字符添加一个中划线
  6. [转载]手机编程与AIDE
  7. ETL开发工具KETTLE使用教程
  8. 开关电源BOOST升压原理
  9. 腾讯越来越不懂游戏了
  10. 淋巴细胞转化中PHP的作用,淋巴细胞转化试验介绍|意义
  11. C语言(苏小红)——第二章基本数据类型
  12. 击穿线程池面试题:3大方法,7大参数,4种拒绝策略
  13. SQL 分析大盘走势
  14. 冲破服务机器人赛道“不可能三角”,科沃斯展现行业第一的统治力
  15. 电动车电池管理系统结构
  16. IDEMIA与Voiceworks携手合作,率先为荷兰市场提供白标eSIM解决方案
  17. oracle+函数怎么写if,Oracle NULLIF函数
  18. 图片2分类卷积神经网络模型训练、分类预测案例全过程(2)
  19. 大量引用了原文的论文怎么降重啊?
  20. 令人笑喷的 56 个代码注释,你写过多少?

热门文章

  1. 【直播预约】最强监管来临,你的APP准备好了吗?
  2. [Unity3D]Unity3D游戏开发之《经典打砖块》游戏项目讲解
  3. SQL学习-alter-添加新的字段
  4. IPV4 IPV6 DHCP中继服务器之思科交换机配置
  5. php中的lt;?= ?gt;替换lt;?php echo ?gt;
  6. DNS区域传输 DNS爆破
  7. 无极调光炫彩rgb镜子灯触摸芯片-DLT8S12A-杰力科创
  8. 某查查app sign算法初步探索
  9. 12/15历史上的今天
  10. OLAP(三):Impala介绍 、 (和hive/spark对比)、COMPUTE STATS