Как сделать сдвиг с запоминанием?

360
20 декабря 2016, 22:34

Как сделать сдвиг значения? У меня переменная Sifra, и при нажатии на оду из двух клавиш, происходит перезапись значения (то есть нажал раз, у меня 1, и при нажатии на другую клавишу, нужно чтоб было 12, а не 2).

#include <avr/io.h>
#include <avr/delay.h>
#include <stdlib.h>
unsigned char buf = 0;
typedef unsigned char byte;
typedef unsigned long ulong;
ulong array[];
byte led_table[10] =     {0b00000011, 0b10011111, 
                          0b00100101, 0b00001101, 
                          0b10011001, 0b01001001, 
                          0b01000001, 0b00011111, 
                          0b00000001, 0b00001001};
ulong show_data = 0; //Отображаемая цифра
ulong dig_data = 0;
byte dig_num = 0; //Отображаемый разряд

char led;
int i = 0, j = 0, y = 0;
char portState[4] = {0xEF, 0xDF, 0xBF, 0x7F};
char inputState[4] = {0x01, 0x02, 0x04, 0x08};
char mass2[4][3] = {{'1', '2', '3', '4'},
    {'5', '6', '7', '8'},
    {'9', '0', '*', '#'}
};
char spi_transfer(volatile char data)
{
    SPDR = data;                    // Start the transmission
    while (!(SPSR & (1 << SPIF)))   // Wait the end of the transmission
    {};
    return SPDR;                    // return the received byte
}
void timer2()
{
    for (i = 0; i < 4; i++)
    {
        PORTD = portState[i];
        for (j = 0; j < 4; j++)
        {
            if (((PIND & inputState[j]) == 0))
            {
                while ((PIND & inputState[j]) != inputState[j]) {};
                led = mass2[i][j];
            }
        }
    }
}
void show_dig()
{
    //SS=0; //Ни чего не кажем
    PORTB &= ~(1 << 2);
    if (dig_num == 0)
    {
        dig_data =
            show_data; //Если показываем первую цифру обнавляем переменную
        dig_num++;
    }
    spi_transfer(dig_num); //Отправляем байт для отображения разряда
    spi_transfer(led_table[dig_data %
                           10]); //Получаем разряд из dig_data и     отправляем байт с цифрой
    dig_data /= 10;
    dig_num <<= 1; //Смещаем бит для отображения следующего разряда
    //SS=1; //Показываем разряд
    PORTB |= (1 << 2); // включаем
    //for(int i=0;i<10000;i++);
}
int main(void)
{
    PORTB = 0;
    DDRB = 0x2C; //Настраиваем порт для SPI
    ACSR = 0x80; //Отключаем компаратор
    //Включаем SPI
    //Биты будем отправлять LSB-MSB, т.е. от младших к старшим
    SPCR = 0x70;
    SPSR = 0;
    PORTD = 0xFF;
    DDRD = 0xF0;
    while (1)
    {
        timer2();
        show_dig();
        /*if(led == 0b110001)
        {
            int g=5000;
            show_data =g;
            while(1)
            show_dig(show_data--);
            g<<1;
        }
        */
        int Sifra;
        switch (led)
        {
            case 49:
                Sifra = 1;
                break;
            case 50:
                Sifra = 2;
                break;
        }
        show_data = Sifra;
    }
}
READ ALSO
Не полное разложение на множители

Не полное разложение на множители

Написал программу, которая бы разлагала любое целое число на множители

298
Заменить символ &#39;/&#39; на &ldquo;\\&rdquo;

Заменить символ '/' на “\\”

Нужно в строке заменить все символы / на \\Делал следующим образом:

270
Вопрос по шаблонным методам C++ [требует правки]

Вопрос по шаблонным методам C++ [требует правки]

Не получается пройти тестовый вопросПодскажите пожалуйста:

318
Подключение .lib/.dll в Qt проект

Подключение .lib/.dll в Qt проект

Пытаюсь подключить в Qt проект на С++ (никакие собственные библиотеки Qt не используются) библиотеки ole32 и oleaut32 из набора windows SDK

768