C och olika dataformat?
Kod: Markera allt
char get_keys(unsigned char *ix, unsigned char *iy)
{
unsigned char x,y;
for(y = 0; y < 3; y++) {
PORTB = 1 << (y + 4);
for(x = 0; x < 4; x++) {
if(PORTB & (1 << x)) {
*ix = x;
*iy = y;
return -1;
}
}
}
return 0;
}
void main(void)
{
unsigned char x,y;
for(;;) {
if(get_keys(&x, &y)) {
/* Tangenten (x,y) trycktes ned */
}
}
}
speakman
Hej igen. Har nu fått ihop det så att jag kan skriva i hyperterminalen med hjälp av keypaden. Men eftersom jag är ute efter att lära mig så undrar jag lite hur man skulle kunna effektivisera nedanstånde stycke. Alla tips är välkommna.
Kod: Markera allt
if(get_keys(&y, &x)) {
if(x==0 && y==0) out = " ";
if(x==1 && y==0) out = "0";
if(x==2 && y==0) out = "\n\r";
if(x==0 && y==1) out = "7";
if(x==1 && y==1) out = "8";
if(x==2 && y==1) out = "9";
if(x==0 && y==2) out = "4";
if(x==1 && y==2) out = "5";
if(x==2 && y==2) out = "6";
if(x==0 && y==3) out = "1";
if(x==1 && y==3) out = "2";
if(x==2 && y==3) out = "3";
USART_Write_str(out);
delay_ms(200);
}
t.ex:
switch(x + (y << 2)) {
case 0+0 : out = ' '; break;
case 0+1 : out = '0'; break;
case 0+2 : out = '\n'; break
case 4+0 : out = '7'; break;
case 4+1 : out = '8'; break;
case 4+2 : out = '9'; break;
case 8+0 : out = '4' : break;
case 8+1 : out = '5' : break;
case 8+2 : out = '6' : break;
case 16+0 : out = '1' : break;
case 16+1 : out = '2' : break;
case 16+2 : out = '3' : break;
}
men observera att du kan inte definera "out" som en sträng och använda '=' tecken för att skriva till den, vill du skriva till en sträng får du använda strcpy() , char * strcpy ( char * dest, const char * src );
exempel:
char string[100]
strcpy(&string, "text som ska läggas i strängen");
switch(x + (y << 2)) {
case 0+0 : out = ' '; break;
case 0+1 : out = '0'; break;
case 0+2 : out = '\n'; break
case 4+0 : out = '7'; break;
case 4+1 : out = '8'; break;
case 4+2 : out = '9'; break;
case 8+0 : out = '4' : break;
case 8+1 : out = '5' : break;
case 8+2 : out = '6' : break;
case 16+0 : out = '1' : break;
case 16+1 : out = '2' : break;
case 16+2 : out = '3' : break;
}
men observera att du kan inte definera "out" som en sträng och använda '=' tecken för att skriva till den, vill du skriva till en sträng får du använda strcpy() , char * strcpy ( char * dest, const char * src );
exempel:
char string[100]
strcpy(&string, "text som ska läggas i strängen");
Så här t.ex.:
Men det hade nog varit lägligare att skriva byte för byte till UART:en istället för en sträng. Den biten får du fixa själv. 
Mvh
speakman
Kod: Markera allt
unsigned char out[2] = {0,0};
unsigned char tbl[4][3] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{' ','0','\n'},
};
void main(void)
{
/* kod ... */
if(get_keys(&y, &x)) {
out[0] = tbl[y][x];
USART_Write_str(&out);
delay_ms(200);
}
/* kod ... */
}

Mvh
speakman
Tack, det funkade faktiskt
Men nu har jag fått andra problem:
Någon som kan tänka sig varför denna kod hela tiden får processorn att starta om? Kan jag vara nåt hårdvarufel men allt sånt har funkat bra hitills så.. Koden är förövrigt till för att ändra intensiteten på bakgrundsbelysningen till en HD44780-display (4-bit) via en matris-kopplad keypad. Allt verkar fungera, men helt plötsligt kan den få för sig att starta om.. Tacksam för hjälp.

Men nu har jag fått andra problem:
Någon som kan tänka sig varför denna kod hela tiden får processorn att starta om? Kan jag vara nåt hårdvarufel men allt sånt har funkat bra hitills så.. Koden är förövrigt till för att ändra intensiteten på bakgrundsbelysningen till en HD44780-display (4-bit) via en matris-kopplad keypad. Allt verkar fungera, men helt plötsligt kan den få för sig att starta om.. Tacksam för hjälp.
Kod: Markera allt
char get_keys(unsigned char *ix, unsigned char *iy) {
unsigned char x,y;
for(y = 0; y < 3; y++) {
PORTB = 1 << (y + 4);
for(x = 0; x < 4; x++) {
if(PORTB & (1 << x)) {
*ix = x;
*iy = y;
return -1;
}
}
}
return 0;
}
void main(void) {
int duty, percent;
char text[5];
unsigned char x,y;
INTCON = 0;
TRISB = 15;
ADCON1 = 0xFF;
TRISD = 0;
PORTD = 0;
TRISC = 0;
PWM_Init(5000);
PWM_start();
Lcd_Init(&PORTD); // Initialize LCD connected to PORTB
Lcd_Cmd(Lcd_CLEAR); // Clear display
Lcd_Cmd(Lcd_CURSOR_OFF); // Turn cursor off
Lcd_Out(1, 1, "Background PWM");
Lcd_Out(2, 1, "16x2 LCD Blue");
duty=150;
while(1) {
if(get_keys(&y, &x)) {
if(x==0 && y==0) {}
if(x==1 && y==0) {}
if(x==2 && y==0) {}
if(x==0 && y==1) {}
if(x==1 && y==1) {}
if(x==2 && y==1) {}
if(x==0 && y==2) {duty=10;}
if(x==1 && y==2) {duty=240;}
if(x==2 && y==2) {}
if(x==0 && y==3) duty--;
if(x==1 && y==3) duty++;
if(x==2 && y==3) {}
if(duty>240) duty=240;
if(duty<10) duty=10;
percent = duty*100;
percent = percent/255;
Lcd_Cmd(Lcd_CLEAR); // Clear display
Lcd_Out(1, 1, "Background PWM");
WordToStr(percent, text);
Lcd_Out(2, 5, text);
Lcd_Out(2, 1, "Duty:");
Pwm_change_duty(duty);
delay_ms(100);
}
}
}