Em chào các anh chị trên diễn đàn !
Em đang bị vướng mắc trong lập trình cho lcd+ key(4x4) và atmega16 ,rất mong được anh chị giúp đỡ.
- Trong chương trình chính của em, sau khi chạy xong 1 lần em muốn yêu cầu chương trình hỏi có muón tiếp tục hay ko. Nếu ấn phím yes( giả sử phím -) thì tiếp tục còn ấn phím NO(giả sử phím +) thì thoát. Nên em sử dụng vòng Do ...while. nhưng đến đây thì em không gọi được hàm quét keypad mà chương trình thoát luôn. Em chưa biết phải xử lý ra sao. Rất mong anh chị nào quan tâm đên keypad thì chỉ bảo giúp em.
- Em sử dụng codevision, sau đây là đoạn code của em.
// day la ham quet key pad
unsigned char scan_keypad()
{
unsigned char row, col, key;
//**********************quet cot *****************************
for(col = 0; col < 4; col++)
{
KEY_PORT = 0xFF & (~(1<<(col + 4))); //set bit col + 4 = 0, cac bit con lai la 1
delay_us(10);
key = KEY_PIN & 0x0F;
//neu co fim dc an key != 0x0F
if(key != 0x0F)
{
//********************quet hang *********************
for(row = 0; row < 4; row++)
{
if(key == scan_codes[row])
return ascii_codes[row][col];
}
}
}
return 0;
}
///********************chuong trinh main*************
void main(void)
{
KEY_DDR=0xF0;
KEY_PORT=0x0F;
lcd_init(16);
chaomung();
do
{
setting();
data_input();
key=30;
if( thangdo==0)
{
selcall_4so();
while (key!=61)
{
key=scan_keypad();
switch (key)
{
case 58:
{
j=j+1;
if (j>2) j=0;
if (j==0) selcall_4so();
if (j==1) callblock1_4();
if (j==2) callblock2_4();
delay_ms(300);
}
break;
case 120:
{
j=j-1;
if (j<0) j=2;
if (j==0) selcall_4so();
if (j==1) callblock1_4();
if (j==2) callblock2_4();
delay_ms(300);
}
break;
}
}
}
if (thangdo==1)
{
selcall_5so();
while (key!=61) //neu an dau = thi chuong trinh se thoat
{
key=scan_keypad(); // goi chuong trinh quet keypad
switch (key)
{
case 58: //58la ma ASCII cua dau":"
{
j=j+1;
if (j>2) j=0;
if (j==0) selcall_5so();
if (j==1) callblock1_5();
if (j==2) callblock2_5();
delay_ms(300);
}
break;
case 120: //120 la ma ASCII cua dau "x"
{
j=j-1;
if (j<0) j=2;
if (j==0) selcall_5so();
if (j==1) callblock1_5();
if (j==2) callblock2_5();
delay_ms(300);
}
break;
}
}
}
if (thangdo==2)
{
selcall_9so();
while (key!=61) // 61 la ma ASCII cua dau "="
{
key=scan_keypad();
switch (key)
{
case 58:
{
j=j+1;
if (j>4) j=0;
if (j==0) selcall_9so();
if (j==1) callblock1_9();
if (j==2) callblock2_9();
if (j==3) callblock3_9();
if (j==4) checksum_9();
delay_ms(300);
}
break;
case 120:
{
j=j-1;
if (j<0) j=4;
if (j==0) selcall_9so();
if (j==1) callblock1_9();
if (j==2) callblock2_9();
if (j==3) callblock3_9();
if (j==4) checksum_9();
delay_ms(300);
}
break;
}
}
}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Continue Y/N ?"); // ban co muontiep tuc chuong trinh hay ko: yes or no
key = scan_keypad(); // vi sao no khong quet nhi ??????
if (key==97) t=1; // 97 la ma ASCII cua dau "-"
if (key==43) t=0; //43 la ma ASCIIcua dau "+"
}
while (t==1);
help();
lcd_putsf("GV:TR.XUAN VIET") ;
lcd_gotoxy(0,1);
lcd_putsf("SV:HOANG HIEP") ;
while (1)
{
}
}
Em đang bị vướng mắc trong lập trình cho lcd+ key(4x4) và atmega16 ,rất mong được anh chị giúp đỡ.
- Trong chương trình chính của em, sau khi chạy xong 1 lần em muốn yêu cầu chương trình hỏi có muón tiếp tục hay ko. Nếu ấn phím yes( giả sử phím -) thì tiếp tục còn ấn phím NO(giả sử phím +) thì thoát. Nên em sử dụng vòng Do ...while. nhưng đến đây thì em không gọi được hàm quét keypad mà chương trình thoát luôn. Em chưa biết phải xử lý ra sao. Rất mong anh chị nào quan tâm đên keypad thì chỉ bảo giúp em.
- Em sử dụng codevision, sau đây là đoạn code của em.
// day la ham quet key pad
unsigned char scan_keypad()
{
unsigned char row, col, key;
//**********************quet cot *****************************
for(col = 0; col < 4; col++)
{
KEY_PORT = 0xFF & (~(1<<(col + 4))); //set bit col + 4 = 0, cac bit con lai la 1
delay_us(10);
key = KEY_PIN & 0x0F;
//neu co fim dc an key != 0x0F
if(key != 0x0F)
{
//********************quet hang *********************
for(row = 0; row < 4; row++)
{
if(key == scan_codes[row])
return ascii_codes[row][col];
}
}
}
return 0;
}
///********************chuong trinh main*************
void main(void)
{
KEY_DDR=0xF0;
KEY_PORT=0x0F;
lcd_init(16);
chaomung();
do
{
setting();
data_input();
key=30;
if( thangdo==0)
{
selcall_4so();
while (key!=61)
{
key=scan_keypad();
switch (key)
{
case 58:
{
j=j+1;
if (j>2) j=0;
if (j==0) selcall_4so();
if (j==1) callblock1_4();
if (j==2) callblock2_4();
delay_ms(300);
}
break;
case 120:
{
j=j-1;
if (j<0) j=2;
if (j==0) selcall_4so();
if (j==1) callblock1_4();
if (j==2) callblock2_4();
delay_ms(300);
}
break;
}
}
}
if (thangdo==1)
{
selcall_5so();
while (key!=61) //neu an dau = thi chuong trinh se thoat
{
key=scan_keypad(); // goi chuong trinh quet keypad
switch (key)
{
case 58: //58la ma ASCII cua dau":"
{
j=j+1;
if (j>2) j=0;
if (j==0) selcall_5so();
if (j==1) callblock1_5();
if (j==2) callblock2_5();
delay_ms(300);
}
break;
case 120: //120 la ma ASCII cua dau "x"
{
j=j-1;
if (j<0) j=2;
if (j==0) selcall_5so();
if (j==1) callblock1_5();
if (j==2) callblock2_5();
delay_ms(300);
}
break;
}
}
}
if (thangdo==2)
{
selcall_9so();
while (key!=61) // 61 la ma ASCII cua dau "="
{
key=scan_keypad();
switch (key)
{
case 58:
{
j=j+1;
if (j>4) j=0;
if (j==0) selcall_9so();
if (j==1) callblock1_9();
if (j==2) callblock2_9();
if (j==3) callblock3_9();
if (j==4) checksum_9();
delay_ms(300);
}
break;
case 120:
{
j=j-1;
if (j<0) j=4;
if (j==0) selcall_9so();
if (j==1) callblock1_9();
if (j==2) callblock2_9();
if (j==3) callblock3_9();
if (j==4) checksum_9();
delay_ms(300);
}
break;
}
}
}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Continue Y/N ?"); // ban co muontiep tuc chuong trinh hay ko: yes or no
key = scan_keypad(); // vi sao no khong quet nhi ??????
if (key==97) t=1; // 97 la ma ASCII cua dau "-"
if (key==43) t=0; //43 la ma ASCIIcua dau "+"
}
while (t==1);
help();
lcd_putsf("GV:TR.XUAN VIET") ;
lcd_gotoxy(0,1);
lcd_putsf("SV:HOANG HIEP") ;
while (1)
{
}
}
Comment