极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 29073|回复: 0

esp8266驱动FD1642芯片的四位数码管程序

[复制链接]
发表于 2021-4-12 14:18:27 | 显示全部楼层 |阅读模式
esp8266小巧便宜适合各种DIY,网上买了一片FD1642芯片的四位数码管,橙色的暖色很好看。只是这个芯的的驱动不好找,网上找了几个51用的驱动。在esp8266上很不好用,网上程序各种坑。折腾了一天,参考官网芯片时序图及说明终于改好了能用的驱动。以后慢慢的做个网络对时时钟也不错哈哈。现将相关程序附上:

#define  P_CT_CLK  14 //CLK接口
#define  P_CT_DATA  13 //DATA 接口
const uint8 Lcd_tab[17] =
{0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6, 0xEE, 0x3E, 0x9C, 0x7A, 0x9E, 0x8E}; //共阴极
//Q2接seg A  Q9 接seg G 中间按顺序接
int numb=888;  //测试显示初始数字
void setup()
{
  pinMode(P_CT_DATA, OUTPUT);
  pinMode(P_CT_CLK, OUTPUT);
  digitalWrite(P_CT_DATA, HIGH);
  digitalWrite(P_CT_CLK, LOW);

}

void Nop(uint8 T_Dly)
{
  while (T_Dly--);
  return ;
}

void ct1642_send_data(uint8 ct_dis_data, uint8 ct_com)
{
  uint8 ct_addr;                   //存储数码管位置
  uint8 i;
  switch (ct_com)
  {
    case 0: {
        ct_addr = 0xee; //显示C1位数据 数码管为共阴极,将要点亮的COM置0以显示该COM
        break;
      }

    case 1: {
        ct_addr = 0xed;   //显示C2位数据
        break;
      }
    case 2: {
        ct_addr = 0xeb; //显示C3位数据
        break;
      }
    case 3: {
        ct_addr =  0xe7; //显示C4位数据
        break;
      }
    case 4: {
        ct_addr = 0xff;  //扫描键盘,关闭COM1
        break;
      }
    default: {
        ct_addr = 0xff;
        ct_dis_data = 0x00;
        break;
      }
  }

  for (i = 0; i < 8; i++)            //发送8位地址
  {
    digitalWrite(P_CT_CLK, LOW);
    if ( (ct_addr >> i) & 0x01 )
    {
      digitalWrite(P_CT_DATA, HIGH);
      Nop(1);  //此处根据单片机的指令周期而定
    }
    else
    {
      digitalWrite(P_CT_DATA, LOW);
      Nop(1);
    }
    digitalWrite(P_CT_CLK, HIGH); //上升沿输出一位
    Nop(1);
  }
  //发送两个空位,补足要发送的18位
  digitalWrite(P_CT_CLK, LOW);
  digitalWrite(P_CT_DATA, HIGH);
  Nop(1);
  digitalWrite(P_CT_CLK, HIGH);
  Nop(1);
  digitalWrite(P_CT_CLK, LOW);
  Nop(1);
  digitalWrite(P_CT_CLK, HIGH);
  Nop(1);
  for (i = 0; i < 8; i++) //发送8位数据
  {
    digitalWrite(P_CT_CLK, LOW);
    if ( (ct_dis_data << i) & 0x80)
    {
      digitalWrite(P_CT_DATA, HIGH);
      Nop(1);
    }
    else
    {
      digitalWrite(P_CT_DATA, LOW);
      Nop(1);
    }
    digitalWrite(P_CT_CLK, HIGH);
    Nop(1);
  }
  digitalWrite(P_CT_CLK, HIGH); //输出数据
  digitalWrite(P_CT_DATA, LOW);
  Nop(1);
  digitalWrite(P_CT_DATA, HIGH);
  Nop(1);
  digitalWrite(P_CT_CLK, LOW);
  digitalWrite(P_CT_DATA, LOW);
  Nop(1);
  digitalWrite(P_CT_DATA, HIGH);
  Nop(2);
  return;
}
void FD1642_display(unsigned int k)
{
  ct1642_send_data(Lcd_tab[k % 10], 0);
      k /= 10;
      if (k != 0)
      {
        ct1642_send_data(Lcd_tab[k % 10], 1);
        k /= 10;
        if (k != 0)
        {
          ct1642_send_data(Lcd_tab[k % 10], 2);
          k /= 10;
          if (k != 0)
          {
            ct1642_send_data(Lcd_tab[k % 10], 3);
          }
        }
      }
  }

void loop()
{
  int p=0;
  while(p<5000)
  {
  FD1642_display(numb);
  p++;
  }
numb++;
}
回复

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 23:32 , Processed in 0.046833 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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