Bu sorun için başka bir forumda sana cevap vermiştim. İşini görmedi mi?
Bu arada değişkenlere neden dec girmeye çalışıyorsunuz. 255 ile 0xFF aynı anlamı ifade eder.
Değişkenlere doğrudan HEX girin.
Keypad konusuna gelince CCS ve HI-TEC ile yapılmış bir yığın örnek internette dolaşıyor zaten.
Bir şeyi merak ettim, ben de durumu kavrarsam, benim açımdan çok iyi olur.
Tuş takımından girilen FF bilgisini, değişkene direkt olarak nasıl atıyorsunuz?
#include <16f877.h>
#INCLUDE <stdlib.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use fast_io(b)
#use fast_io(d)
#define use_portb_lcd TRUE
#include <lcd.c>
char str[2];
#define CONVERT PIN_C0
#define ROW0 PIN_C4
#define ROW1 PIN_C5
#define ROW2 PIN_C6
#define ROW3 PIN_C7
#define COL0 PIN_D4
#define COL1 PIN_D5
#define COL2 PIN_D6
#define COL3 PIN_D7
char const KEYS[4][4] =
{{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'F','0','E','D'}};
#define KBD_DEBOUNCE_FACTOR 33
short int ROW_HIGH()
{
if(input (ROW0) || input (ROW1) || input (ROW2) || input (ROW3))
return (1);
else
{
return (0);
}
}
char kbd_getc()
{
static byte kbd_call_count;
static short int kbd_down;
static char last_key;
static byte col;
byte kchar;
byte row;
kchar='\0';
if(++kbd_call_count>KBD_DEBOUNCE_FACTOR)
{
switch (col)
{
case 0:
output_high(col0);
output_low(col1);
output_low(col2);
output_low(col3);
break;
case 1:
output_low(col0);
output_high(col1);
output_low(col2);
output_low(col3);
break;
case 2:
output_low(col0);
output_low(col1);
output_high(col2);
output_low(col3);
break;
case 3:
output_low(col0);
output_low(col1);
output_low(col2);
output_high(col3);
break;
}
if(kbd_down)
{
if(!ROW_HIGH())
{
kbd_down=false;
kchar=last_key;
last_key='\0';
}
}
else
{
if(ROW_HIGH())
{
if(input (row0))
row=0;
else if(input (row1))
row=1;
else if(input (row2))
row=2;
else if(input (row3))
row=3;
last_key = KEYS[row][col];
kbd_down = true;
}
else
{
++col;
if(col==4)
col=0;
}
}
kbd_call_count=0;
}
return(kchar);
}
int8 HEXtoDEC()
{
int8 result;;
char *ptr;
result=strtol(str,&ptr,16);
return(result);
}
void SetLCD()
{
printf(lcd_putc,"\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"Put HEX Code");
lcd_gotoxy(1,2);
printf(lcd_putc,"#");
}
void main()
{
char string[6], sout[6], red[2], green[2], blue[2];
int8 iRed, iGreen, iBlue = 0;
int cnt = 0;
setup_psp(PSP_DISABLED); // PSP birimi devre dışı
setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
setup_adc(ADC_OFF); // ADC birimi devre dışı
set_tris_b(0x00); // PORTB çıkış
set_tris_c(0xFF); // PORTD giriş
set_tris_d(0x00); // PORTD çıkış
lcd_init(); // LCD hazırlanıyor
SetLCD();
while(1)
{
char k=0;
k=kbd_getc();
if(k!=0)
{
if(cnt<6)
{
string[cnt] = k;
printf(lcd_putc,"%c",string[cnt]);
cnt++;
}
if(cnt==6)
{
lcd_gotoxy(1,1);
printf(lcd_putc,"Press Convert ");
while(!input(CONVERT));
printf(lcd_putc,"\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"Press Restart");
red[0] = string[0];
red[1] = string[1];
green[0] = string[2];
green[1] = string[3];
blue[0] = string[4];
blue[1] = string[5];
str[0] = red[0];
str[1] = red[1];
iRed = HEXtoDEC();
str[0] = green[0];
str[1] = green[1];
iGreen = HEXtoDEC();
str[0] = blue[0];
str[1] = blue[1];
iBlue = HEXtoDEC();
lcd_gotoxy(1,2);
printf(lcd_putc,"R%u G%u B%u", iRed, iGreen, iBlue);
delay_ms(500);
while(!input(CONVERT));
cnt = 0;
SetLCD();
}
}
}
}
Sonunda bitti.
ricetyx farkettiysen, beni sürekli uğraştırıyorsun.
Proteus'taki KeyPad, koduma uymadığı için biraz değişik oldu tuş takımı.
Zaten devre üzerinde, tuş takımının haritasını yazdım.
Lcd'deki yönergeleri de bilerek İngilizce yazdım.
Türkçe karakterleri değiştirmeyi sevmiyorum.
Aşağıda, çalışır haldeyken birkaç Ekran görüntüsü var devrenin.
Kodu incele bakalım, kolay mı zor mu görürsün.
Ufak tefek hatalar ya da mantık hataları olabilir.
Ekli dosyayı görüntüle 24101 Ekli dosyayı görüntüle 24102 Ekli dosyayı görüntüle 24103
Kod:#include <16f877.h> #INCLUDE <stdlib.h> #fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD #use delay (clock=4000000) #use fast_io(b) #use fast_io(d) #define use_portb_lcd TRUE #include <lcd.c> char str[2]; #define CONVERT PIN_C0 #define ROW0 PIN_C4 #define ROW1 PIN_C5 #define ROW2 PIN_C6 #define ROW3 PIN_C7 #define COL0 PIN_D4 #define COL1 PIN_D5 #define COL2 PIN_D6 #define COL3 PIN_D7 char const KEYS[4][4] = {{'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'F','0','E','D'}}; #define KBD_DEBOUNCE_FACTOR 33 short int ROW_HIGH() { if(input (ROW0) || input (ROW1) || input (ROW2) || input (ROW3)) return (1); else { return (0); } } char kbd_getc() { static byte kbd_call_count; static short int kbd_down; static char last_key; static byte col; byte kchar; byte row; kchar='\0'; if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) { switch (col) { case 0: output_high(col0); output_low(col1); output_low(col2); output_low(col3); break; case 1: output_low(col0); output_high(col1); output_low(col2); output_low(col3); break; case 2: output_low(col0); output_low(col1); output_high(col2); output_low(col3); break; case 3: output_low(col0); output_low(col1); output_low(col2); output_high(col3); break; } if(kbd_down) { if(!ROW_HIGH()) { kbd_down=false; kchar=last_key; last_key='\0'; } } else { if(ROW_HIGH()) { if(input (row0)) row=0; else if(input (row1)) row=1; else if(input (row2)) row=2; else if(input (row3)) row=3; last_key = KEYS[row][col]; kbd_down = true; } else { ++col; if(col==4) col=0; } } kbd_call_count=0; } return(kchar); } int8 HEXtoDEC() { int8 result;; char *ptr; result=strtol(str,&ptr,16); return(result); } void SetLCD() { printf(lcd_putc,"\f"); lcd_gotoxy(1,1); printf(lcd_putc,"Put HEX Code"); lcd_gotoxy(1,2); printf(lcd_putc,"#"); } void main() { char string[6], sout[6], red[2], green[2], blue[2]; int8 iRed, iGreen, iBlue = 0; int cnt = 0; setup_psp(PSP_DISABLED); // PSP birimi devre dışı setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok setup_adc(ADC_OFF); // ADC birimi devre dışı set_tris_b(0x00); // PORTB çıkış set_tris_c(0xFF); // PORTD giriş set_tris_d(0x00); // PORTD çıkış lcd_init(); // LCD hazırlanıyor SetLCD(); while(1) { char k=0; k=kbd_getc(); if(k!=0) { if(cnt<6) { string[cnt] = k; printf(lcd_putc,"%c",string[cnt]); cnt++; } if(cnt==6) { lcd_gotoxy(1,1); printf(lcd_putc,"Press Convert "); while(!input(CONVERT)); printf(lcd_putc,"\f"); lcd_gotoxy(1,1); printf(lcd_putc,"Press Restart"); red[0] = string[0]; red[1] = string[1]; green[0] = string[2]; green[1] = string[3]; blue[0] = string[4]; blue[1] = string[5]; str[0] = red[0]; str[1] = red[1]; iRed = HEXtoDEC(); str[0] = green[0]; str[1] = green[1]; iGreen = HEXtoDEC(); str[0] = blue[0]; str[1] = blue[1]; iBlue = HEXtoDEC(); lcd_gotoxy(1,2); printf(lcd_putc,"R%u G%u B%u", iRed, iGreen, iBlue); delay_ms(500); while(!input(CONVERT)); cnt = 0; SetLCD(); } } } }