Цитата(upc2 @ Apr 2 2007, 07:56)

С этой схемой все в порядке , но здесь у вас режим опроса.Наверно тут и глюк.
Попробуйте использовать предназначенные для этого выводы синхронного приема RB1 и RB2.
Если это сложно , то лучше CLK подать на вывод внешнего прерывания RB0.
Причина думаю в том, что обработка LCD занимает много времени и пропускается следующее
нажатие кнопки.Это мое предположение.Вашей программы я не видел.
Програма написана в среде MikroC v 6.2. Используются встроенные функции для обмена с клавиатурой и LCD, так что вмешаться в их работу нет возможности.
Замечу, что все работает прекрасно без U3, R3, R4; так что предположительно проблемы с программой нет. Так бы оно и работало, если бы не одно "Но": при нажатии на CapsLock или NumLock все виснет. (хотя не на всех клавиатурах). Вероятно, ПИК вмешивается в обмен между клавиатурой и РС. Для устранения этого влияния я и ввел U3, R3, R4. Теперь ничего не виснет, но и кнопки опознаются крайне неуверенно.
Программу выкладываю
Код
char Temp;
char LangChangeFlag=0;
char BackSpaceFlag=0;
char Up [16]= " BSIU ";
char Down [16]= " Automation ";
// char Up [16];
// char Down [16];
char value;
char special;
char pressed;
char i;
char j;//debug
char Lang;
enum Loc {Lat=0,Rus=255};
// char *text = "mikroElektronika";
#define Lang_Indicator PORTB.F0
//PS/2
#define Data 1
#define Clock 0
//LCD Lcd_Config (&PORTB,2,3,1,7,6,5,4) ; //rs,en,wr,d7,d6,d5,d4
#define rs 2
#define en 3
#define wr 1
#define d7 7
#define d6 6
#define d5 5
#define d4 4
void Ruschar (void)
{
if (value == 'a') {value = 228; return;}
if (value == 'A') {value = 228;return;}
if (value == 'b') {value = 184;return;}
if (value == 'B') {value =165;return;}
if (value == 'c') {value =99;return;}
if (value == 'C') {value =67;return;}
if (value == 'd') {value =179;return;}
if (value == 'D') {value =66;return;}
if (value == 'e') {value =121;return;}
if (value == 'E') {value =169;return;}
if (value == 'f') {value =97;return;}
if (value == 'F') {value =65;return;}
if (value == 'g') {value =190;return;}
if (value == 'G') {value =168;return;}
if (value == 'h') {value =112;return;}
if (value == 'H') {value =80;return;}
if (value == 'i') {value =193;return;}
if (value == 'I') {value =172;return;}
if (value == 'j') {value = 111;return;}
if (value == 'J') {value = 79;return;}
if (value == 'k') {value = 187;return;}
if (value == 'K') {value = 167;return;}
if (value == 'l') {value = 227;return;}
if (value == 'L') {value = 224;return;}
if (value == 'm') {value = 196;return;}
if (value == 'M') {value = 98;return;}
if (value == 'n') {value = 191;return;}
if (value == 'N') {value = 84;return;}
if (value == 'o') {value = 230;return;}
if (value == 'O') {value = 226;return;}
if (value == 'p') {value = 183;return;}
if (value == 'P') {value = 164;return;}
if (value == 'q') {value = 185;return;}
if (value == 'Q') {value = 166;return;}
if (value == 'r') {value = 186;return;}
if (value == 'R') {value = 75;return;}
if (value == 's') {value = 195;return;}
if (value == 'S') {value = 174;return;}
if (value == 't') {value = 101;return;}
if (value == 'T') {value = 69;return;}
if (value == 'u') {value = 180;return;}
if (value == 'U') {value = 161;return;}
if (value == 'v') {value = 188;return;}
if (value == 'V') {value = 77;return;}
if (value == 'w') {value = 229;return;}
if (value == 'W') {value = 225;return;}
if (value == 'x') {value = 192;return;}
if (value == 'X') {value = 171;return;}
if (value == 'y') {value = 189;return;}
if (value == 'Y') {value = 72;return;}
if (value == 'z') {value = 199;return;}
if (value == 'Z') {value =177;return;}
///////////////////////////////
if (value == '[') {value = 120;return;} //x
if (value == '{') {value =88;return;}
if (value == ']') {value = 194;return;} //ъ
if (value == '}') {value = 173;return;}
if (value == ';') {value = 182;return;} //ж
if (value == ':') {value = 163;return;}
if (value == 39) {value = 0xC5;return;} //э
if (value == 34) {value = 0xAF;return;} //
if (value == ',') {value = 178;return;} //б
if (value == '<') {value = 160;return;}
if (value == '.') {value = 198;return;} //ю
if (value == '>') {value = 176;return;}
if (value == '/') {value = 46;return;} //.
if (value == '?') {value = 44;return;} //,
//if (value == '\') {value = 92;return;} // \ same
if (value == '|') {value =0x2f;return;} // /
if (value == '`') {value = 0xB5;return;}//ё
if (value == '~') {value =0xA2;return;}
if (value == '@') {value = '"';return;}// " (2)
if (value == '#') {value = 0xCC;return;}// № (3)
if (value == '$') {value = ';';return;}// ; (4)
if (value == '^') {value = ':';return;}// : (6)
if (value == '&') {value = '?';return;}// ? (7)
}
void main()
{
//j=0;
OPTION_REG = 0b00011111;
TRISB=0;// output
Lcd_Config (&PORTB,rs,en,wr,d7,d6,d5,d4) ; //rs,en,wr,d7,d6,d5,d4
lcd_cmd(lcd_clear);
//__set_configuration_word(0xff46);
// b'1111111101000110'
//FOSC0 = 0 crystal generator
//FOSC1 = 1 crystal generator
//WDTE = 1 WDT enabled
//PWRTE = 0 PWRT enabled
//FOSC2 = 0 crystal generator
//MCLRE = 0 internal MCLR
//BODEN = 1 BOR enabled
//LVP = 0 RB4/PGM is I/O pin
//CPD = 1 EEPROM protect disabled
//absent =1
//CP0 = 1 Chip Protect DEactivated
//CP1 = 1 Chip Protect DEactivated
//CP0 = 1 Chip Protect DEactivated
//CP1 = 1 Chip Protect DEactivated
//?
//?
Up [15]= ' ';
Down [15]= ' ';
Ps2_Config (&PORTA,Clock,Data); //clock, data
while (1)
{
//Reciever DISABLE
RCSTA = 0;
T2CON = 0x00;/
CMCON = 0x07;
CCP1CON = 0; //disable PWM module
INTCON = 0x00;
//bank1
TRISA = 0b11000011; //1=input; 0=output
TRISB=0;// //all pins are out
PIE1 = 0;//Interrupt from peripherie is disabled
VRCON = 0; //Vref shut down
//Transmitter DISABLE
TXSTA =0;
// Needed do reinit often
OPTION_REG = 0b00011111;
if (Ps2_Key_Read(&value, &special, &pressed)) //keyboard read
{
if ( value ==34 )
{
if (!LangChangeFlag)
{
LangChangeFlag=1;
if (lang==rus) lang=lat;
else lang=rus;
}
}
else
{
LangChangeFlag=0;
}
//backspace
if ( pressed && value ==16)
{
if (!BackSpaceFlag)
{
BackSpaceFlag=1;
Special=1;
Temp= Up[15];//store
for (i=15;i>0;i--)
{
Up[i]=Up[i-1]; //shift right
Down[i]=Down[i-1]; //shift right
}
Up[0]=' '; //clear
Down[0]=Temp; //restore
}
}
else
{
BackSpaceFlag=0;
}
if (pressed && !special && value>31 && value<=127)
{
Temp= Down[0]; //store first letter in second row
for (i=0;i<15;i++)
{
Up[i]=Up[i+1]; //shift left
Down[i]=Down[i+1]; //shift left
}
Up[15]=Temp; //restore last letter in first row
if (lang==rus)
{
Ruschar(); //russkij
Lang_Indicator=0;
}
else
{
Lang_Indicator=1;
}
Down [15] = value ; // current letter (last place in the second row)
}
lcd_cmd(lcd_first_row);
for (i=0;i<16;i++)
{
lcd_chr_cp (Up[i]); //print first row
// Delay_ms (5);
}
lcd_cmd(lcd_second_row);
for (i=0;i<16;i++)
{
lcd_chr_cp (Down[i]); //print second row
//Delay_ms (5);
}
}
a:
// temp = 'Ц';
vdelay_ms (10);
// temp=Rus;
//reset watcdogtimer
asm CLRWDT;
}
}