static unsigned char d2led[]={0x3F,0x6,0x5b,0x4F,0x66,0x6D,0x7D,0x7,0x7f,0x6F};
int main(void)
{
//Проверяю терминал, всё нормально показывает
USART_putstring("POEHALI! ");
_delay_ms(100);
//Для проверки дисплея показываю числа, всё отображается нормально.
int i;
for (i=0; i<10; i++)
{
upd7segment(i);
_delay_ms(500);
}
while(1)
{
}
}
ISR(USART_RXC_vect)
{
char ReceivedByte;
ReceivedByte = UDR;
uint8_t i = 0;
i = (i<<8) + ReceivedByte;
// надо показать полученное число (0...9) на дисплее. Ничего не показывает.
upd7segment(i);
// хотя назад в ком уходит правильное
UDR = i;
}
inline void upd7segment(int16_t number)
{
//if((number<0)||(number>9)) number=0;
PORTB=d2led[number];
}
Я не знаю, как работает эта фигня (да ещё с виртуальным терминалом), но предполагаю, что отсылает она символы. Так что отобразить надо принятый байт минус 32, тогда на символах 0-9 получите число.
Функция atoi (ASCII to integer, из ASCII в целое число) в языке программирования Си используется для приведения (конвертации) строки в числовой вид.
int atoi(const char *str)
Аргумент str означает строку, представленную в виде массива символов, содержащего символы знакового целого (тип int) числа. Строка должна быть нуль-терминированной, то есть оканчиваться символом «\0». Когда atoi() получает строку без числовых последовательностей, то в этом случае возвращает ноль (0). Если строка содержит корректную последовательность цифр, представляющих число 0, то также возвращается 0, при этом по возвращаемому числу невозможно определить содержит ли строка корректное число или нет.
ISR(USART_RXC_vect)
{
char ReceivedByte;
ReceivedByte = UDR; // Fetch the received byte value into the variable "ByteReceived"
uint8_t i = 0;
i=ReceivedByte-32;
UDR = ReceivedByte;
PORTB=i;
}
и в терминале набираю от 0 до 9, то портБ принимает такие значения