SPI,PT6961 и Обугленный мозг

goldpistol
Offline
Зарегистрирован: 01.10.2014

День добрый форумчане.Начну сразу с дела.Имеется семисигментный индикатор на pt6961.Написал я для него скетч 

#include <SPI.h>
//числовое значение
int val=9;
/////////////////

//разряд в котором выведется число
//0 в первом разряде
//2 во втором
//6 в третьем
//14 четвертом
//30 в пятом
//62 в шестом
//126 в седьмом
byte val1=0;
/////////////////

//0xca-dvd-1
  //0xcb-repl-1
  //0xc8-pbc-1
  //0xc0-play-1
  //0xc2-vcd-1
  //0xc4-mp3-1
  //0xc6-pause-1
  //0xc9-dolby-1
  //0xc1-dts-1
  //0xcc-средние горизонтальные  деления-байт от 1 до 255
  //0xca-верхние горизонтальные 1-255
  //0xc8-нижние горизонтальные 1-255
  //0xc6-верхние левые деления 1-255
  //0xc0-нижние левые деления 1-255
  //0xc2-верхние правые деления 1-255
  //0xc4-нижние правые деления 1-255
  //0xc3-первое двоеточие-1-255
  //0xc5-второе двоеточие 1-255

 const int myArray[8]=
{0x00,0xc0,0xc2,0xc4,0xc6,0xc8,0xca,0xcc};

const int myArray1[23][8]={
{0,14,4,4,14,14,4,0},  //LOL
{0,0,2,2,0,0,0,0},//1-1 digit
{0,2,2,0,0,2,2,2},//2-1 digit
{0,0,2,2,0,2,2,2},//3-1 digit
{0,0,2,2,2,0,0,2},//4-1 digit
{0,0,0,2,2,2,2,2},//5-1 digit
{0,2,0,2,2,2,2,2},//6-1 digit
{0,0,2,2,0,0,2,0},//7-1 digit
{0,2,2,2,2,2,2,2},//8-1 digit
{0,0,2,2,2,2,2,2},//9-1 digit
{0,4,6,6,4,4,4,0},//10-1-2 digit
{0,0,6,6,0,0,0,0},
{0,4,6,2,0,4,4,4},
{0,0,6,6,0,4,4,4},
{0,0,6,6,4,0,0,4},
{0,0,2,6,4,4,4,4},
{0,4,2,6,4,4,4,4},
{0,0,6,6,0,0,4,0},
{0,4,6,6,4,4,4,4},
{0,0,6,6,4,4,4,4},
{0,6,6,4,4,6,6,2},
{0,2,6,4,0,2,2,2},
{0,6,6,0,0,6,6,6},
};
const int SSPin = 10;
 
void setup() {
  
 pinMode (A0, INPUT);
  pinMode (SSPin, OUTPUT);
  SPI.begin();
  delay(200);
 
   SPI.setBitOrder(LSBFIRST);
   SPI.setDataMode(SPI_MODE0);
}
 
void loop() {
  digitalWrite(SSPin,LOW);
  SPI.transfer(0b00000011); //command 1
  digitalWrite(SSPin,HIGH);
   
  digitalWrite(SSPin,LOW);
  SPI.transfer(0b01000000); //command 2
  digitalWrite(SSPin,HIGH);
   
  digitalWrite(SSPin,LOW);
    SPI.transfer(0xC0);  //command 3
  for(int i=0; i<=13; i++){
      SPI.transfer(0x00);
  }
  digitalWrite(SSPin,HIGH);
   
  digitalWrite(SSPin,LOW);  //command 4
  SPI.transfer(0x8F);
  digitalWrite(SSPin,HIGH);
   
    for(int j=1;j<8; j++){
     
      digitalWrite(SSPin,LOW);
      
      SPI.transfer(myArray[1]);
      if(myArray1[val][1]!=0)
      {
      SPI.transfer(myArray1[val][1]+val1);
      }else{
        SPI.transfer(myArray1[val][1]); }
        
  
      digitalWrite(SSPin,HIGH);
      
      digitalWrite(SSPin,LOW);
      
      SPI.transfer(myArray[2]);
      if(myArray1[val][2]!=0)
      {
      SPI.transfer(myArray1[val][2]+val1);
      }else{
        SPI.transfer(myArray1[val][2]); }
      
      digitalWrite(SSPin,HIGH);
      
      digitalWrite(SSPin,LOW);
      
      SPI.transfer(myArray[3]);
       if(myArray1[val][3]!=0)
      {
      SPI.transfer(myArray1[val][3]+val1);
      }else{
        SPI.transfer(myArray1[val][3]); }
      
      digitalWrite(SSPin,HIGH);
      
      
      digitalWrite(SSPin,LOW);
      
      SPI.transfer(myArray[4]);
      if(myArray1[val][4]!=0)
      {
      SPI.transfer(myArray1[val][4]+val1);
      }else{
        SPI.transfer(myArray1[val][4]); }
   
      digitalWrite(SSPin,HIGH);
      
      
      digitalWrite(SSPin,LOW);
      
      SPI.transfer(myArray[5]);
      if(myArray1[val][5]!=0)
      {
      SPI.transfer(myArray1[val][5]+val1);
      }else{
        SPI.transfer(myArray1[val][5]); }
      
      digitalWrite(SSPin,HIGH);
      
      
      digitalWrite(SSPin,LOW);
      
      SPI.transfer(myArray[6]);
      if(myArray1[val][6]!=0)
      {
      SPI.transfer(myArray1[val][6]+val1);
      }else{
        SPI.transfer(myArray1[val][6]); }
      digitalWrite(SSPin,HIGH);
      
      
      digitalWrite(SSPin,LOW);
      
      SPI.transfer(myArray[7]);
      if(myArray1[val][7]!=0)
      {
      SPI.transfer(myArray1[val][7]+val1);
      }else{
        SPI.transfer(myArray1[val][7]); }
      digitalWrite(SSPin,HIGH);
     
     delay(20);
   
    }
}

