灵儿巴斯

 找回密码
 立即注册
查看: 892|回复: 2

FZH119

[复制链接]

110

主题

29

回帖

658

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
658
发表于 2025-5-25 21:20:37 | 显示全部楼层 |阅读模式
前言

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

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



话不多直接上源码。

一、源码1.IIC头文件“my_iic.h”

  1. #ifndef __MY_IIC_H
  2. #define __MY_IIC_H
  3. #include <STC15F2K60S2.H>
  4. #include "intrins.h"

  5. sbit I2C_SDA = P3^7;
  6. sbit I2C_SCL = P3^6;

  7. void I2C_init(void);
  8. void I2C_Start(void);
  9. void I2C_Stop(void);
  10. void I2C_SendByte(unsigned char Byte);
  11. void I2c_nbByte(unsigned char cmd,unsigned char* str,unsigned char len);
  12. void I2c_cmdSend(signed char cmd);
  13. void I2c_nbREyeByte(unsigned char cmd,unsigned char* str,unsigned char len);

  14. #endif
复制代码


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

代码如下(示例):


  1. #include "my_iic.h"
  2. #include "intrins.h"

  3. int        grid_sq[]={1,3,0,4,6,7,5,2,8,11,9,10,13,15,14,12};
  4. unsigned char seg_sq[]={0x08,0x20,0x40,0x80,0x04,0x10,0x02,0x01};


  5. //2微秒
  6. void delay(void)
  7. {
  8. /*        _nop_();
  9. ;*/
  10. }


  11. /**
  12.   * @brief        I2C初始化
  13.   * @param        无
  14.   * @retval        无
  15.         *
  16.   */
  17. void I2C_init(void)
  18. {
  19.         I2C_SDA = 1;        //
  20.         delay();
  21.         I2C_SCL = 1;
  22.         delay();
  23. }


  24. /**
  25.   * @brief        I2C起始信号
  26.   * @param        无
  27.   * @retval        无
  28.         * 起始条件:SCL高电平期间,SDA从高电平切换到低电平
  29.   */
  30. void I2C_Start(void)
  31. {
  32.         I2C_SDA = 1;        //拼接其他块,确保默认是1
  33.         I2C_SCL = 1;
  34.         delay();
  35.         I2C_SDA = 0;        //时序上先拉低
  36.         delay();
  37.         I2C_SCL = 0;
  38. }

  39. /**
  40.   * @brief        I2C停止信号
  41.   * @param        无
  42.   * @retval        无
  43.         * 终止条件:SCL高电平期间,SDA从低电平切换到高电平
  44.   */
  45. void I2C_Stop(void)
  46. {
  47.         I2C_SDA = 0;        //确保默认0,保证由低电平拉高至高电平
  48.         I2C_SCL = 1;
  49.         delay();
  50.         I2C_SDA = 1;
  51. }


  52. /**
  53.   * @brief        I2C发送一个字节数据
  54.   * @param        Byte 要发送的字节
  55.   * @retval        无
  56.         * 微处理器的数据通过两线总线接口和 FZH119 通信,在输入数据时当 CLK 是高电平时,DIN 上的信号
  57.                 必须保持不变;只有 CLK 上的时钟信号为低电平时,DIN 上的信号才能改变。数据的输入总是低位在前,高位
  58.                 在后传输.数据输入的开始条件是 CLK 为高电平时,DIN 由高变低;结束条件是 CLK 为高时,DIN 由低电平
  59.                 变为高电平。
  60.   */
  61. void I2C_SendByte(unsigned char Byte)
  62. {
  63.         unsigned char i;
  64.         for (i = 0; i < 8; i ++)
  65.         {               
  66.                 I2C_SDA = Byte&0x01;                //数据的输入总是低位在前,高位在后传输
  67.                 Byte=Byte>>1;
  68.                 I2C_SCL = 1;
  69.                 I2C_SCL = 0;
  70.         }
  71. }

  72. /**
  73.         * @brief I2C_SendReyeByte
  74.         * IIC发送机器人眼睛段信息,数据顺序不常规
  75.         * 机器人眼睛段地址顺序:
  76.         * unsigned char seg_sq[]={0x08,0x20,0x40,0x80,0x04,0x10,0x20,0x01};
  77.         * 时钟下降沿发送数据
  78.         */
  79. void I2C_SendREyeByte(unsigned char Byte)
  80. {
  81.         unsigned char i;
  82.         for (i = 0; i < 8; i ++)
  83.         {               
  84.                 I2C_SDA=Byte&seg_sq[i];
  85.                 I2C_SCL = 1;
  86.                 I2C_SCL = 0;
  87.         }
  88. }



  89. /**
  90. * @brief 发送多个字节
  91.         *  start -> command2 -> data1-dataN ->end
  92. */
  93. void I2c_nbByte(unsigned char cmd,unsigned char* str,unsigned char len)
  94.        
  95. {
  96.         unsigned char i;
  97.         I2C_Start();//start
  98.         I2C_SendByte(cmd);//command2
  99.         for(i=0;i<len;i++){
  100.                 I2C_SendByte(str[i]);
  101.         }//data1-dataN
  102.         I2C_Stop();//end
  103. }


  104. /**
  105.         * @brief I2c_nbREyeByte
  106.         * IIC发送机器人眼睛位信息,数据顺序不常规
  107.         * 机器人眼睛位地址顺序:
  108.         * int grid_sq[]={1,3,0,4,6,7,5,2,9,11,8,12,14,15,13,10};
  109.         * 时钟下降沿发送数据
  110.   * len设置16
  111.         */
  112. void I2c_nbREyeByte(unsigned char cmd,unsigned char* str,unsigned char len)
  113. {
  114.         unsigned char i;
  115.         I2C_Start();//start
  116.         I2C_SendByte(cmd);//command2
  117.         for(i=0;i<len;i++){
  118.                         I2C_SendREyeByte(str[grid_sq[i]]);        //变化了顺序
  119.         }//data1-dataN
  120.        
  121.         I2C_Stop();//end
  122. }

  123. /**
  124. * @brief 发送命令
  125.         * start -> command ->end
  126. */

  127. void I2c_cmdSend(signed char cmd)
  128. {
  129.         I2C_Start();//start
  130.         I2C_SendByte(cmd);//command
  131.         I2C_Stop();//end
  132. }
