C och olika dataformat?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

Satans vad bra det där funkade, speakman!

Tack igen, alla.
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

Men hur gör jag nu för att göra en funktion av det hela? :)

Så att jag kan anropa tex get_keys(); och få x och y returnerat till nån variabel.

Har försökt men får verkligen inte till det...
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

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 */
      }
   }
}
Mvh
speakman
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

Utmärkt! Stort tack.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

np :wink:
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

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);
      }
macgyver
Inlägg: 321
Blev medlem: 8 juni 2005, 00:24:09
Ort: Göteborg
Kontakt:

Inlägg av macgyver »

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");
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Så här t.ex.:

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 ... */
}
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
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

Nu är jag igång igen..

Om jag har en variabel med ett värde mellan 0 och 255, och vill ha ut hur många procent det är. Alltså (värde/255)*100.

Hur gör jag då? Vilka variabeltyper ska jag använda osv? Fattar för tillfället jäkligt lite..
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

1: Gör variablen till en int (16-bit)
2: Värde = Värde * 100
3: Procent = Värde / 255

Då har du räknat ut procenten utan flyttal och det fungerar.
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

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.

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);
 }
 
}

}
Skriv svar