Суть скетча такова,он выводит число со значения val в первый разряд.от 1 до 9.(на остальные не обращайте внимания,это тестовые.).Но если val1 выставлять по коментариям то это число на дисплее будет менять разряд.

Так вот задача- дано чило 982(значение может быть любым); мне нужно разобрать на три отдельных числа и как то указать коду что 9 надо вывести в первом разряде,8 во втором и 2 в третьем.Значений может быть 9999999 (ибо цифр ибо разрядов 7); Как можно это осуществить?

 

goldpistol
Offline
Зарегистрирован: 01.10.2014

Я так догадываюсь рыть нужно в сторону цикла..Но так как знаний пока маловато то не пойму как.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

вот для примера. если разберешься то сделаешь то что хочешь

здесь разбивка числа и передача его на дисплей. твой случай в принципе

void vyvod(int skor){
  int temp=skor;                         // переменная для хранения
  int c4=temp%10;                        // четвертая цифра скорости 
  temp/=10;
  int c3=temp%10;                        // третья цифра скорости 
  temp/=10;
  int c2=temp%10;                        // вторая цифра скорости 
  temp/=10;
  int c1=temp%10;                        // первая цифра скорости
  simb16x32(c1,7,2);
  simb16x32(c2,27,2);
  simb16x32(c3,47,2);
  simb10x16(c4,74,2);
}

 

goldpistol
Offline
Зарегистрирован: 01.10.2014

Спасибо огромное!)Прийду домой буду все тем же тыком рыть)

goldpistol
Offline
Зарегистрирован: 01.10.2014

балин...чутка не подходит...короче выходит так что если четырех значное передавать,то выведет на дисплей четырех значное число...Но если допустим передать один то выведет 0001...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да выведет. но в чем проблема поставить условие если равно нулю то не выводить для первых 3 цифр. и получишь на дисплее 1

goldpistol
Offline
Зарегистрирован: 01.10.2014

дак дело в том что нужно что значение 0 тоже выводило.там же в нулевой ячейке массива значение цифры 0

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

нифига не понял. нарисуй картинку

goldpistol
Offline
Зарегистрирован: 01.10.2014

Я говорю не выводить 0 я тоже не могу!Потому что если переменная равна нулю то выводит ноль.А если я поставлю то условие то ноль в числах например 100 не будет выводить...
нужно так чтоб не ноль а совсем переменная не создавалась если нет...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

так сделай условие сложнее. провека если при этом разряд выше не навен нулю и тд

goldpistol
Offline
Зарегистрирован: 01.10.2014

все гениальное просто.как посчитать можно количество знаков в числе?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
if(val>=0 && val <10)     значит 1 знак
if(val>=10 && val <100)   значит 2 знака
if(val>=100 && val <1000) значит 3 знака

 

goldpistol
Offline
Зарегистрирован: 01.10.2014

точняк))Сенкс!)Буду разбираться)
 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

мог бы и сам догадаться)

goldpistol
Offline
Зарегистрирован: 01.10.2014

Да блин после php этот язык для меня не выносим пока)))Только учусь)