Z ciekawości przetestowałem twój program i faktycznie objawy są takie jak opisałeś. W czasie szukania przyczyn takiego działania zakomentowałem jeden warunek w pętli while i dioda z drugiego warunku zaczęła działać prawidłowo. To nasunęło mi odpowiedź dlaczego jeden warunek działa dobrze a dwa już nie.
Załóżmy, że wciśnięty jest klawisz 1 a program zaczyna sprawdzać drugi warunek w pętli while. Po wejściu do funkcji wykona się pierwszy warunek if
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Zmienna wynik zostanie ustawiona na jeden i tą wartość zwróci funkcja.
Po wyjściu z funkcji ta wartość zostanie przyrównana do 2 (bo program sprawdzał drugi warunek w while).
Ten if się nie wykona bo funkcja zwróciła wartość 1.
Chwilę później program zacznie sprawdzać pierwszy warunek w while. Wewnątrz funkcji, pierwszy if już nie będzie spełniony bo chwilę wcześnie zmienna key_lock1 została ustawiona na 1. Klawisz jest nadal wciśnięty więc żaden warunek wewnątrz funkcji nie będzie spełniony i funkcja zwróci 0.
A dlaczego zero skoro wcześniej zmienna wynik została ustawiona na 1? Ano dlatego, że zmienna wynik to zmienna lokalna, której wartość jest tracona po wyjściu z funkcji.
W poprzednim wywołaniu funkcji jej wartość została ustawiona na 1. I ta wartość została zwrócona. Jednak po ponownym wywołaniu funkcji zmienna wynik została utworzona na nowo i zainicjowana wartością 0. Skoro żaden warunek wewnątrz funkcji się nie wykona to funkcja zwróci 0. Ta wartość zostanie porównana z wartością równą 1 (pierwszy warunek w while).
I tym sposobem żadna dioda nie zmieni swego stanu.
Program dobrze zadziała jeśli podczas wciśnięcia któregoś z klawiszy najpierw zostanie sprawdzony warunek (w pętli while) odpowiadający temu klawiszowi.