打印

有个小问题向前辈们请教

[复制链接]
2022|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fds_yctc|  楼主 | 2008-5-20 10:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
可是我第一次写一个程序就把我给难住了,程序很简单,用的是PIC16F505芯片,她有1K字的大小,可我写的程序编译达到500多字节就说放不下,我的主程序只是调用同一个子程序,只是形参不同而已,多调用一次就不够,少一次就可以,我用的PICC8.05编译器,望前辈们能在百忙之中看一下,非常感谢!
c程序如下:
#include<pic.h>
//#include<pic16505.h>
#define uchar unsigned char
#define Classes 100

/************************************************
Start       一种颜色的起始色级
Over        一种颜色的结束色级
Delay20ms   一个色级保持时间的20ms数  
Color11     第一种基色的PORTB数据
color21     第一种基色的PORTC数据
Color12     第二种基色的PORTB数据
Color22     第二种基色的PORTC数据
*************************************************/

/*
void Change(static uchar Start,static uchar Over,static uchar Delay20ms,
static uchar Color11,static uchar Color21,static uchar Color12,static uchar Color22);
*/

void Change(uchar Start,uchar Over,uchar Delay20ms,
uchar Color11,uchar Color21,uchar Color12,uchar Color22)
{
    uchar m,Color_nb; 
    
    for(Color_nb=Start;Color_nb<Over;Color_nb++)
    {
        TMR0=0;
        while(TMR0<Delay20ms)          /*在Delay20ms内俩种基色交替亮*/
        {
            asm("clrWDT");
            for(m=0;m<(Classes-Color_nb);m++)  /*第一种基色亮的时间*/
            {
               PORTB=Color11;
               PORTC=Color21;
            }
            for(m=0;m<Color_nb;m++)        /*第二种基色亮的时间*/
            {
               PORTB=Color12;
               PORTC=Color22;
            }
        }
    }
}        
    
