|
本帖最后由 zhiguangqi 于 2014-7-23 16:32 编辑
有俩C 的程序,一个是我写的,一个是例程,运行结果类似,当然例程写的很好,片子是PIC16F877A ,软件是HITECH C 9.83,除了程序不同,其他的条件都一样,我把程序直接贴上方便大家看。我的问题就是,这俩程序很多语句是一样的,我写的语句少,编译结果却大,而那个例程语句多,可是编译结果却小,为什么呢?百思不得其解!(我只想知道产生这个结果的原因,而不是程序好不好)
:先把我的贴上
#include <pic.h>
__CONFIG(FOSC_HS & WDTE_OFF & LVP_OFF);
const unsigned char led[] =
{
//定义表格一定要使用const,这样会做到程序存储区中
0B00111111, //"0"的字形表,0x3F
0B00000110, //"1"的字形表,0x06
0B01011011, //"2"的字形表,0x5B
0B01001111, //"3"的字形表,0x4F
0B01100110, //"4"的字形表,0x66
0B01101101, //"5"的字形表,0x6D
0B01111101, //"6"的字形表,0x7D
0B00000111, //"7"的字形表,0x07
0B01111111, //"8"的字形表,0x7F
0B01101111, //"9"的字形表,0x6F
};
void main (void)
{
unsigned int i;
unsigned char j;
TRISD = 0X0;
TRISB = 0X0;
PORTB = 0X0;
PORTD = 0X0;
while(1)
{
PORTD = 0;
if (++i > 9999) i = 0;
PORTD = led[i / 1000];
PORTB = 0X0;
PORTD = led[(i % 1000) / 100];
PORTB = 0X01;
PORTD = led[(i % 100) / 10];
PORTB = 0X02;
PORTD = led[i %10];
PORTB = 0X03;
for (j = 0; j < 200; j++);
}
}
我的程序的编译结果:
Memory Summary:
Program space used F5h ( 245) of 2000h words ( 3.0%)
Data space used 11h ( 17) of 170h bytes ( 4.6%)
EEPROM space used 0h ( 0) of 100h bytes ( 0.0%)
Configuration bits used 1h ( 1) of 1h word (100.0%)
ID Location space used 0h ( 0) of 4h bytes ( 0.0%)
这个是例程:
#include <pic.h> //调用PIC16F87XA单片机的头文件
//根据选项,配置字应该如下所示:
//__CONFIG(HS&WRTEN&WDTDIS&BOREN&PWRTDIS&UNPROTECT&DUNPROT&DEBUGDIS&LVPDIS);
//实际使用中,这样太麻烦,对于默认选项,我们将其忽略掉:
__CONFIG(FOSC_HS & WDTE_OFF & LVP_OFF);
//---------------------------------------
//数码管字形表,供显示时查询
const unsigned char LED[10]=
{ //定义表格一定要使用const,这样会做到程序存储区中
0B00111111, //"0"的字形表,0x3F
0B00000110, //"1"的字形表,0x06
0B01011011, //"2"的字形表,0x5B
0B01001111, //"3"的字形表,0x4F
0B01100110, //"4"的字形表,0x66
0B01101101, //"5"的字形表,0x6D
0B01111101, //"6"的字形表,0x7D
0B00000111, //"7"的字形表,0x07
0B01111111, //"8"的字形表,0x7F
0B01101111, //"9"的字形表,0x6F
};
//---------------------------------------
//4位数码管相关I/O设置
#define U5A RB0 //4位数码管单元的U5(74HC138)的A脚接在RB0口上
#define U5B RB1 //4位数码管单元的U5(74HC138)的B脚接在RB1口上
#define U5C RB2 //4位数码管单元的U5(74HC138)的C脚接在RB2口上
//---------------------------------------
//---------------------------------------
//名称: 主函数
//公司:宁波芯动电子有限公司
//网址:www.MovingChip.com
//日期:20121009
//---------------------------------------
void main(void) //主函数,单片机开机后就是从这个函数开始运行
{
unsigned char c=0; //定义一个char型变量,做延时用
unsigned char d=0; //定义一个char型变量,控制显示位置
unsigned char e=0; //定义一个char型变量,做延时用
unsigned int f=0; //定义一个int型变量,显示内容用,显示内容0-9999
TRISB=0B11111000; //初始化RB7-RB0的输入输出方向
TRISD=0B00000000; //初始化RD7-RD0的输入输出方向
PORTB=0B00000000; //初始化RB7-RB0的数值
PORTD=0B00000000; //初始化RD7-RD0的数值
while(1) //死循环,单片机初始化后,将一直运行这个死循环
{
for(c=0;c<200;c++);//做一个0-250的循环,不执行其他操作,只为延时
if(++e>10) //做一个延时,时间到将显示内容加1
{
e=0; //清零,为下一次延时做准备
if(++f>9999) f=0;//显示内容加1,因为只有4位显示,超过9999后归零
}
PORTD=0; //关一次显示,以免显示出鬼影
if(++d>3) d=0; //先将d加1,然后判断是否大于3,大于3归零
if(d==0) //如果d=0,显示千位
{
U5A=0; //U5A=0,U5B=0,U5C=0,选通数码管的千位进行显示
U5B=0; //U5A=0,U5B=0,U5C=0,选通数码管的千位进行显示
U5C=0; //U5A=0,U5B=0,U5C=0,选通数码管的千位进行显示
PORTD=LED[f/1000]; //将要显示的f的千位提取出来查表后送显示
}
else if(d==1) //如果d=1,显示百位
{
U5A=1; //U5A=1,U5B=0,U5C=0,选通数码管的百位进行显示
U5B=0; //U5A=1,U5B=0,U5C=0,选通数码管的百位进行显示
U5C=0; //U5A=1,U5B=0,U5C=0,选通数码管的百位进行显示
PORTD=LED[(f%1000)/100]; //将要显示的f的百位提取出来查表后送显示
}
else if(d==2) //如果d=2,显示十位
{
U5A=0; //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
U5B=1; //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
U5C=0; //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
PORTD=LED[(f%100)/10]; //将要显示的f的十位提取出来查表后送显示
}
else if(d==3) //如果d=3,显示个位
{
U5A=1; //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示
U5B=1; //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示
U5C=0; //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示
PORTD=LED[f%10]; //将要显示的f的个位提取出来查表后送显示
}
}
}
例程的编译结果:
Memory Summary:
Program space used EBh ( 235) of 2000h words ( 2.9%)
Data space used 13h ( 19) of 170h bytes ( 5.2%)
EEPROM space used 0h ( 0) of 100h bytes ( 0.0%)
Configuration bits used 1h ( 1) of 1h word (100.0%)
ID Location space used 0h ( 0) of 4h bytes ( 0.0%)
从编译结果来看是只差了10个字节,但是我的程序比例程还要短几十个语句,里外里可能差几十个字节
|
|