#define HC_DIO_H digitalWrite(dio, HIGH) #define HC_DIO_L digitalWrite(dio, LOW) #define HC_RCLK_H digitalWrite(rclk, HIGH) #define HC_RCLK_L digitalWrite(rclk, LOW) #define HC_SCLK_H digitalWrite(sclk, HIGH) #define HC_SCLK_L digitalWrite(sclk, LOW) unsigned char LED_BCD[16] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e }; int dio =2; int rclk =3; int sclk =5; void setup() { pinMode(dio, OUTPUT); pinMode(rclk, OUTPUT); pinMode(sclk, OUTPUT); } void loop() { unsigned char dopp =0; for( unsigned char i=0; i < 4; ++i) { if(i ==3) dopp =1; else dopp =0; HC_dio_analyze(i,i,dopp); } } void HC_dio_analyze(char LED_number,unsigned char LED_display,unsigned char LED_dp) { unsigned int HC_DISP = 0,HC_LEDCODE,HC_LEDCODE_temp=0; if(LED_display > 15) LED_display = 0; HC_LEDCODE = LED_BCD[LED_display] ; for(unsigned char i=0; i < 8;++i) { HC_LEDCODE_temp <<=1; if(HC_LEDCODE&0x01) HC_LEDCODE_temp |= 0x01; HC_LEDCODE >>=1; } if(LED_dp) HC_LEDCODE_temp &= 0xfe; HC_DISP = HC_LEDCODE_temp; switch(LED_number) { case 0: HC_DISP |= 0x8000;break; case 1: HC_DISP |= 0x4000;break; case 2: HC_DISP |= 0x2000;break; case 3: HC_DISP |= 0x1000;break; } write_74HC595(HC_DISP); } void write_74HC595( unsigned int dio_a) { char look =0; HC_RCLK_L; HC_SCLK_L; for (;look < 16; ++look) { if(dio_a&0x0001) {HC_DIO_H;} else {HC_DIO_L;} HC_SCLK_H; HC_SCLK_L; dio_a >>= 1; } HC_RCLK_H; }