stan 发表于 2009-9-26 12:25:02

大姨妈减肥瘦身大行动!

呵呵,题目够刺眼了吧。(其实是代码瘦身啦~~)

白沙的原代码lcd_code.h太庞大,用MGEA88在ICC编译下大概60%多。

俺把它改了一下,现在只有24%啦,减肥效果不错啊~


减肥指南:

1:定义两个数组
const unsigned int BUFFER0={0xEB00,0x6000,0xC700,0xE500,0x6C00,0xAD00,0xAF00,
                              0xE000,0xEF00,0xED00};
const unsigned int BUFFER1={0x0D70,0x0060,0x0E30,0x0A70,0x0360,0x0B50,0x0F50,
                              0x0070,0x0F70,0x0B70};       
2:修改lcd_number()函数
void lcd_number(unsigned char number,unsigned char position,unsigned char display)
{
switch (position)
{
   case 0:
   {lcd_buffer &= 0x10ff;
    if (display == 0) break;
    else {lcd_buffer |= BUFFER0;}
   }break;
   case 1:
   {
    if (display == 0) {lcd_buffer &= 0xff10;}
    else {lcd_buffer &= 0xff10;
              lcd_buffer |= (BUFFER0>>8);
             }
   }break;
   case 2:
   {lcd_buffer &= 0x0fff;
      lcd_buffer &= 0xfff1;
      if (display == 0) break;
      else
      {lcd_buffer |=(BUFFER0<<4);
           lcd_buffer |=(BUFFER0>>12);
      }
   }break;
   case 3:
   {lcd_buffer &= 0xF10F;
      if (display == 0) break;
      else {lcd_buffer |=(BUFFER0>>4);}
   }break;       
   case 4:
   {lcd_buffer &= 0xFF10;
      if (display == 0) break;
      else{lcd_buffer |= (BUFFER0>>8);}
   }break;
   case 5:
   {lcd_buffer &= 0x10FF;
      if (display == 0) break;
      else{lcd_buffer |= BUFFER0;}
   }break;
   case 6:
   {lcd_buffer &= 0x8fff;
      lcd_buffer &= 0xfff0;
      if (display == 0) break;
   else
   {lcd_buffer |= (BUFFER1<<8);
      lcd_buffer |= (BUFFER1>>8);
   }
   }break;
   case 7:
   { lcd_buffer &= 0xF08F;
   if (display == 0) break;
   else{lcd_buffer |= BUFFER1;}
   }break;
   case 8:
   { lcd_buffer &= 0x8fff;
   lcd_buffer &= 0xfff0;
   if (display == 0) break;
   else
   {lcd_buffer |= (BUFFER1<<8);
      lcd_buffer |= (BUFFER1>>8);
       }
   }break;
   case 9:
   { lcd_buffer &= 0xF08F;
   if (display == 0) break;
   else {lcd_buffer|= BUFFER1;}
   }break;
}   
flood_lcd_data();
}

3:编译看看

是否瘦啦~~

不要太瘦哦~~~

晕~~晕

zchong 发表于 2009-9-26 12:27:11

听起来像南京话啊

ggtc 发表于 2009-9-26 12:29:11

Mega88 60%? 我还想用 Mega48 呢,岂不一下就满了……./emotion/em005.gif

abuzhu 发表于 2009-9-26 12:33:08

呵呵,我那个驱动写的很烂,是给大家参考用的。楼主帮忙优化实在好。

001friend 发表于 2009-9-26 15:30:27

同感
void lcd_number(unsigned char number,unsigned char position,unsigned char display)
这个函数有点宏大,是需要瘦身了

wear778899 发表于 2009-9-26 16:55:39

跟大姨妈有啥关系。。。

stan 发表于 2009-9-26 17:11:45

LS,大姨妈代码代码大姨妈
快速念10遍

daydayupper 发表于 2009-9-26 19:53:25

大舅妈健身,效果也不错。



这个在ARM编译后更小。AVR不清楚。
可读性较差。


const unsigned int BUFFER0={0xEB,0x60,0xC7,0xE5,0x6C,0xAD,0xAF,
                              0xE0,0xEF,0xED};
                              
const unsigned int BUFFER1={0xD7,0x06,0xE3,0xA7,0x36,0xB5,0xF5,
                              0x07,0xF7,0xB7};
                              
const unsigned int POS_OFFEST={8, 16, 28, 36, 48, 56, 92, 100, 108, 116};                  

//向液晶的数位处写一个0~9的数
//数位为大数码的左至右为0~5,小数码的右至左为6~9;
//number:想显示的数 0~9
//position:显示的数位
//display:显示开关,0 关闭该数位显示(此时number值无效),1 显示该数位数字
void lcd_number(unsigned short int number,unsigned short int position,unsigned short int display)
{
    const unsigned int numberMode = (position < 6) ? BUFFER0 : BUFFER1;
    const unsigned int currOffest = POS_OFFEST;
    const unsigned int offestInWord = currOffest & 0xF;
    const unsigned int bitMask =(position < 6) ? 0xEF : 0xF7;
   
    if(offestInWord >= 12)
    {
      if(display == 0)
      {
            lcd_buffer &= ~((bitMask & 0xF) << 12);               
            lcd_buffer[(currOffest >> 4) + 1] &= ~((bitMask & 0xF0) >> 4);            
      }   
      else
      {
            lcd_buffer |= (numberMode & 0xF) << 12;               
            lcd_buffer[(currOffest >> 4) + 1] |= (numberMode & 0xF0) >> 4;
      }      
    }
    else
    {
      if(display == 0)
      {
            lcd_buffer &= ~(bitMask << offestInWord);
      }
      else
      {   
            lcd_buffer |= numberMode << offestInWord;
      }   
    }
   
    flood_lcd_data();
}

wenjin0386 发表于 2011-5-23 10:28:02

mark
页: [1]
查看完整版本: 大姨妈减肥瘦身大行动!