void main()
{
    uchar n;
    OPTION=0X20;
    TRISB=0X00;
    TRISC=0X20;
    PORTB&=0X00;
    PORTC&=0X20;
    while(1)
    {
//        Change(0,1,50,0x24,0x01,0x24,0x01);       /*红保持2秒*/
//        Change(0,1,50,0x02,0x12,0x02,0x12);       /*绿保持2秒*/
        Change(0,1,50,0x01,0x0c,0x01,0x0c);       /*兰保持2秒*/
        Change(30,31,50,0x24,0x01,0x02,0x12);     /*橙保持2秒*/
        Change(70,71,50,0x24,0x01,0x02,0x12);     /*黄保持2秒*/        
        Change(50,51,50,0x02,0x12,0x01,0x0c);     /*青保持2秒*/        
        Change(50,51,50,0x01,0x0c,0x24,0x01);     /*紫保持2秒*/
        Change(0,1,50,0x27,0x1f,0x27,0x1f);       /*白保持2秒*/
        
        Change(0,100,1,0x27,0x1f,0x24,0x01);       /*红固定,绿蓝递减*/ 
        Change(0,100,1,0x24,0x01,0x25,0x0d);       /*红固定,蓝递增*/ 
        Change(0,100,1,0x25,0x0d,0x01,0x0c);       /*蓝固定,红递减*/
        Change(0,100,1,0x01,0x0c,0x03,0x1e);       /*蓝固定,绿递增*/
        Change(0,100,1,0x03,0x1e,0x02,0x12);       /*绿固定,蓝递减*/ 
        Change(0,100,1,0x02,0x12,0x26,0x13);       /*绿固定,红递增*/
        Change(0,100,1,0x26,0x13,0x24,0x01);       /*红固定,绿递减*/ 
        Change(0,100,1,0x24,0x01,0x27,0x1f);       /*红固定,绿蓝递增*/
        
        for(n=0;n<10;n++)
        {
            Change(0,1,10,0x21,0x02,0x21,0x02);       /*三段R-G-B保持0.2秒*/        
            Change(0,1,10,0x04,0x14,0x04,0x14);       /*三段G-B-R保持0.2秒*/
            Change(0,1,10,0x02,0x09,0x02,0x09);          /*三段B-R-G保持0.2秒*/
        }
        
        for(n=0;n<10;n++)                          /*红绿蓝交替亮*/
        {                                          /*每次0.2秒*/
            Change(0,1,10,0x24,0x01,0x24,0x01);    /*共10次 */    
            Change(0,1,10,0x02,0x12,0x02,0x12);       
            Change(0,1,10,0x01,0x0c,0x01,0x0c);      
        }
        
        Change(0,1,25,0x27,0x1f,0x27,0x1f);       /*白保持1秒*/
        Change(0,1,25,0x27,0x07,0x27,0x07);       /*红白白保持1秒*/
        Change(0,1,25,0x27,0x01,0x27,0x01);       /*红红白保持1秒*/
        Change(0,1,25,0x24,0x01,0x24,0x01);       /*红红红保持1秒*/
        
        Change(0,1,25,0x27,0x1f,0x27,0x1f);       /*白保持1秒*/
        Change(0,1,25,0x04,0x11,0x04,0x11);       /*绿红红保持1秒*/
        Change(0,1,25,0x04,0x12,0x04,0x12);       /*绿绿红保持1秒*/
        Change(0,1,25,0x02,0x12,0x02,0x12);       /*绿绿绿保持1秒*/
         
        //Change(0,60,2,0x24,0x01,0x02,0x12);        /*红平滑到橙 2.4秒 */
        //Change(60,130,2,0x24,0x01,0x02,0x12);      /*橙平滑到黄 2.8秒 */
        //Change(130,200,2,0x24,0x01,0x02,0x12);     /*黄平滑到绿 2.8秒 */
        //Change(0,100,1,0x02,0x12,0x01,0x0c);       /*绿平滑到青 2秒*/
        //Change(100,200,1,0x02,0x12,0x01,0x0c);     /*青平滑到兰 2秒*/
        //Change(0,100,1,0x01,0x0c,0x24,0x01);       /*兰平滑到紫 2秒*/
        //Change(100,200,1,0x01,0x0c,0x24,0x01);     /*紫平滑到红 2秒*/
        
        //Change(0,200,1,0x24,0x01,0x02,0x12);         /*红平滑到绿 历时4秒 */
        //Change(0,200,1,0x02,0x12,0x01,0x0c);         /*绿平滑到蓝 历时4秒 */
        //Change(0,200,1,0x01,0x0c,0x24,0x01);         /*蓝平滑到红 历时4秒 */
        
        
        
    }
}
沙发
machunshui| | 2008-5-20 17:28 | 只看该作者

搞定了,楼主编译一下这个代码

#include<pic.h>
//#include<pic16505.h>
typedef unsigned char uchar;
#define Classes 100

/************************************************
Start       一种颜色的起始色级
Over        一种颜色的结束色级
Delay20ms   一个色级保持时间的20ms数  
Color11     第一种基色的PORTB数据
color21     第一种基色的PORTC数据
Color12     第二种基色的PORTB数据
Color22     第二种基色的PORTC数据
*************************************************/

/*
void Change(static uchar Start,static uchar Over,static uchar Delay20ms,
static uchar Color11,static uchar Color21,static uchar Color12,static uchar Color22);
*/

void Change(uchar Start,uchar Over,uchar Delay20ms,
uchar Color11,uchar Color21,uchar Color12,uchar Color22)
{
    uchar m,Color_nb;
    
    for(Color_nb=Start;Color_nb<Over;Color_nb++)
    {
        TMR0=0;
        while(TMR0<Delay20ms)          /*在Delay20ms内俩种基色交替亮*/
        {
            asm("clrWDT");
            for(m=0;m<(Classes-Color_nb);m++)  /*第一种基色亮的时间*/
            {
               PORTB=Color11;
               PORTC=Color21;
            }
            for(m=0;m<Color_nb;m++)        /*第二种基色亮的时间*/
            {
               PORTB=Color12;
               PORTC=Color22;
            }
        }
    }
}

