eddiewwm 发表于 2018-10-26 17:28:34

8F328P-U 與 TM1637 LED數碼管驅動程序

TM1637 is a multi-segment(8*6) LED driver with 8*2 scan keys. a)      數據輸入的開始條件是CLK 為高電平時,DIO 由高變低b)      在輸入時,當CLK 是高電平時,DIO 上的信號必須保持不變;只有CLK 上的時鐘信號為低電平時,DIO 上的信號才能改變c)      結束條件是CLK 為高時,DIO 由低電平變為高電平
KeyS16S15S14S13S12S11S10S9 S8 S7 S6 S5 S4 S3 S2 S1
MatriceSG8
K1SG8
K2SG4
K2SG4
K1SG7
K1SG7
K2SG3
K2SG3
K1SG6
K1SG6
K2SG2
K2SG2
K1SG5
K1SG5
K2SG1
K2SG1
K1
hexF0E8ECF4F1E9ED F5F2 EAEEF6F3EBEFF7


Command:

Test Mode0x4801001000test mode (internal use)
Normal Mode0x4001000000the byte sent below is a datum towards thedisplay, with the automatic increase in destination addresses
0x4401000100the byte sent below is a datum towardsthe display, with the fixed destination addresses
0x4201000010read the input situation
Display Control0x8010000000display off
0x88-0x8F10001000-100001111display on with brightness control, 7step

/* Program for Display on TM1637 */
const int clock = 3;const int data = 2;/*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/uint8_t digits[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };

void setup(){Serial.begin(115200);pinMode(clock, OUTPUT);pinMode(data, OUTPUT);
start();writeValue(0x8c);stop();
// clear displaywrite(0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
}
void loop(){unsigned int temp = keyscan();Serial.println(temp, HEX);write(digits, digits, digits, digits, digits, digits);}
void write(uint8_t first, uint8_t second, uint8_t third, uint8_t fourth, uint8_t fifth, uint8_t sixth){start();writeValue(0xc0);writeValue(first);writeValue(second);writeValue(third);writeValue(fourth);writeValue(fifth);writeValue(sixth);stop();}
void start(void){digitalWrite(clock, HIGH); //send start signal to TM1637digitalWrite(data, HIGH);delayMicroseconds(5);
digitalWrite(data, LOW);digitalWrite(clock, LOW);delayMicroseconds(5);}
void stop(void){digitalWrite(clock, LOW);digitalWrite(data, LOW);delayMicroseconds(5);
digitalWrite(clock, HIGH);digitalWrite(data, HIGH);delayMicroseconds(5);}
bool writeValue(uint8_t value){for (uint8_t i = 0; i < 8; i++){    digitalWrite(clock, LOW);    delayMicroseconds(5);    digitalWrite(data, (value & (1 << i)) >> i);    delayMicroseconds(5);    digitalWrite(clock, HIGH);    delayMicroseconds(5);}
// wait for ACKdigitalWrite(clock, LOW);delayMicroseconds(5);
pinMode(data, INPUT);
digitalWrite(clock, HIGH);delayMicroseconds(5);
bool ack = digitalRead(data) == 0;
pinMode(data, OUTPUT);
return ack;}

uint8_t keyscan(void){uint8_t rekey;start();writeValue(0x42);
delayMicroseconds(2);pinMode(data, INPUT);
for (uint8_t i = 0; i < 8; i++){    digitalWrite(clock, LOW);
    rekey = rekey >> 1;
    digitalWrite(clock, HIGH);    if (digitalRead(data))    {      rekey = rekey | 0x80;    }    else    {      rekey = rekey | 0x00;
    }
    delayMicroseconds(5);}
pinMode(data, OUTPUT);
digitalWrite(data, LOW);// digitalWrite(clock, LOW);
// wait for ACKdigitalWrite(clock, LOW);delayMicroseconds(5);
pinMode(data, INPUT);
digitalWrite(clock, HIGH);delayMicroseconds(5);
pinMode(data, OUTPUT);
delayMicroseconds(5);stop();return rekey;}
void writeByte(int8_t wr_data){uint8_t i, count1;for (i = 0; i < 8; i++) //sent 8bit data{    digitalWrite(clock, LOW);    if (wr_data & 0x01)digitalWrite(data, HIGH); //LSB first    else digitalWrite(data, LOW);    wr_data >>= 1;    digitalWrite(clock, HIGH);
}digitalWrite(clock, LOW); //wait for the ACKdigitalWrite(data, HIGH);digitalWrite(clock, HIGH);pinMode(data, INPUT);while (digitalRead(data)){    count1 += 1;    if (count1 == 200) //    {      pinMode(data, OUTPUT);      digitalWrite(data, LOW);      count1 = 0;    }    pinMode(data, INPUT);}pinMode(data, OUTPUT);
}


页: [1]
查看完整版本: 8F328P-U 與 TM1637 LED數碼管驅動程序