复制代码


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

  1. #ifndef __FZHXXX_H
  2. #define __FZHXXX_H
  3. #define cmdData      //010000


  4. typedef signed char        int8_t;
  5. typedef unsigned char      uint8_t;
  6. typedef unsigned short     uint16_t;

  7. enum GRID{
  8.         grid1=0xc0,
  9.         grid2,
  10.         grid3,
  11.         grid4,
  12.         grid5,
  13.         grid6,
  14.         grid7,
  15.         grid8,
  16.         grid9,
  17.         grid10,
  18.         grid11,
  19.         grid12,
  20.         grid13,
  21.         grid14,
  22.         grid15,
  23.         grid16
  24. };

  25. #define FZH_CMD_ON 0x88
  26. #define FZH_CMD_FF 0x80  
  27. #define USAER_CMD_CYCLE_1_16  0
  28. #define USAER_CMD_CYCLE_2_16  1
  29. #define USAER_CMD_CYCLE_4_16  2
  30. #define USAER_CMD_CYCLE_10_16 3
  31. #define USAER_CMD_CYCLE_11_16 4
  32. #define USAER_CMD_CYCLE_12_16 5
  33. #define USAER_CMD_CYCLE_13_16 6
  34. #define USAER_CMD_CYCLE_14_16 7


  35. #define USAER_CMD_SHOW_ON     1
  36. #define USAER_CMD_SHOW_OFF    0


  37. //与硬件连接相关设置
  38. #define START_SRAM    grid1      //是定开始扫描地址地址

  39.        
  40. int8_t fzh_WriteSram(uint8_t cmd1,uint8_t cmd2,uint8_t *str,uint8_t len,uint8_t cmd3 );

  41. int8_t fzh_cmdWrite(uint8_t cmd);
  42. int8_t fzh_cmdWriteDat(uint8_t cmd,uint8_t dat);
  43. /***********************************************************************************************
  44. *
  45. *函数名 :void fzh_SetLightGrade(uint8_t grade,uint8_t onff)
  46. *函数功能描述 :亮度设置
  47. *函数参数 :grade:亮度等级 支持7个等级 参考宏定义USAER_CMD_CYCLE_  onff 0:关闭显示 其它:显示
  48. *函数返回值 :无
  49. *作者 :SY
  50. *函数创建日期 :20211007
  51. *
  52. ***********************************************************************************************/
  53. void fzh_SetLightGrade(uint8_t grade,uint8_t onff);
  54. /***********************************************************************************************
  55. *
  56. *函数名 :void fzh_Init(void)
  57. *函数功能描述 :数码管初始化数码管显示驱动 并设为等亮度 默认显示
  58. *函数参数 :无
  59. *函数返回值 :无
  60. *作者 :SY
  61. *函数创建日期 :20211007
  62. *
  63. ***********************************************************************************************/
  64. void fzh_Init(void);
  65. int8_t fzh_WriteREyeSram( uint8_t cmd1,uint8_t cmd2,uint8_t* str,uint8_t len,uint8_t cmd3 );
  66. #endif
