本帖最后由 conjee 于 2013-6-1 13:10 编辑
friskit 发表于 2013-6-1 09:33 
总线))))
可以使用595芯片,能省下5个IO口,
效果图如下:
用595芯片后程序如下:
- #include <avr/eeprom.h>
- #define EEPROM_write(address, var) eeprom_write_block((const void *)&(var), (void *)(address), sizeof(var))
- #define EEPROM_read(address, var) eeprom_read_block((void *)&(var), (const void *)(address), sizeof(var))
- #define uchar unsigned char
- #define PinA 2 //中断0
- #define led1 1
- #define led2 3
- #define led3 4
- #define led4 5
- #define da 6
- #define db 7
- #define dc 8
- #define DataOUT 8
- #define DataSTB 9
- #define DataCLK 10
- #define dd 9
- #define de 10
- #define df 11
- #define dg 12
- #define dp 13
- int subPin = A1;
- int keyValue = 1024;
- long count ;
- unsigned long time = 0;
- uchar data[11] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x80};
- // the setup routine runs once when you press reset:
- void setup() {
- pinMode(PinA,INPUT);
-
- // for(int i = 0; i < 4; i++)
- // disValue.dchar[i] = EEPROM.read(i);
- EEPROM_read(0, count);
- // count = 0;
- // EEPROM_write(0, count);
- attachInterrupt(0, runCount, FALLING); //设置触发,中断号0,即数字2口
-
- pinMode(led1, OUTPUT);
- pinMode(led2, OUTPUT);
- pinMode(led3, OUTPUT);
- pinMode(led4, OUTPUT);
-
- digitalWrite(led1, HIGH);
- digitalWrite(led2, HIGH);
- digitalWrite(led3, HIGH);
- digitalWrite(led4, HIGH);
-
- for(int i=6; i < 14; i++){
- pinMode(i, OUTPUT);
-
- }
-
- ledTest();
-
- }
- void runCount() //触发函数
- {
- if ((millis() - time) > 150) //防抖动处理
- {
-
- keyValue = analogRead(subPin);
-
- if( keyValue < 500){
- count--;
- keyValue = 1023;
- }else{
- count ++;
- }
- //for(int i = 0; i < 4; i++) {
- // EEPROM.write(i, *dpointer);
- EEPROM_write(0, count);
- // dpointer++;
- // }
-
- }
-
- time = millis();
- }
- //led test
- void ledTest(){
- digitalWrite(led1, LOW);
- digitalWrite(led2, LOW);
- digitalWrite(led3, LOW);
- digitalWrite(led4, LOW);
-
- for(int i=0; i < 11; i++){
- ledOut(led1, i );
- delay(200);
- }
- selecLed(led1);
- ledOut(led1, 0 );
- }
- //select LED
- void selecLed(int led){
- for(int i=1; i < 5; i++){
- int t = i>1?i+1:1;
- if( t == led){
- digitalWrite(t, LOW);
- }else {
- digitalWrite(t, HIGH);
- }
- }
- }
- //led out
- void ledOut(int ledSelect, int td){
- // digitalWrite(ledSelect, LOW);
- int set = 0x01;
-
- /** not use 595
- for(int i=6; i<14; i++){
- int dis =data[td] & set;
- digitalWrite(i, dis);
- set = set<<1;
- } */
-
- //use 595
-
- // int testData = 0x9f;
- // uchar testData = 0x06;
-
- //testData =~testData;
-
- for(int i=0; i<8; i++){
- digitalWrite(DataCLK, 0);
-
- uchar dis =data[td] & set;
-
- digitalWrite(DataOUT, dis);
-
- set = set<<1;
-
- digitalWrite(DataCLK,1);
-
- }
- digitalWrite(DataSTB, 0); //595刷新
- digitalWrite(DataSTB, 1);
- }
- //led display
- void ledDisplay(unsigned long d){
- int d1 = d%10;
- int d2 = (d/10)%10;
- int d3= (d/100)%10;
- int d4= d/1000;
- if(d<10){
- selecLed(led1);
- ledOut(led1, d1);
- }else if(d >=10 && d < 100){
- selecLed(led1);
- ledOut(led1, d1);
- delay(10);
- selecLed(led2);
- ledOut(led2, d2);
- delay(10);
- }else if(d >=100 && d < 1000){
- selecLed(led1);
- ledOut(led1, d1);
- delay(7);
- selecLed(led2);
- ledOut(led2, d2);
- delay(8);
- selecLed(led3);
- ledOut(led3, d3);
- delay(9);
- }else if(d >=1000 && d < 10000){
- selecLed(led1);
- ledOut(led1, d1);
- delay(5);
- selecLed(led2);
- ledOut(led2, d2);
- delay(6);
- selecLed(led3);
- ledOut(led3, d3);
- delay(7);
- selecLed(led4);
- ledOut(led4, d4);
- delay(8);
- }
-
- }
- // the loop routine runs over and over again forever:
- void loop() {
- ledDisplay(count);
-
-
- }
复制代码 |