Помогите понять в чём проблема. Программа работает в Протеусе и в Студио как надо а на железе не работает. Где проблема я вижу но немогу понять почему так происходит, и соответственно не могу её решить. Контроллер Мега 162. Вот код.
/*------------------------------------------------
Функция опроса клавиатуры
------------------------------------------------*/
uchar keyscan(void) //
{uchar cord_h,cord_l; //
DDRC =0xf0;
PORTC = 0x0f; //
cord_h = PINC & 0x0f; //Опросить младший полубайт
if(cord_h != 0x0f) //
{delay(100); //
if(cord_h != 0x0f)
{cord_h = PINC & 0x0f; //
//PORTA=cord_h; //до сих пор всё идёт нормально
DDRC = 0x0f;
PORTC = 0xf0; //
cord_l = PINC & 0xf0; //опросить старший полубайт
//а вот тут уже не нормально. все значения старшего полубайта инверсные
//вместо E;D;B;7 выходит 1;2;4;8 такое впечатление что команда PORTC=0xf0
//не отрабатывается.
//PORTA=cord_l; это для просмотра что пришло с порта С
return(cord_h + cord_l);//вернуть сумму двух полубайтов . при нажатии клавиши должны получатся 16
//комбинаций из 4 значений в полубйтах(EE,ED,EB,E7........77)
Speak();
}
}
return(0xff); //
}
Раздел: AVR
/*------------------------------------------------
Функция опроса клавиатуры
------------------------------------------------*/
uchar keyscan(void) //
{uchar cord_h,cord_l; //
DDRC =0xf0;
PORTC = 0x0f; //
cord_h = PINC & 0x0f; //Опросить младший полубайт
if(cord_h != 0x0f) //
{delay(100); //
if(cord_h != 0x0f)
{cord_h = PINC & 0x0f; //
//PORTA=cord_h; //до сих пор всё идёт нормально
DDRC = 0x0f;
PORTC = 0xf0; //
cord_l = PINC & 0xf0; //опросить старший полубайт
//а вот тут уже не нормально. все значения старшего полубайта инверсные
//вместо E;D;B;7 выходит 1;2;4;8 такое впечатление что команда PORTC=0xf0
//не отрабатывается.
//PORTA=cord_l; это для просмотра что пришло с порта С
return(cord_h + cord_l);//вернуть сумму двух полубайтов . при нажатии клавиши должны получатся 16
//комбинаций из 4 значений в полубйтах(EE,ED,EB,E7........77)
Speak();
}
}
return(0xff); //
}
Раздел: AVR