复制代码


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

  1. #include "FZHxxx.h"
  2. #include "intrins.h"
  3. #include "my_iic.h"




  4. uint8_t  fzh_light_grade = 0x8c;

  5. int8_t fzh_WriteSram( uint8_t cmd1,uint8_t cmd2,uint8_t* str,uint8_t len,uint8_t cmd3 ) {
  6.     if( ( len==0 )||( len>16 ) ) {
  7.         return -1;
  8.     }
  9.     I2c_cmdSend( cmd1 );
  10.     I2c_nbByte(cmd2,str,len );
  11.     I2c_cmdSend( cmd3 );
  12.     return 0;
  13. }

  14. /**
  15.         * @brief fzh_WriteREyeSram

  16.         */
  17. //机器人眼睛FZH119顺序
  18. //len 输入 16
  19. int8_t fzh_WriteREyeSram( uint8_t cmd1,uint8_t cmd2,uint8_t* str,uint8_t len,uint8_t cmd3 ) {

  20.     I2c_cmdSend( cmd1 );                //显示方式设置
  21.     I2c_nbREyeByte(cmd2,str,len );
  22.     I2c_cmdSend( cmd3 );                //显示ON,显示亮度
  23.     return 0;
  24. }

  25. int8_t fzh_cmdWrite( uint8_t cmd ) {
  26.     I2c_cmdSend( cmd );
  27.     return 0;
  28. }

  29. int8_t fzh_cmdWriteDat( uint8_t cmd,uint8_t dat ) {
  30.     I2c_nbByte( cmd,&dat,1 );
  31.     return 0;
  32. }


  33. void fzh_SetLightGrade(uint8_t grade,uint8_t onff){
  34.         if(grade>7)grade=7;
  35.         fzh_light_grade = 0;
  36.         if(onff!=0){
  37.              fzh_light_grade = FZH_CMD_ON|grade;
  38.         }else {
  39.            fzh_light_grade = FZH_CMD_FF;
  40.         }
  41. }

  42. void fzh_Init(void){
  43.     I2C_init();
  44.     fzh_SetLightGrade(USAER_CMD_CYCLE_11_16,USAER_CMD_SHOW_ON);
  45. }
