当前位置:编程学习 > C/C++ >>

C语言求优化?

//////////////////////////////
//12864串口调试
//目的:通过12864串行方式显示
//
//编程人:赵升良
//编程时间:2012年5月23日
//
/////////////////////////////


#include<reg52.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
sbit cs=P3^0;
sbit sid=P3^1;
sbit e=P3^2;

void dly(uint z);//延时
void inin();//显示屏初始化
void xzl(uchar xzl);//显示屏写指令
void xsj(uchar xsj);//显示写数据
void  jpsr();//键盘输入
void tzcx(uchar z);//开,关,确定,否定,跳转
void dyy();//显示进入页面“欢迎使用”
void szjm();//进入设置界面
void xplz();//写频率
void xmm();//写密码
void szpd(uchar c);//键盘数值判断
/////////////////////////////z
uchar num[]="    欢迎使用    ";
uchar num1[]="0123456789.";
uchar num2[]="    初值设定    ";
uchar num3[]="频率:          M";
uchar num4[]="密码: 【      】";
uchar num5[]="确定        否定";


/*以上为第一页显示

/////////////////////////////
uchar num2[]="";
uchar num3[]="";
uchar num4[]="                ";
uchar num5[]="                ";
//以上为第二页显示
/////////////////////////////
*/
void main()
{ uint i;
 inin();//显示进入初始化
 dly(10);
/////////////////////////////

 dyy();//开机界面

 P2=0x0f;
  while(P2==0x0f)
 {
  ;
 }//判断有没有按下按键,好进入下个页面进行操作

 szjm();//有按下进入设置界面
 

 while(1);

 

}

/////////以上为主程序
 
void dyy()
{ int i;
 xzl(0x90);//显示在第二行
 i=0;
 while(i<16)
 {
 xsj(num[i]);
 i++;
 dly(1);
 }
 dly(1000);
}
/////////显示第一页第二行"欢迎使用"


void szjm()
{ uint i;
 xzl(0x01);//清屏为清除“欢迎使用”
 xzl(0x80);//起始地址 

 i=0;
 while(i<16)
 {
 xsj(num2[i]);
 i++;
 dly(1);
 }//写第二页第一排 显示初值设定

 xzl(0x90);
 i=0;
 while(i<16)
 {
 xsj(num3[i]);
 i++;
 dly(1);
 }//写第二页第二排 显示频率:    M

 xzl(0x88);
 i=0;
 while(i<16)
 {
 xsj(num4[i]);
 i++;
 dly(1);
 }//写第二页第三排 显示密码:

 xzl(0x98);
 i=0;
 while(i<16)
 {
 xsj(num5[i]);
 i++;
 dly(1);
 }//写第二页第四排 显示确定和否定
 
 xplz();//写频率值
 xmm();//写密码

}
/////////////////以上为进入设置程序

 

void jpsr()
{
 uchar a,b,c;
 P2=0x0f;
 while(P2==0x0f)//判断有没有按下按键
 {
  ;//无意义
 }

 a=P2;
 xzl(0x0d);

 P2=0xf0;
 while(P2==0xf0)
 {
  ;//无意义
 }
 b=P2;

 
 c=a+b;
 szpd(c);
}
/////////////以上为键盘输入程序

void szpd(uchar c)
{
 switch(c)
 {
  case 0xee:xsj(num1[1]);break;
  case 0xde:xsj(num1[2]);break;
  case 0xbe:xsj(num1[3]);break;
  case 0x7e:tzcx(c);break;//不输出,此为下

  case 0xed:xsj(num1[4]);break;
  case 0xdd:xsj(num1[5]);break;
  case 0xbd:xsj(num1[6]);break;
  case 0x7d:tzcx(c);break;//不输出,此为下

  case 0xeb:xsj(num1[7]);break;
  case 0xdb:xsj(num1[8]);break;
  case 0xbb:xsj(num1[9]);break;
  case 0x7b:tzcx(c);break;//确定键,跳转到需要的指令

  case 0xe7:tzcx(c);break;//是

  case 0xd7:xsj(num1[0]);break;

  case 0xb7:tzcx(c);break;//否
  case 0x77:tzcx(c);break;//否定键,跳转到需要的指令
 }

 dly(500);
}

void tzcx(uchar z)
{
  switch(z)
  {
   case 0x7e:xplz();break;//为上
   case 0x7d:xmm();break;//为下
   case 0xe7:xplz();break;//开
   case 0xb7:xplz();break;//关
   case 0x7b:xplz();break;//确定键,跳转到需要的指令
   case 0x77:xplz();break;//否定键,跳转到需要的指令
  }
}
///////////跳转程序


void xplz()
{
 xzl(0x93);
 jpsr();
 jpsr();
 jpsr();
 xsj(num1[10]);
 jpsr();
 jpsr();
 jpsr();
 jpsr();
}
///////////////写频率

void xmm()
{
 xzl(0x8c);
 jpsr();
 jpsr();
 jpsr();
 jpsr();
 jpsr();
 jpsr();
}
//////////////写密码,六位

 


void inin()
{
 xzl(0x30);
 xzl(0x0c);
 xzl(0x01);
 xzl(0x06);
}
/////////显示初始化


void xzl(uchar xzl)
{
 uint a;
 cs=1;
 sid=1;
 a=5;
 while(a>0)
 { e=1;
  e=0;
  a--;
 }//前五位确认码 

 sid=0;
 a=3;
 while(a>0)
 { e=1;
  e=0;
  a--;
 }//设置后三位rw和rs还有个0

 a=4;
 while(a>0)
 { xzl<<=1;
  sid=CY;
  e=1;
  e=0;
  a--;
 }//高四位数据
 
 a=4;

 while(a>0)
 { sid=0;
  e=1;
  e=0;
  a--;
 }//送四个0
 
 a=4;
 while(a>0)
 { xzl<<=1;
  sid=CY;
  e=1;
  e=0;
  a--;
 }//低四位数据 

 a=4;
 while(a>0)
 { sid=0; 
  e=1;
  e=0;
  a--;
 }//送四个0
 cs=0;
 dly(1);

}

 

