搜索
bottom↓
回复: 8

大姨妈减肥瘦身大行动!

[复制链接]

出0入0汤圆

发表于 2009-9-26 12:25:02 | 显示全部楼层 |阅读模式
呵呵,题目够刺眼了吧。(其实是代码瘦身啦~~)

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

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


减肥指南:

1:定义两个数组
const unsigned int BUFFER0[10]={0xEB00,0x6000,0xC700,0xE500,0x6C00,0xAD00,0xAF00,
                                0xE000,0xEF00,0xED00};
const unsigned int BUFFER1[10]={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[0] &= 0x10ff;
    if (display == 0) break;
    else {lcd_buffer[0] |= BUFFER0[number];}
   }break;
   case 1:
   {
    if (display == 0) {lcd_buffer[0] &= 0xff10;}
    else {lcd_buffer[1] &= 0xff10;
              lcd_buffer[1] |= (BUFFER0[number]>>8);
             }
   }break;
   case 2:
   {  lcd_buffer[1] &= 0x0fff;
      lcd_buffer[2] &= 0xfff1;
      if (display == 0) break;
      else
      {lcd_buffer[1] |=(BUFFER0[number]<<4);
           lcd_buffer[2] |=(BUFFER0[number]>>12);
      }
   }break;
   case 3:
   {  lcd_buffer[2] &= 0xF10F;
      if (display == 0) break;
      else {lcd_buffer[2] |=(BUFFER0[number]>>4);}
   }break;       
   case 4:
   {  lcd_buffer[3] &= 0xFF10;
      if (display == 0) break;
      else{lcd_buffer[3] |= (BUFFER0[number]>>8);}
   }break;
   case 5:
   {  lcd_buffer[3] &= 0x10FF;
      if (display == 0) break;
      else{lcd_buffer[3] |= BUFFER0[number];}  
   }break;
   case 6:
   {  lcd_buffer[5] &= 0x8fff;
      lcd_buffer[6] &= 0xfff0;
      if (display == 0) break;
     else
     {lcd_buffer[5] |= (BUFFER1[number]<<8);
      lcd_buffer[6] |= (BUFFER1[number]>>8);
     }
   }break;
   case 7:
   { lcd_buffer[6] &= 0xF08F;
     if (display == 0) break;
     else{lcd_buffer[6] |= BUFFER1[number];}
   }break;
   case 8:
   { lcd_buffer[6] &= 0x8fff;
     lcd_buffer[7] &= 0xfff0;
     if (display == 0) break;
     else
     {lcd_buffer[6] |= (BUFFER1[number]<<8);
      lcd_buffer[7] |= (BUFFER1[number]>>8);
         }
   }break;
   case 9:
   { lcd_buffer[7] &= 0xF08F;
     if (display == 0) break;
     else {lcd_buffer[7]|= BUFFER1[number];}  
   }break;
  }   
  flood_lcd_data();
}

3:编译看看

是否瘦啦~~

不要太瘦哦~~~

晕~~晕

出0入31汤圆

发表于 2009-9-26 12:27:11 | 显示全部楼层
听起来像南京话啊

出0入0汤圆

发表于 2009-9-26 12:29:11 | 显示全部楼层
Mega88 60%? 我还想用 Mega48 呢,岂不一下就满了……

出0入0汤圆

发表于 2009-9-26 12:33:08 | 显示全部楼层
呵呵,我那个驱动写的很烂,是给大家参考用的。楼主帮忙优化实在好。

出0入0汤圆

发表于 2009-9-26 15:30:27 | 显示全部楼层
同感
void lcd_number(unsigned char number,unsigned char position,unsigned char display)
这个函数有点宏大,是需要瘦身了

出0入0汤圆

发表于 2009-9-26 16:55:39 | 显示全部楼层
跟大姨妈有啥关系。。。

出0入0汤圆

 楼主| 发表于 2009-9-26 17:11:45 | 显示全部楼层
LS,大姨妈代码代码大姨妈
快速念10遍

出0入0汤圆

发表于 2009-9-26 19:53:25 | 显示全部楼层
大舅妈健身,效果也不错。



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


const unsigned int BUFFER0[10]={0xEB,0x60,0xC7,0xE5,0x6C,0xAD,0xAF,
                                0xE0,0xEF,0xED};
                                
const unsigned int BUFFER1[10]={0xD7,0x06,0xE3,0xA7,0x36,0xB5,0xF5,
                                0x07,0xF7,0xB7};
                                
const unsigned int POS_OFFEST[10]={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[number] : BUFFER1[number];
    const unsigned int currOffest = POS_OFFEST[position];
    const unsigned int offestInWord = currOffest & 0xF;
    const unsigned int bitMask =  (position < 6) ? 0xEF : 0xF7;
   
    if(offestInWord >= 12)
    {
        if(display == 0)
        {
            lcd_buffer[currOffest >> 4] &= ~((bitMask & 0xF) << 12);               
            lcd_buffer[(currOffest >> 4) + 1] &= ~((bitMask & 0xF0) >> 4);            
        }   
        else
        {
            lcd_buffer[currOffest >> 4] |= (numberMode & 0xF) << 12;               
            lcd_buffer[(currOffest >> 4) + 1] |= (numberMode & 0xF0) >> 4;
        }        
    }
    else
    {
        if(display == 0)
        {
            lcd_buffer[currOffest >> 4] &= ~(bitMask << offestInWord);
        }
        else
        {   
            lcd_buffer[currOffest >> 4] |= numberMode << offestInWord;
        }   
    }
   
    flood_lcd_data();
}

出0入0汤圆

发表于 2011-5-23 10:28:02 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 20:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表