|
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++;
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|