打印

收砖头了

[复制链接]
1709|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
badbird1234|  楼主 | 2009-8-8 07:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近有SONIX搞个垃圾东西
其中需要显示需要把2进制变为10进制
typedef unsigned char tu08;
tu08 time;
tu08 time_temp;
tu08 shiwei;
tu08 gewei;
tu08 LED_TAB_BUFFER[2];




__ROM  unsigned char  LED_TAB[10]={seg_0,seg_1,seg_2,seg_3,seg_4,seg_5,seg_6,seg_7,seg_8,seg_9};
用传统的方法
void compute(void)
{
   

                              
                           shiwei=time/10;
                            gewei=time%10;
                            LED_TAB_BUFFER[0]= LED_TAB[shiwei];
                            LED_TAB_BUFFER[1]= LED_TAB[gewei];


}

用这个方法多吃掉我5个RAM
代码很大
运行时也很耗时间
由于最后我缺一个RAM(因为片子本身就48个RAM)
决定就从它入手了
因为就显示两位数
手术后
void compute(void)
{

                 shiwei=0;
   
     time_temp=time;
                while (time_temp>= 10) {
                                   time_temp -= 10;
                                     shiwei++;
                                   }  
            
                  
                  LED_TAB_BUFFER[0]= LED_TAB[shiwei];
                  LED_TAB_BUFFER[1]= LED_TAB[time_temp];
  
            


}

5个RAM省了
速度提上来了
要是谁还有好的方法欢迎赐教
第一次发经验贴欢迎拍砖

相关帖子

沙发
yewuyi| | 2009-8-8 09:43 | 只看该作者
俺有砖头无数,但实在对SONIX这样的东西没有兴趣,所以就把砸你了啊。。。


嘿嘿,恭喜阁下躲过一劫。。。

使用特权

评论回复
板凳
badbird1234|  楼主 | 2009-8-8 10:22 | 只看该作者
其实我要说的是
2进制转10进制BCD的算法
此法推广可以算任意长度的

使用特权

评论回复
地板
古道热肠| | 2009-8-8 11:05 | 只看该作者
这Sonix单片机没除法指令?有除法指令,整个汇编函数实现此显示功能.一次搞定.根本不占SRAM

使用特权

评论回复
5
starlite_jason| | 2009-8-8 13:53 | 只看该作者
现在用的至少都是2K的RAM,所以不会担心RAM的问题,直接用除法:)

使用特权

评论回复
6
awey| | 2009-8-8 14:47 | 只看该作者
SONIX的C编译器做得非常垃圾,编译后的代码效率非常低。
不过它的运行速度很快,可以算是个弥补。

看看这条查表赋值语句:DispBuf1=DispTab[temp1];
编译后的结果是:
0x00000297:        MOV A, 0x30
0x00000298:        B0MOV 0x13, A
0x00000299:        MOV A, #00h
0x0000029A:        B0MOV 0x14, A
0x0000029B:        MOV A, #9fh
0x0000029C:        ADD A, #9Fh
0x0000029D:        MOV 0x11, A
0x0000029E:        MOV A, #03h
0x0000029F:        MOV 0x12, A
0x000002A0:        ADC 0x12, A
0x000002A1:        BSET 0x12.7
0x000002A2:        B0MOV A, 0x11
0x000002A3:        ADD 0x13, A
0x000002A4:        B0MOV A, 0x12
0x000002A5:        ADC 0x14, A
0x000002A6:        B0MOV A, 0x14
0x000002A7:        B0MOV Y, A
0x000002A8:        B0MOV A, 0x13
0x000002A9:        B0MOV Z, A
0x000002AA:        B0BTS1 Y.7
0x000002AB:        JMP 0x02AE
0x000002AC:        CALL 0x0058          这里不知到CALL到哪里去了?
0x000002AD:        JMP 0x02AF
0x000002AE:        B0MOV A, @YZ
0x000002AF:        MOV 0x1E, A

使用特权

评论回复
7
badbird1234|  楼主 | 2009-8-8 15:00 | 只看该作者
还有很多BUG

使用特权

评论回复
8
sz_kd| | 2009-8-8 15:07 | 只看该作者
老兄,SONIX的C编译器是不怎么好,能用加减的就不要用乘除了,他编译器本身也占一定RAM资源啊,
对于RAM不多的MCU能用汇编就最好用汇编啊,免得给自己找麻烦

使用特权

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

本版积分规则

38

主题

254

帖子

0

粉丝