Hallo!

Kann mir jemand ein paar Tipps geben wie ich mein Programmcode optimieren kann. Es passt zwar alles rein aber kleiner und besser strukturiert kann es ja immer sein. ZB wie man einen long-wert in einen int-wert ohne explizite Umwandlung umwandelt. Würde bestimmt eine Menge Speicher sparen. Bin für jeden Anregung dankbar.

Der Code ist mit mikroC geschrieben. Benutze einen PIC 16f872.
Code:
unsigned char ch;
unsigned short j=0;

void anzeigee(unsigned int);
unsigned int eprom_lesen(unsigned short);
unsigned short eprom_schreiben(unsigned short,unsigned int);

void anzeigee(unsigned int x)
{
  unsigned short anzeige[10] ;

     IntToStr(x/10,anzeige);
     Lcd_Out(2,5,anzeige);

     LCD_Chr_CP(46);
     
     ch = x % 10;
     LCD_Chr(2,12,48+ch);
}

 unsigned int eprom_lesen(unsigned short vv)
  {
    int dit;
    unsigned short temp;
    unsigned short  istwert1[8],ch1;

    temp = Eeprom_Read(vv);
    dit  = temp;
    dit  = dit <<8;
    
    temp = Eeprom_Read(vv+1);
    dit  = dit + temp;
    
    if(j==1)
    {
     IntToStr(dit/10,istwert1);
     Lcd_Out(2, 5,istwert1);

     LCD_Chr_CP(46);
     ch1 = dit % 10;
     LCD_Chr(2,12,48+ch1);
    }
  }

unsigned short eprom_schreiben(unsigned short xxx,unsigned int xxxx )
  {
    unsigned int temp;

    temp = xxxx;
     Eeprom_Write ( xxx+1,temp );
     temp = (xxxx>>8);
     Eeprom_Write ( xxx,((short)temp) );
  }
  
void main()
{
char *text1 = "Dossierhub";
char *text2 = "cfx";
char *text3 = "cup";
char *text4 = "cf1";

unsigned short wert1, wert2, enter;
unsigned int txt_1, txt_2,tint,adresse,i=800;
unsigned long tlong;


  TRISC       =    0;
  PORTC       =    0;
  TRISB       =    0;
  PORTB       =    0;

  enter       =    0;
  wert2       =    0;

  Lcd_Config(&PORTC, 3, 1, 2, 7, 6, 5, 4);
  LCD_Cmd(LCD_CLEAR);
  LCD_Cmd(LCD_CURSOR_OFF );
  LCD_Out(1,4,text1);
  LCD_Out(2,2,text2);

  do
    {
     ADCON1 = 0x00;                                  //alle analog
     TRISA  = 0xff;

     tlong = ((long)ADC_Read(3)*1600)/1023;          //cfx-wert  0-160.0mm
     tint = tlong;

     anzeigee(tint);
     
     ADCON1 = 0x06;                                  //alle digital
    
     j=0;
     if ( tint > eprom_lesen(0x00))          //Umschalp. cup  Öffner
        {
           PORTB = PORTB | 0x80;
        }
     else
        {
           PORTB = PORTB & 0x7F;
        }
        
     if ( tint < eprom_lesen(0x02))        //Schließer, Dossierhub cf1  unter 50 ein
        {
           PORTB |= 0x40;
        }
      else
        {
           PORTB &= 0xBF;
        }

     if (Button(&PORTA, 2, 30, 1) &&  enter == 0 )  //Umschaltpunkt cup Öffner Soll
        {
          while((PORTA & 0x04)==0x04);              //nach dem loslassen weiter
          j=1;
          LCD_Cmd(LCD_CLEAR);
          delay_ms(30);
          LCD_Out(1,1,"Umschaltpunkt");
          LCD_Out(2,1,text3);
          
          eprom_lesen(0x00);
          
          enter=1;
        }

       while(enter == 1 || enter == 2)
            {
              wert1 =  (PORTA & 0x03);           //aktuelle stellung nach wert1
    
            if ((wert1 ^ wert2)  > 0)          //wurde der Rotary bewegt oder wert1 = wert2
               {
                 wert2 = (wert2 << 1 );         //verschieben des zweiten aufgenommenden wertes

                 if ((wert1 ^ wert2)  == 0x01)
                    {i += 1;}
        
                 if ((wert1 ^ wert2)  == 0x02)
                    {i -= 1;}
        
                 if (i >  1600)
                    {i = 2 ;}
         
                 if (i <= 1)
                    {i = 1600 ;}
                  delay_ms(10);
                  wert2  = wert1 ;

                  anzeigee(i);
               }

              if (Button(&PORTA, 2, 30, 1) && enter == 1)   //Dossierhub cf1 Schließer
                 {
                   while((PORTA & 0x04)==0x04);              //nach dem loslassen weiter

                   eprom_schreiben(adresse = 0x00,tint );

                   LCD_Cmd(LCD_CLEAR);
                   LCD_Out(1,1,text1);
                   LCD_Out(2,1,text4);

                   eprom_lesen(0x02);

                   enter=2;
                   delay_ms(250);
                 }
        
              if (Button(&PORTA, 2, 20, 1) && enter == 2) //enter und speichern
                 {                                        //von Schalt2 Soll
                   while((PORTA & 0x04)==0x04);           //nach dem loslassen weiter
                   
                   eprom_schreiben(adresse = 0x02,tint );

                   enter=0;
                   LCD_Cmd(LCD_CLEAR);
                   delay_ms(1000);
                   
                   LCD_Out(1,4,text1);        //Dossierhub
                   LCD_Out(2,2,text2);
                 }
            }
    }
    while(1);
}
jetzt auch mit Programm