打印

设计时**

[复制链接]
楼主: 古道热肠
手机看帖
扫描二维码
随时随地手机跟帖
41
电子尘埃| | 2008-8-25 13:57 | 只看该作者 回帖奖励 |倒序浏览

所长,你好.

   我只搞过单片机的程序设计.别的没有弄过.
   这是我目前水平的理解,
   如果一切与资源无关.代码得大好多吧?
   所长你能帮我等菜鸟对程序设计(嵌入式)的思想提高一步吗?好像市面上关于此类的书特少.

使用特权

评论回复
42
电子尘埃| | 2008-8-25 14:04 | 只看该作者

像xwj大侠说的

<<严格限制一个入口对应一个出口,限制循环的次数,这对减少程序的BUG绝对有好处 >>这样的总结,新华书店就找不到这样的好教材.
   为什么就没人写这样一本多年设计程序的经验总结呢(也许出版社说有.可我还没有真正在新华书店里看到过.哪位朋友看到过,分享一下呀).

使用特权

评论回复
43
农民讲习所| | 2008-8-25 14:59 | 只看该作者

代码差不多

比如LZ的:
if(sucWord[0] > 0x80 && sucWord[1] > 0x80)
       {   //如果是汉字
        LCD_GetHZDot(sucWord[0],sucWord[1],ucHzDot);        //获取汉字的点 阵
        ucX = ucCharCol*8;
        ucY = ucCharRow*16;
        for(uci=0;uci<16;uci++)
        {
            for(ucj=0;ucj<8;ucj++)
            {
                if(ucHzDot[2*uci] & MaskBit[ucj])
                {
                    LCD_Set_Pixel(ucX+ucj,uci+ucY,1);
                   }
                else
                {
                    LCD_Set_Pixel(ucX+ucj,uci+ucY,0);
                }
                if(ucHzDot[2*uci+1] & MaskBit[ucj])
                {
                    LCD_Set_Pixel(ucX+8+ucj,uci+ucY,1);
                  }
                else
                {
                    LCD_Set_Pixel(ucX+8+ucj,uci+ucY,0);
                }
            }
        }

    }
    else
     {   //如果是西文
        LCD_GetEnglishCharDot(sucWord[0],ucHzDot);
        ucX = ucCharCol*8;
        ucY = ucCharRow*16;
        for(uci=0;uci<16;uci++)
        {
            for(ucj=0;ucj<8;ucj++)
            {
                if(ucHzDot[uci] & MaskBit[ucj])
                {
                    LCD_Set_Pixel(ucX+ucj,uci+ucY,1);
                   }
                else
                {
                    LCD_Set_Pixel(ucX+ucj,uci+ucY,0);
                }
            }
        }
        //WriteDataToRS232(0x01, ucHzDot, 16);
    }

用俺的方法,只要1/2。而字模定义每个多出2个字节,再包括结构的定义,几乎差不多了。
模块化不代表代码增加。

所以,不要只想着代码增加什么的,那是错误的思维角度。

使用特权

评论回复
44
电子尘埃| | 2008-8-25 17:56 | 只看该作者

所长出本书呀,现在很流行呀.

使用特权

评论回复
45
电子尘埃| | 2008-8-25 18:13 | 只看该作者

所长,还在吗?

以前在这个论坛看过你的"通用单片机程序",置顶了很长时间,可现在怎么也找不着了,还有你的博客在哪里呢,怎么也找不着了呀.

使用特权

评论回复
46
电子尘埃| | 2008-8-25 18:17 | 只看该作者

所长,还在吗?

在googl上找了一大圈,找到一个论坛,可里面的贴子,我没有权限看

使用特权

评论回复
47
电子尘埃| | 2008-8-25 18:28 | 只看该作者

怎么你的著作全都没了.

得罪人让人删了????

使用特权

评论回复
48
jack.king| | 2008-8-25 19:55 | 只看该作者

想看啊!看来我近来写LCD程序是个正确的时候哈哈!

使用特权

评论回复
49
jack.king| | 2008-8-26 11:30 | 只看该作者

LZ大侠这个是什么函数 LCD_Set_Pixel(ucX+ucj,uci+ucY,1);

使用特权

评论回复
50
古道热肠|  楼主 | 2008-8-26 14:31 | 只看该作者

回楼上

液晶屏的写点函数,这个应该由自己来实现的.

使用特权

评论回复
51
jack.king| | 2008-8-27 08:35 | 只看该作者

谢谢!

使用特权

评论回复
52
gyt| | 2008-8-27 10:31 | 只看该作者

挺好挺好

使用特权

评论回复
53
3.3v| | 2008-8-27 13:20 | 只看该作者

以前好像也弄了一个这样的,

/*----------------------------------------

汉字与32位字体组合,以汉字(2节节)做索引
取模方式:字节倒序,纵向取模
------------------------------------------*/
typedef struct{ 
                   uchar chineselib[2]; 
                   uchar zimolib  [32];
                }testlib;  
                                