void xsj(uchar xsj)
{
 uint a;
 cs=1;
 sid=1;
 a=5;
 while(a>0)
 { e=1;
  e=0;
  a--;
 }//前五位确认码 

 sid=0;
 e=1;
 e=0;
 sid=1;
 e=1;
 e=0;
 sid=0;
 e=1;
 e=0;

 a=4;
 while(a>0)
 { xsj<<=1;
  sid=CY;//把数据腻出送到传送数据
  e=1;
  e=0;
  a--;
 }//高四位数据
 
 a=4;
 while(a>0)
 { sid=0;
  e=1;
  e=0;
  a--;
 }//送四个0
 
 a=4;
 while(a>0)
 { xsj<<=1;
  sid=CY;
  e=1;
  e=0;
  a--;
 }//低四位数据 

 a=4;
 while(a>0)
 { sid=0;
  e=1;
  e=0;
  a--;
 }//送四个0
 cs=0;
 dly(1);

}


void dly(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
 for(y=112;y>0;y--);
}

补充: 初学,求细化,,,只要指点一下,那里可以用占用空间小的语言代替就可以了。。。多谢

 

答案:一般程序如果要进行优化,通常情况下是指优化程序代码或程序执行速度。优化代码和优化速度实际上是一个予盾的统一,一般是优化了代码的尺寸,就会带来执行时间的增加,如果优化了程序的执行速度,通常会带来代码增加的副作用,很难鱼与熊掌兼得,只能在设计时掌握一个平衡点。

一、程序结构的优化

1、表达式

对于一个表达式中各种运算执行的优先顺序不太明确或容易混淆的地方,应当采用圆括号明确指定它们的优先顺序。一个表达式通常不能写得太复杂,如果表达式太复杂,时间久了以后,自己也不容易看得懂,不利于以后的维护。

2、程序的书写结构

虽然书写格式并不会影响生成的代码质量,但是在实际编写程序时还是应该尊循一定的书写规则,一个书写清晰、明了的程序,有利于以后的维护。在书写程序时,特别是对于While、for、do…while、if…elst、switch…case等语句或这些语句嵌套组合时,应采用”缩格”的书写形式,

3、减少判断语句

能够使用条件编译(ifdef)的地方就使用条件编译而不使用if语句,有利于减少编译生成的代码的长度,能够不用判断语句则少用判断用语句。

4、标识符

程序中使用的用户标识符除要遵循标识符的命名规则以外,一般不要用代数符号(如a、b、x1、y1)作为变量名,应选取具有相关含义的英文单词(或缩写)或汉语拼音作为标识符,以增加程序的可读性,如:count、number1、red、work等。

5、定义常数

在程序化设计过程中,对于经常使用的一些常数,如果将它直接写到程序中去,一旦常数的数值发生变化,就必须逐个找出程序中所有的常数,并逐一进行修改,这样必然会降低程序的可维护性。因此,应尽量当采用预处理命令方式来定义常数,而且还可以避免输入错误。

二、代码的优化

1、使用自加、自减指令

通常使用自加、自减指令和复合赋值表达式(如a-=1及a+=1等)都能够生成高质量的程序代码,编译器通常都能够生成inc和dec之类的指令,而使用a=a+1或a=a-1之类的指令,有很多C编译器都会生成二到三个字节的指令。在AVR单片适用的ICCAVR、GCCAVR、IAR等C编译器以上几种书写方式生成的代码是一样的,也能够生成高质量的inc和dec之类的的代码。

2、查表

在程序中一般不进行非常复杂的运算,如浮点数的乘除及开方等,以及一些复杂的数学模型的插补运算,对这些即消耗时间又消费资源的运算,应尽量使用查表的方式,并且将数据表置于程序存储区。如果直接生成所需的表比较困难,也尽量在启动时先计算,然后在数据存储器中生成所需的表,后以在程序运行直接查表就可以了,减少了程序执行过程中重复计算的工作量。

3、使用尽量小的数据类型

能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用整型变量定义的变量就不要用长整型(long int),能不使用浮点型(float)变量就不要使用浮点型变量。当然,在定义变量后不要超过变量的作用范围,如果超过变量的范围赋值,C编译器并不报错,但程序运行结果却错了,而且这样的错误很难发现。在ICCAVR中,可以在Options中设定使用printf参数,尽量使用基本型参数(%c、%d、%x、%X、%u和%s格式说明符),少用长整型参数(%ld、%lu、%lx和%lX格式说明符),至于浮点型的参数(%f)则尽量不要使用,其它C编译器也一样。在其它条件不变的情况下,使用%f参数,会使生成的代码的数量增加很多,执行速度降低。

4、选择合适的算法和数据结构

应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍。将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大提高程序执行的效率选择一种合适的数据结构也很重要,比如你在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。数组与指针语句具有十分密码的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。但是在Keil中则相反,使用数组比使用的指针生成的代码更短。

http://www.xiaolaoweng.com/89.html

keil编译不出hex文件??
还是啥啊,一般单片机这点程序是可以烧写的
是不是编译时显示,target not create,液晶字库占用静态空间太大,在液晶定义的符号前面加上code

上一个:c语言简单问题
下一个:C语言怎么弄?

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,