Sida 2 av 2

Postat: 25 oktober 2005, 11:34:55
av jack
Satans vad bra det där funkade, speakman!

Tack igen, alla.

Postat: 25 oktober 2005, 11:46:21
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...

Postat: 25 oktober 2005, 12:03:40
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

Postat: 25 oktober 2005, 12:47:15
av jack
Utmärkt! Stort tack.

Postat: 25 oktober 2005, 13:25:30
av speakman
np :wink:

Postat: 3 november 2005, 17:15:02
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);
      }

Postat: 3 november 2005, 20:22:41
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");

Postat: 3 november 2005, 23:18:33
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

Postat: 7 november 2005, 17:24:56
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..

Postat: 7 november 2005, 19:34:44
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.

Postat: 7 november 2005, 21:14:33
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);
 }
 
}

}