void change2(void)
{
        Change(0,1,25,0x27,0x1f,0x27,0x1f);       /*白保持1秒*/
        Change(0,1,25,0x27,0x07,0x27,0x07);       /*红白白保持1秒*/
        Change(0,1,25,0x27,0x01,0x27,0x01);       /*红红白保持1秒*/
        Change(0,1,25,0x24,0x01,0x24,0x01);       /*红红红保持1秒*/
        
        Change(0,1,25,0x27,0x1f,0x27,0x1f);       /*白保持1秒*/
        Change(0,1,25,0x04,0x11,0x04,0x11);       /*绿红红保持1秒*/
        Change(0,1,25,0x04,0x12,0x04,0x12);       /*绿绿红保持1秒*/
        Change(0,1,25,0x02,0x12,0x02,0x12);       /*绿绿绿保持1秒*/
         
        Change(0,60,2,0x24,0x01,0x02,0x12);        /*红平滑到橙 2.4秒 */
        Change(60,130,2,0x24,0x01,0x02,0x12);      /*橙平滑到黄 2.8秒 */
        Change(130,200,2,0x24,0x01,0x02,0x12);     /*黄平滑到绿 2.8秒 */
        Change(0,100,1,0x02,0x12,0x01,0x0c);       /*绿平滑到青 2秒*/
        Change(100,200,1,0x02,0x12,0x01,0x0c);     /*青平滑到兰 2秒*/
        Change(0,100,1,0x01,0x0c,0x24,0x01);       /*兰平滑到紫 2秒*/
        Change(100,200,1,0x01,0x0c,0x24,0x01);     /*紫平滑到红 2秒*/
        
        Change(0,200,1,0x24,0x01,0x02,0x12);         /*红平滑到绿 历时4秒 */
        Change(0,200,1,0x02,0x12,0x01,0x0c);         /*绿平滑到蓝 历时4秒 */
        Change(0,200,1,0x01,0x0c,0x24,0x01);         /*蓝平滑到红 历时4秒 */

}        
    
void main()
{
    uchar n;
    OPTION=0X20;
    TRISB=0X00;
    TRISC=0X20;
    PORTB&=0X00;
    PORTC&=0X20;
    while(1)
    {
        Change(0,1,50,0x24,0x01,0x24,0x01);       /*红保持2秒*/
       Change(0,1,50,0x02,0x12,0x02,0x12);       /*绿保持2秒*/
        Change(0,1,50,0x01,0x0c,0x01,0x0c);       /*兰保持2秒*/
        Change(30,31,50,0x24,0x01,0x02,0x12);     /*橙保持2秒*/
        Change(70,71,50,0x24,0x01,0x02,0x12);     /*黄保持2秒*/        
        Change(50,51,50,0x02,0x12,0x01,0x0c);     /*青保持2秒*/        
        Change(50,51,50,0x01,0x0c,0x24,0x01);     /*紫保持2秒*/
        Change(0,1,50,0x27,0x1f,0x27,0x1f);       /*白保持2秒*/
        
        Change(0,100,1,0x27,0x1f,0x24,0x01);       /*红固定,绿蓝递减*/
        Change(0,100,1,0x24,0x01,0x25,0x0d);       /*红固定,蓝递增*/
        Change(0,100,1,0x25,0x0d,0x01,0x0c);       /*蓝固定,红递减*/
        Change(0,100,1,0x01,0x0c,0x03,0x1e);       /*蓝固定,绿递增*/
        Change(0,100,1,0x03,0x1e,0x02,0x12);       /*绿固定,蓝递减*/
        Change(0,100,1,0x02,0x12,0x26,0x13);       /*绿固定,红递增*/
        Change(0,100,1,0x26,0x13,0x24,0x01);       /*红固定,绿递减*/
        Change(0,100,1,0x24,0x01,0x27,0x1f);       /*红固定,绿蓝递增*/
        
        for(n=0;n<10;n++)
        {
            Change(0,1,10,0x21,0x02,0x21,0x02);       /*三段R-G-B保持0.2秒*/        
            Change(0,1,10,0x04,0x14,0x04,0x14);       /*三段G-B-R保持0.2秒*/
            Change(0,1,10,0x02,0x09,0x02,0x09);          /*三段B-R-G保持0.2秒*/
        }
        
        for(n=0;n<10;n++)                          /*红绿蓝交替亮*/
        {                                          /*每次0.2秒*/
            Change(0,1,10,0x24,0x01,0x24,0x01);    /*共10次 */    
            Change(0,1,10,0x02,0x12,0x02,0x12);       
            Change(0,1,10,0x01,0x0c,0x01,0x0c);      
        }
       
        change2(); 
    }
}

