私は PIC マイクロコントローラを使用して簡単な交通信号コードを設計してきました。各信号機のタイミングを入力するコントロール パネルがあり、より安全にするためにパスワードを追加して、誰かがタイミングをいじるのを防ぎました。 .
シミュレーションには Proteus 8 を使用しました。問題が発生するのは、LCD に何かを印刷すると、正しく表示されないことがありますが、なぜこれが発生するのかをまだ特定できません。赤のタイミングが入力されて黄色が始まると、これが表示されます: http://i.stack.imgur.com/lnbrI.png
緑のタイミングでも同じことが起こります。最初に文字列を自動的に入力して変数に入れる代わりに試しましたが、調査では私の問題に固有のものは何も得られませんでした! ここに私のコードがあります:
char kp;
char entry[16];
int i = 0;
char password[] = "12345";
char *Redd = "Red";
char *Yelloww = "Yellow";
char *Greenn = "Green";
int Red;
int Green;
int Yellow;
char test[5];
sbit LCD_RS at RD4_bit;
sbit LCD_EN at RD6_bit;
sbit LCD_D4 at RD0_bit;
sbit LCD_D5 at RD1_bit;
sbit LCD_D6 at RD2_bit;
sbit LCD_D7 at RD3_bit;
sbit LCD_RS_Direction at TRISD4_bit;
sbit LCD_EN_Direction at TRISD6_bit;
sbit LCD_D4_Direction at TRISD0_bit;
sbit LCD_D5_Direction at TRISD1_bit;
sbit LCD_D6_Direction at TRISD2_bit;
sbit LCD_D7_Direction at TRISD3_bit;
char keypadPort at PORTB;
char keypadchar () {
int key = 0;
while (!key) key = Keypad_Key_Click();
switch (key) {
case 1: return '1'; break;
case 2: return '2'; break;
case 3: return '3'; break;
case 5: return '4'; break;
case 6: return '5'; break;
case 7: return '6'; break;
case 9: return '7'; break;
case 10: return '8'; break;
case 11: return '9'; break;
case 13: return '*'; break;
case 14: return '0'; break;
case 15: return '#'; break;
}
}
void inputPassword() {
int count = 0;
i = 0;
Lcd_out(1,1,"Enter Password");
lcd_cmd(_LCD_SECOND_ROW);
while(1) {
kp = keypadchar();
if (kp != '*' && kp != '#' && count < 15) {
Lcd_Chr_Cp('*');
while(entry[i]!=0) i++; // break when find NULL
entry[i] = kp; // insert char where NULL was
entry[i+1] = 0; // and insert new NULL after it
i = 0;
count++;
} else if (kp == '*') {
if (strlen(entry) != 0) {
LCD_Cmd(_LCD_MOVE_CURSOR_LEFT);
Lcd_Chr_Cp(' ');
LCD_Cmd(_LCD_MOVE_CURSOR_LEFT);
while(entry[i]!=0) i++; // break when find NULL
entry[i-1] = 0; // insert Null
i = 0;
count--;
}
} else if (kp == '#') {
if (strlen(entry) != 0)
if (strcmp(password,entry) == 0) {
Lcd_out(2,1,"Password Correct ");
while(entry[i]!=0) {
entry[i] = 0;
i++;
}
i = 0;
break;
}
else {
Lcd_out(2,1,"Wrong password ");
delay_ms(1000);
Lcd_out(2,1," ");
Lcd_out(2,1,"");
while(entry[i]!=0) {
entry[i] = 0;
i++;
}
count = 0;
i = 0;
}
}
}
}
int entertiming(char *colorN) {
int count = 0;
i = 0;
LCD_Cmd(_LCD_CLEAR);
delay_ms(1);
strcat(colorN," timing");
delay_ms(1);
LCD_Out(1,1,colorN);
delay_ms(1);
LCD_Cmd(_LCD_SECOND_ROW);
while(entry[i]!=0) {
entry[i] = 0;
i++;
}
i = 0;
while(1) {
kp = keypadchar();
if (kp != '*' && kp != '#' && count < 3) {
Lcd_Chr_Cp(kp);
while(entry[i]!=0) i++; // break when find NULL
entry[i] = kp; // insert char where NULL was
entry[i+1] = 0; // and insert new NULL after it
i = 0;
count++;
} else if (kp == '*') {
if (strlen(entry) != 0) {
LCD_Cmd(_LCD_MOVE_CURSOR_LEFT);
Lcd_Chr_Cp(' ');
LCD_Cmd(_LCD_MOVE_CURSOR_LEFT);
while(entry[i]!=0) i++; // break when find NULL
entry[i-1] = 0; // insert Null
i = 0;
count--;
}
} else if (kp == '#') {
if (strlen(entry) != 0)
return atoi(entry);
}
}
}
void startcountdown(int time) {
while (time >= 0) {
wordtostr(time,test);
lcd_out(2,1,test);
time--;
delay_ms(1000);
}
}
void main () {
Keypad_init();
Lcd_init();
LCD_Cmd(_LCD_CLEAR) ;
LCD_Out(1, 1, "Hello!") ;
Lcd_Cmd(_LCD_SECOND_ROW);
delay_ms(1000);
while(1) {
inputPassword();
delay_ms(1);
Red = entertiming(Redd);
delay_ms(1);
Yellow = entertiming(Yelloww);
delay_ms(1);
Green = entertiming(Greenn);
while(1) {
Lcd_cmd(_LCD_CLEAR);
Lcd_Out(1,1,"Red");
startcountdown(Red);
Lcd_cmd(_LCD_CLEAR);
Lcd_Out(1,1,"Yellow");
startcountdown(Yellow);
Lcd_cmd(_LCD_CLEAR);
Lcd_Out(1,1,"Green");
startcountdown(Green);
}
}
}
編集:コメントの提案に従って、より最近のコードでコードを編集しました。また、1つの小さな部分を除いてコードを完成させました。カウントダウンを保持する内側のwhileループには、割り込みが発生したときに発生するブレークコマンドが必要です赤/黄/緑のタイミングの値を変更すると、新しい問題が発生し、黄色の読み取り値が常に 0 に変換されます! どんな数字を入力しても
2 番目の編集:赤、黄、緑の関数の順序を変更すると、一部の順序が機能し、一部の順序が機能しません。これは意味がありません。