用户名
密码
 问题导航
·用定时器延时有什么好处?
·有没有人想过搞个无线电的遥控器呢?
·具有强大编程功能的多功能51/AVR单片机学习开发系统
·[求助]那位大哥知道AT89C51SND1经汉化的DATASHEET
·我家里的钟.程序经过仔细调节走时还比较准.没有用时钟芯片(1302之类),断电也不保存数据,仅仅用来练手而已!
·[求助] x25045能不能用P3口驱动?
·写字板该用什么材料
·DEC5402 Ver2.0开发套件 让利销售:500元/套
·LCD!!!!!
·看这个
·[求助]MF-848机械万用表?
·谁能帮说说台球计费系统的原理
·手机的红外线电路
·[原创]回收二手无线网卡!
·使用这个电路作为步进电机驱动,可以不用续流二极管吗?
 
 
首页 - 电子制作 - 怎样让c51写出代码少?
怎样让c51写出代码少?
--  怎样让c51写出代码少?
我是个初学者,看过一些关于怎样让c51写出代码少的介绍,但大多也是泛泛而谈,如控制 模式,尽量用8位的字符型等,但是没有更多地介绍。 现在用c51写程序,基本的感觉是,想要的功能可以实现,而且确实编写速度很快,有种不 想回到汇编的感觉,考虑如何组织程序和实现时,思路也是往c上靠,汇编也有些读不动 了,但是,说实话,有种心里挺没底的感觉,小一点的程序,还可以看看汇编码,大了, 很难能读懂keil给出的汇编码,还害怕出现不可知的被优化掉,而且我觉得编译后的代码 太多,写了些调试片子用的程序,挺大的。 现在又遇见一些情况:我在写一个关于ds1302的程序,看了很多网友的程序。 其中,有段程序,也就是对1302读写一字节的程序,有两个,几乎是一样的 /************************************************** * 名称: InputByte * 功能: 往DS1302写入1Byte数据 * 返回值: 无 **************************************************/ void inputbyte(unsigned char x) { ACC=x; T_DA=a0;T_CLK=1;T_CLK=0; T_DA=a1;T_CLK=1;T_CLK=0; T_DA=a2;T_CLK=1;T_CLK=0; T_DA=a3;T_CLK=1;T_CLK=0; T_DA=a4;T_CLK=1;T_CLK=0; T_DA=a5;T_CLK=1;T_CLK=0; T_DA=a6;T_CLK=1;T_CLK=0; T_DA=a7;T_CLK=1;T_CLK=0; } /************************************************** * 名称: OutputByte * 功能: 从DS1302读取1Byte数据 *返回值: ACC ****************************************************/ unsigned char outputbyte(void) { T_DA=1; a0=T_DA; T_CLK=1;T_CLK=0;a1=T_DA; T_CLK=1;T_CLK=0;a2=T_DA; T_CLK=1;T_CLK=0;a3=T_DA; T_CLK=1;T_CLK=0;a4=T_DA; T_CLK=1;T_CLK=0;a5=T_DA; T_CLK=1;T_CLK=0;a6=T_DA; T_CLK=1;T_CLK=0;a7=T_DA; return(ACC); } /************************************************** * 名称: InputByte * 功能: 往DS1302写入1Byte数据 * 返回值: 无 **************************************************/ void inputbyte(unsigned char x) { unsigned char i; ACC=x; for(i=0;i<8;i++) { T_DA=ACC0; T_CLK=1; T_CLK=0; ACC>>=1; } } /************************************************** * 名称: OutputByte * 功能: 从DS1302读取1Byte数据 *返回值: ACC ****************************************************/ unsigned char outputbyte(void) { unsigned char i; T_DA=1; for(i=0;i<8;i++) { ACC>>=1; ACC7=T_DA; T_CLK=1; T_CLK=0; } return(ACC); } (程序拷贝时可能会出现错误,在这里只想问一下这类问题,有小错误见谅) 现在的情况是,两者看起来,思路是完全一样的,但是编译后的代码确实相差很多,我主 要是从编译后提供的代码数上看,相差很多。另外,看到ACC=ACC>>1,在看汇编码时,发 现编译后代码非常繁琐,不是直接的汇编移位命令。后来,想到C51的库函数intrins.h中 有移位的命令,而且代码是内嵌的,我想应该用了它应该会代码少些,所以我改成 ACC=_cror_(ACC,1);但是,代码却更长了,而且也不象想象的那样(如_nop_()),有的网 友说,这是因为用了寄存器,要进行保护的,我就又定义了别的变量,但是汇编码也比广 州老赵(后一个程序是广州老赵的)的长,我现在就不知道了,怎么才能写出代码少一点 的c51程序?
     
 
@2000 - 2012