使用特权

评论回复
板凳
machunshui| | 2008-5-20 17:34 | 只看该作者

把部分代码移动到change2函数

把部分代码移动到change2函数,

主函数main调用change2即可。

picc默认一个函数编为一段,楼主原来的程序,
main()函数作为一个段来链接,
main()函数的大小在512字(即一个物理程序存储器分段)的边界上,
所以不行。

把部分代码移动到change2函数里,
change2()函数单独编译为一个程序段
main()函数的大小就减小了,就能够存储到一个512字的物理程序存储器的段上了.

使用特权

评论回复
地板
machunshui| | 2008-5-20 18:07 | 只看该作者

遇到这样的链接问题,首先看map文件

遇到这样的链接问题,首先看map文件,
查看生成的程序段的链接地址,
看看程序段的分布是不是有问题.

另外,可以参考能链接过去的程序生成的map文件,和链接不过去的map文件对比,
这样比较容易找出问题之所在

使用特权

评论回复
5
ayb_ice| | 2008-5-20 19:39 | 只看该作者

C里写程序虽然不用切页

但一个程序不能大于一页,否则会装不下一页,也会出错

使用特权

评论回复
6
lifengtao| | 2008-5-20 20:59 | 只看该作者

呵呵 你这个项目是什么光嫩肤美容的吧,再摸上些药膏~

我也做过类似的东西,用16F73,控制几个按键和5,6种颜色的灯,忽快忽慢的闪着,也是按客户要求仿制别人的,后来项目夭折了,给了一半钱,做成了,人不见了~~~ 仿制的那东西好像是叫CLEAR~~~
我是用汇编写的,感觉还不错,其实16F的用汇编真的不错。有兴趣可以讨论讨论~

使用特权

评论回复
7
machunshui| | 2008-5-21 08:33 | 只看该作者

程序的连接段,不能大于一个存储页

"但一个程序不能大于一页,否则会装不下一页,也会出错"

不是一个程序,而是一个程序的连接段,不能大于一个存储页,
一般picc,一个函数编作为一个程序的连接段。

使用特权

评论回复
8
richardvip| | 2008-5-21 12:45 | 只看该作者

是不是也和编译器版本有关呀

我用picc9.6就可以编译通过呀

使用特权

评论回复
9
machunshui| | 2008-5-21 13:45 | 只看该作者

不大可能吧?

8楼用picc9.6通过楼主的程序了吗?

我picc 9.60,picc8.05都试过,是不行的。

而且楼主的代码,是可以编译通过的,
关键是把楼主的屏蔽掉的函数调用代码全加上,
8楼,能通过吗?

使用特权

评论回复
10
richardvip| | 2008-5-21 14:47 | 只看该作者

不好意思,我没有把楼主屏蔽掉的函数加上

加上后,确实有问题,根据报的错误,把main函数分成几段,就可以编译通过了,不过我有个疑问,如果程序很大,有很多文件,我如何锁定出错的代码段,并将其分割呢

使用特权

评论回复
11
machunshui| | 2008-5-21 15:25 | 只看该作者

其实,函数不应该太大

其实,函数不应该太大。
以前,我的领导跟我们说,函数一般最大不要超过一屏幕。

当然,如果发生了问题
map文件里面,有详细的代码段定位情况

使用特权

评论回复
12
richardvip| | 2008-5-21 16:29 | 只看该作者

machunshui再请教你一个问题

在picc中你使用过malloc函数没有,我为何不能调用

使用特权

评论回复
13
machunshui| | 2008-5-21 16:46 | 只看该作者

picc中,没用过malloc

picc中,没用过malloc。

这种小的片子,用动态分配,得不偿失。

用pic16,我尽可能用全局变量,连带参数传递的函数,都很少用。

甚至,连函数都不用,直接用宏定义代替.

如果你不能用malloc,可能是编译器不支持吧

使用特权

评论回复
14
richardvip| | 2008-5-22 11:15 | 只看该作者

可是picc中stdlib中还有这个函数,真是奇怪

使用特权

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

本版积分规则

1

主题

1

帖子

0

粉丝