Помогите сократить запись (очень простой вопрос)
- Войдите на сайт для отправки комментариев
Втр, 17/11/2015 - 20:29
Товарищи, пожалуйста, помогите сократить запись!
Задача, отправить 4 байта в регистры, сейчас я отправляю таким образом:
void Write_MBI5026(byte HD, byte HS, byte MD, byte MS) { unsigned char i; digitalWrite(MBI5026_pinLE,LOW); // for(i=8;i>=1;i--) { digitalWrite(MBI5026_pinCLK,LOW); digitalWrite(MBI5026_pinSDI,MS&0x80); // MS = MS<<1; // digitalWrite(MBI5026_pinCLK,HIGH); } for(i=8;i>=1;i--) { digitalWrite(MBI5026_pinCLK,LOW); digitalWrite(MBI5026_pinSDI,MD&0x80); // MD = MD<<1; // digitalWrite(MBI5026_pinCLK,HIGH); } for(i=8;i>=1;i--) { digitalWrite(MBI5026_pinCLK,LOW); digitalWrite(MBI5026_pinSDI,HS&0x80); // HS = HS<<1; // digitalWrite(MBI5026_pinCLK,HIGH); } for(i=8;i>=1;i--) { digitalWrite(MBI5026_pinCLK,LOW); digitalWrite(MBI5026_pinSDI,HD&0x80); // HD = HD<<1; // digitalWrite(MBI5026_pinCLK,HIGH); } digitalWrite(MBI5026_pinLE,HIGH); digitalWrite(MBI5026_pinLE,LOW); }
Все работает прекрасно, но уж шибко избыточно, но с другой стороны очень даже понятно как. Полный код тестовой программы такой:
byte digits[16]={63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113}; unsigned char j, k=0; // не тот формат к, потом поменяю byte D1, D2, D3, D4; long previousMillis = 0; // will store last time LED was updated // the follow variables is a long because the time, measured in miliseconds, // will quickly become a bigger number than can be stored in an int. long interval = 200; // interval at which to update (milliseconds) int MBI5026_pinOE = 6; // MBIpin21. When (active) low, the output drivers are enabled; when high, all output drivers are turned OFF (blanked). int MBI5026_pinCLK = A1; // MBIpin3. Clock input terminal for data shift on rising edge int MBI5026_pinSDI = A2; // MBIpin2. Serial-data input to the shift register int MBI5026_pinLE = A3; // MBIpin4. Data strobe. Serial data is transferred to the output latch when LE is high. The data is latched when LE goes low. void Write_MBI5026(byte HD, byte HS, byte MD, byte MS) { unsigned char i; digitalWrite(MBI5026_pinLE,LOW); // for(i=8;i>=1;i--) { digitalWrite(MBI5026_pinCLK,LOW); digitalWrite(MBI5026_pinSDI,MS&0x80); // MS = MS<<1; // digitalWrite(MBI5026_pinCLK,HIGH); } for(i=8;i>=1;i--) { digitalWrite(MBI5026_pinCLK,LOW); digitalWrite(MBI5026_pinSDI,MD&0x80); // MD = MD<<1; // digitalWrite(MBI5026_pinCLK,HIGH); } for(i=8;i>=1;i--) { digitalWrite(MBI5026_pinCLK,LOW); digitalWrite(MBI5026_pinSDI,HS&0x80); // HS = HS<<1; // digitalWrite(MBI5026_pinCLK,HIGH); } for(i=8;i>=1;i--) { digitalWrite(MBI5026_pinCLK,LOW); digitalWrite(MBI5026_pinSDI,HD&0x80); // HD = HD<<1; // digitalWrite(MBI5026_pinCLK,HIGH); } digitalWrite(MBI5026_pinLE,HIGH); digitalWrite(MBI5026_pinLE,LOW); } void setup() { pinMode(MBI5026_pinOE, OUTPUT); pinMode(MBI5026_pinCLK, OUTPUT); pinMode(MBI5026_pinSDI, OUTPUT); pinMode(MBI5026_pinLE, OUTPUT); } void loop() { unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { // save the last time you blinked the LED previousMillis = currentMillis; k=k+1; } D1=k /1000%10; D2=k /100%10; D3=k /10%10; D4=k %10; Write_MBI5026(digits[D2], digits[D1], digits[D4], digits[D3]); analogWrite(MBI5026_pinOE,128); //динамически разрешаем работу разным регистрам, для уменьшения потребления }
Он с ошибкой, необходимо поменять переменную, а то в текущую все время не влезает (только до 244 счет, а потом обнуление), но меня это сейчас не беспокоит… потом это будут часы с градусником …
Отдельная четырежды вызываемая функция, отправляющая 1 байт?
4 байта в лонг. один цикл на 32 прохода выпихивает из лонга. А это вобще конкурс какойто? Призы будут?
Отдельная четырежды вызываемая функция, отправляющая 1 байт?
ну опыта и знаний пока не хватает, я не могу понять как из
взять байты по очереди, конечно, можно еще один for и 4 раза if и менять значение переменной, но что-то мне это не очень нравится, может есть способ изящнее?
кейс - тоже думаю не изяшнее будет
4 байта в лонг. один цикл на 32 прохода выпихивает из лонга. А это вобще конкурс какойто? Призы будут?
чего-то очень много места занимает это лонг...
не, не конкурс, просто спросил, нужно же делать все красиво... :)
Только я не понял, откуда взялся массив digits[].
Аналог того, что в первом посте:
Только я не понял, откуда взялся массив digits[].
массив digits[] ето просто набор отображающий цифры - указатель на сегменты индикатора...
я немного эксперементировал с несколькими кодами и в итоге, поменял названия переменных, в первом посте вставка кода 2 строка 2