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++;
}
|