复制代码
    1. Hxxx.h"
    2. #include "intrins.h"
    3. #include "my_iic.h"




    4. uint8_t  fzh_light_grade = 0x8c;

    5. int8_t fzh_WriteSram( uint8_t cmd1,uint8_t cmd2,uint8_t* str,uint8_t len,uint8_t cmd3 ) {
    6.     if( ( len==0 )||( len>16 ) ) {
    7.         return -1;
    8.     }
    9.     I2c_cmdSend( cmd1 );
    10.     I2c_nbByte(cmd2,str,len );
    11.     I2c_cmdSend( cmd3 );
    12.     return 0;
    13. }

    14. /**
    15.         * @brief fzh_WriteREyeSram

    16.         */
    17. //机器人眼睛FZH119顺序
    18. //len 输入 16
    19. int8_t fzh_WriteREyeSram( uint8_t cmd1,uint8_t cmd2,uint8_t* str,uint8_t len,uint8_t cmd3 ) {

    20.     I2c_cmdSend( cmd1 );                //显示方式设置
    21.     I2c_nbREyeByte(cmd2,str,len );
    22.     I2c_cmdSend( cmd3 );                //显示ON,显示亮度
    23.     return 0;
    24. }

    25. int8_t fzh_cmdWrite( uint8_t cmd ) {
    26.     I2c_cmdSend( cmd );
    27.     return 0;
    28. }

    29. int8_t fzh_cmdWriteDat( uint8_t cmd,uint8_t dat ) {
    30.     I2c_nbByte( cmd,&dat,1 );
    31.     return 0;
    32. }


    33. void fzh_SetLightGrade(uint8_t grade,uint8_t onff){
    34.         if(grade>7)grade=7;
    35.         fzh_light_grade = 0;
    36.         if(onff!=0){
    37.              fzh_light_grade = FZH_CMD_ON|grade;
    38.         }else {
    39.            fzh_light_grade = FZH_CMD_FF;
    40.         }
    41. }

    42. void fzh_Init(void){
    43.     I2C_init();
    44.     fzh_SetLightGrade(USAER_CMD_CYCLE_11_16,USAER_CMD_SHOW_ON);
    45. }
    复制代码

5.main文件“main.c”
  1. #include <STC15F2K60S2.H>
  2. #include "intrins.h"
  3. #include "FZHxxx.h"

  4. unsigned char fangkuang1[]={0x10,0xFE,0x92,0x92,0xFE,0x92,0x10,0x10,0xFF,0xFD,0x91,0xFD,0x9D,0xFD,0x81,0xFF};
  5. unsigned char fangkuang2[]={0x24,0x7E,0xFF,0xFF,0xFF,0x7E,0x3C,0x18,0x24,0x7E,0xFF,0xFF,0xFF,0x7E,0x3C,0x18};

  6. void Delay5000ms()                //@11.0592MHz
  7. {
  8.         unsigned char i, j, k;

  9.         _nop_();
  10.         i = 36;
  11.         j = 5;
  12.         k = 211;
  13.         do
  14.         {
  15.                 do
  16.                 {
  17.                         while (--k);
  18.                 } while (--j);
  19.         } while (--i);
  20. }




  21. //上电时,地址默认设为C0H,grid1
  22. int main(void){
  23.   fzh_Init();

  24.         while(1){
  25.                 fzh_SetLightGrade(USAER_CMD_CYCLE_14_16,USAER_CMD_SHOW_ON);
  26.                  //0x40:地址自动加一       
  27.                 //grid1:从grid1开始
  28.                 fzh_WriteREyeSram( 0x40,grid1,fangkuang1,16,FZH_CMD_ON|USAER_CMD_CYCLE_11_16);
  29.                 Delay5000ms();       
  30.                 Delay5000ms();
  31.                 fzh_WriteREyeSram( 0x40,grid1,fangkuang2,16,FZH_CMD_ON|USAER_CMD_CYCLE_2_16);
  32.                 Delay5000ms();       
  33.                 Delay5000ms();
  34.                
  35. /*   
  36. //fzh_WriteSram是正常顺序输出的函数,显示乱码
  37.                 fzh_WriteSram( 0x40,grid1,fangkuang1,16,FZH_CMD_ON|USAER_CMD_CYCLE_14_16);
  38.                 Delay5000ms();       
  39.                 Delay5000ms();
  40.                 fzh_WriteSram( 0x40,grid1,fangkuang2,16,FZH_CMD_ON|USAER_CMD_CYCLE_2_16);
  41.                 Delay5000ms();       
  42.                 Delay5000ms();
  43. */
  44. }
  45.         return 1;
  46. }
复制代码






总结

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

110

主题

29

回帖

658

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
658
 楼主| 发表于 2025-5-30 14:35:40 | 显示全部楼层
回复

使用道具 举报

110

主题

29

回帖

658

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
658
 楼主| 发表于 2025-5-30 14:51:30 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

粤ICP备2021173439号-2

GMT+8, 2026-4-14 19:56 , Processed in 0.065577 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表