code testlib comlib[]={
 "〇",
0x00,0x00,0x00,0x00,0xE0,0xF0,0x18,0x08,0x08,0x18,0xF0,0xE0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x0F,0x1F,0x30,0x20,0x20,0x30,0x1F,0x0F,0x00,0x00,0x00,0x00,
 "一",
0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x3F,0x20,0x20,0x00,0x00,0x00,0x00,0x00,
 "二",
0x00,0x00,0x00,0x00,0x70,0x78,0x08,0x08,0x88,0xF8,0x70,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x30,0x38,0x2C,0x26,0x23,0x31,0x30,0x00,0x00,0x00,0x00,0x00,
 "三",
0x00,0x00,0x00,0x00,0x30,0x38,0x88,0x88,0xC8,0x78,0x30,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x18,0x38,0x20,0x20,0x21,0x3F,0x1E,0x00,0x00,0x00,0x00,0x00,
 "四",
0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0x30,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x03,0x07,0x24,0x24,0x3F,0x3F,0x24,0x20,0x00,0x00,0x00,0x00,
 "五",
0x00,0x00,0x00,0x00,0xF8,0xF8,0x88,0x88,0x88,0x88,0x08,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x19,0x39,0x21,0x20,0x20,0x3F,0x1F,0x00,0x00,0x00,0x00,0x00,}

uint index_chinese(uchar chinese_get_low, uchar chinese_get_high)

  testlib *findcount; 
  uint position = 0; //位置 

 for(findcount=comlib;(findcount->chineselib[0] != chinese_get_low) || (findcount->chineselib[1] != chinese_get_high);findcount++) 
       { 
          if( (findcount->chineselib[0] == 0) && (findcount->chineselib[1] == 0) ) 
               return 0x00;//找不到就退出
          position++; 
         
       } 
 return position; 


void chinese_string_process(uchar xaddress,uchar Lcdlayer, uchar* chinese_string)
{
   testlib *findpost;             //最终定位坐标
   uchar   *outdata;
   bit     L_R_display = 0;       //0=左窗口
   uchar   chinese_get_low,chinese_get_high;     //汉字内码
   uchar   scan_16cow_count;      //16行扫描计数
   uchar   address;               //显示屏的物理地址设置ADC(A0)=0xa0是0~61,ADC(A0)=0xa1是19~80
   
    while(*chinese_string)
      {
        chinese_get_low  = *chinese_string; //取内码
        chinese_string++; 
        chinese_get_high = *chinese_string;
        chinese_string++;
        findpost = comlib + index_chinese(chinese_get_low,chinese_get_high); //坐标已经算出来了
        outdata  = findpost->zimolib;  //输出数据的起始位置
//-------下面为显示部分,不同硬件不同驱动,我这字模16*16显示---------
      for (scan_16cow_count = 16; scan_16cow_count > 1; scan_16cow_count--)
       {
         if (xaddress > 79) 
           { 
              L_R_display = 1; 
              address = xaddress % 80+19;
           }
          else 
              address = xaddress;

        if( Lcdlayer == 0 )  //显示第一层
        {
           lcd_set_page(0,0);
           lcd_set_address(address,address);
           if ( L_R_display ) 
            lcd_send_data_to_E1 ( *outdata );
           else     
            lcd_send_data_to_E2 ( *outdata );
           lcd_set_page(1,1);
           lcd_set_address(address,address);
           if ( L_R_display ) 
            lcd_send_data_to_E1( *(outdata+16) );
           else    
            lcd_send_data_to_E2( *(outdata+16) );
        }
       else      //否则,显示第二层
       {
           lcd_set_page(2,2);
           lcd_set_address(address,address);
           if ( L_R_display ) 
            lcd_send_data_to_E1 ( *outdata );
           else    
            lcd_send_data_to_E2 ( *outdata );
           lcd_set_page(3,3);
           lcd_set_address(address,address);
           if ( L_R_display ) 
            lcd_send_data_to_E1( *(outdata+16) );
           else     
            lcd_send_data_to_E2( *(outdata+16) );
           
        }

        xaddress++;
        outdata++;

     }     
  }


}       


使用范例
chinese_string_process(16*3+19,layer,"〇一二五三四");

使用特权

评论回复
54
3.3v| | 2008-8-27 13:27 | 只看该作者

查询起来比较耗时

记得以前好像有个更好的字模压缩与小字库算法,这事还请教过XWJ兄弟了,

使用特权

评论回复
55
古道热肠|  楼主 | 2008-8-27 15:01 | 只看该作者

回3.3V

          if( (findcount->chineselib[0] == 0) && (findcount->chineselib[1] == 0) ) 
               return 0x00;//找不到就退出
您这退出条件管用吗?数据最后一个元素后是什么内容恐怕是个不确定值吧.

使用特权

评论回复
56
masonzhang| | 2008-8-27 16:28 | 只看该作者

re

mark

使用特权

评论回复
57
huhaijiang| | 2008-8-27 18:03 | 只看该作者

re,

很不错,
等项目完成,上传交流下

使用特权

评论回复
58
ttlasong| | 2008-9-4 22:11 | 只看该作者

好贴

使用特权

评论回复
59
gqhonesty| | 2008-9-6 09:43 | 只看该作者

标记下

使用特权

评论回复
60
figoxwm| | 2008-9-6 09:46 | 只看该作者

看看,标志一下

看看,标志一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则