找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3250|回复: 20
打印 上一主题 下一主题
收起左侧

关于keil模块化编写程序的问题

[复制链接]
跳转到指定楼层
楼主
ID:169574 发表于 2017-3-10 10:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
keil 模块化编写程序时,可以在模块中添加main函数吗?如果不能那2个程序能用模块整合成一个吗?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:169574 发表于 2017-3-10 11:04 | 只看该作者
本帖最后由 Q_p 于 2017-3-10 20:22 编辑

#include<reg52.h>


sbit T_STR = P2^6;       //锁存引脚,屏上标识位STR
sbit R1    = P0^4;       //数据引脚,屏上标识R1
sbit G1    = P2^4;       //数据引脚,屏上标识G1
sbit T_CLK = P2^5;       //时钟引脚,屏上标识位CLK
sbit OE    = P2^7;       //使能引脚,屏上标识EN/OE

unsigned char MoveBitNum,MoveBitNumtemp,IncNum;//移动位数,临时移动位数,大于一个字节增加字节数
unsigned int HzNum;//汉字个数
unsigned char buff[10];

/*-----------------------------------------------
             16x16汉字取模数据
------------------------------------------------*/
unsigned char code hztest[][32]=    //取模选择字节倒序 ,正序得出的字是反的,可以在软件中设置自动倒叙
{


0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //前面一屏大小的空字符,不显示,这里根据屏的大小修改,这个是1个汉字屏
                                                                                 //所以写入1个汉字

0x80,0x00,0x84,0x00,0x88,0x3F,0x48,0x00,0xA1,0x1F,0x82,0x10,0x92,0x12,0x90,0x14,
0xE8,0x7F,0x88,0x10,0x47,0x12,0x44,0x14,0xC4,0x3F,0x04,0x10,0x04,0x0A,0x00,0x04,


0x80,0x00,0x80,0x00,0xFF,0x7F,0x80,0x00,0x80,0x00,0xFE,0x3F,0x12,0x24,0x22,0x22,
0xF2,0x27,0x82,0x20,0x82,0x20,0xFA,0x2F,0x82,0x20,0x82,0x20,0x82,0x28,0x02,0x10,


0x10,0x00,0xD0,0x7F,0x12,0x04,0x12,0x04,0x12,0x04,0x92,0x3F,0x92,0x24,0x92,0x24,
0x92,0x24,0x92,0x24,0x92,0x24,0x90,0x2C,0x88,0x14,0x08,0x04,0x04,0x04,0x02,0x04,


0x20,0x02,0x20,0x02,0xFF,0x7F,0x20,0x02,0x08,0x00,0x90,0x1F,0x92,0x10,0x84,0x10,
0xA4,0x10,0xA0,0x14,0x90,0x08,0x8E,0x40,0x88,0x40,0x88,0x40,0x08,0x7F,0x00,0x00,

0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0x7F,0x80,0x00,0x80,0x00,
0x40,0x01,0x40,0x01,0x20,0x02,0x20,0x02,0x10,0x04,0x08,0x08,0x04,0x10,0x03,0x60,

0x44,0x10,0x88,0x10,0x88,0x08,0x00,0x04,0xFE,0x7F,0x02,0x40,0x01,0x20,0xF8,0x07,
0x00,0x02,0x80,0x01,0xFF,0x7F,0x80,0x00,0x80,0x00,0x80,0x00,0xA0,0x00,0x40,0x00,



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //尾部的一屏的空字符,用于清屏,参数和屏大小有关。
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,


};
/*-----------------------------------------------
             向595写入一个字节 单红色
------------------------------------------------*/
void InputByte( unsigned  char DataR1) //写一个字节
{
unsigned  char i;
for(i=8; i>0; i--)
{
R1 = !(DataR1&0x01);                  
T_CLK = 0;
T_CLK = 1;
DataR1 = DataR1 >> 1;
}
}
/*-----------------------------------------------
             向595写入两个字节 双色
------------------------------------------------*/
void Input2Byte( unsigned  char DataR1,unsigned  char DataG1) //写一个字节
{
unsigned  char i;
for(i=8; i>0; i--)
{
R1 = !(DataR1&0x01);   
G1 = !(DataG1&0x01);               
T_CLK = 0;
T_CLK = 1;
DataR1 = DataR1 >> 1;
DataG1 = DataG1 >> 1;
}
}


/*-----------------------------------------------
                    延时程序
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}


/*-----------------------------------------------
                      主程序
------------------------------------------------*/
main()
{
unsigned char count;//16行扫描数据,范围0-15
unsigned int i,  j;
unsigned char temp;

while(1)
{


i++;
if(i==100)//更改流动速度,1T单片机和12T单片机速度大约5-8倍,注意更改参数
   {
   i=0;
   MoveBitNum++;
if(MoveBitNum==16)//每次移动完一个汉字大小后循环
    {
      MoveBitNum=0;
          HzNum+=1;    //调用下一个汉字
          if(HzNum>=50)//需要显示的汉字个数,包括前面的一屏空字符的个数,后面清屏的空字符不包含在内,这里是(汉字个数+1)
             HzNum=0;   //完全显示完后循环调用
    }
  }


Delay(1);//控制扫描频率
for(j=0;j<2;j++) //取每个汉字的前2个字节,
        {             //汉字个数+1
         buff[j+j]=hztest[HzNum+j][count+count];  //每次移动完一个汉字后,选择下一个汉字
         buff[j+j+1]=hztest[HzNum+j][count+count+1];
        }

  if(MoveBitNum<8)                   //  判读移动距离是大于一个字节还是小于一个字节,因为一个字节左移右移最大只能8位
          { IncNum=0; MoveBitNumtemp=MoveBitNum; }
  else
          { IncNum=1; MoveBitNumtemp=MoveBitNum-8;}//大于8就减去8得到的数值还是小于8

T_STR=0;       //锁存无效
  for(j=0;j<2;j++)          //按bit的方式移动缓冲区的内容,然后输出到595,即取出的数值每个字节左移一定的位数,
          {                                     //后面左移出的数据整合到前面的字节中,保持数据的连续性            
           temp=(buff[j+IncNum]>>MoveBitNumtemp)|(buff[j+1+IncNum]<<(8-MoveBitNumtemp));//这句比较重要,需要自行拿出2个字节的数据模拟分析
       InputByte(temp);//输出到595
          }//8个字节传输完锁存输出
  OE  = 1;
  P0=15-count;//用P0口的前4位控制16行,屏内部通过4-16译码器工作,循环扫描16行
  T_STR=1;      //锁存有效,此时一行的数据显示到屏上
  OE = 0;


count++;
if(count==16)
    count=0;
}
}


#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
sbit shcp=P2^0;         // 移位寄存时钟 1有效
sbit ds=P2^1;        // 输入
sbit stcp=P2^2;          //  输出时钟 1有效
sbit k1=P3^2;
sbit k2=P3^3;
uchar n=100;

//彩灯循环
uchar data_s[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //        逆时针流水灯
                                 0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,                                         //        闪烁
                                0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01, // 顺时针流水灯
                                0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00};
uchar data_s1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,
                0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,
                                0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00};

void delay(int x)
{
         unsigned a,b;
         for(a=x;a>0;a--)
         for(b=250;b>0;b--)        ;
}

void send(uchar aa)        // 74hc595控制
{               
        uchar c;
        for(c=0;c<8;c++) // 扫描每一个字节 0x01为1个 在内部左移
        {
                ds=aa>>7;
                aa<<=1;
                 shcp=0;         // 高电平有效  先赋0 再取1

                shcp=1;
                 }
        
         stcp=0;  //  高电平有效  先赋0 再取1

         stcp=1;
         
}         
void main()
{        uchar z;
        EA=1;
        EX0=1;EX1=1;
        IT0=1;IT1=1;
        while(1)
        {        for(z=0;z<48;z++){

                send(data_s[z]);
                send(data_s1[z]);

                delay(n);        

                        }}
        
}


void dis_1() interrupt 0
{        

        if(n<240&&k1==0)
        n=n+20;        
}

void dis_2() interrupt 2
{        

        if(n>0&&k2==0)
        n=n-10;        
}
回复

使用道具 举报

板凳
ID:169688 发表于 2017-3-10 17:05 | 只看该作者
顶一个
回复

使用道具 举报

地板
ID:111517 发表于 2017-3-10 20:09 | 只看该作者
不能啊,肯定只能有一个MAIN函数,其余的函数你可以只要名字不一样就好了,主函数重新写下

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:169574 发表于 2017-3-10 20:58 | 只看该作者
沧浪 发表于 2017-3-10 20:09
不能啊,肯定只能有一个MAIN函数,其余的函数你可以只要名字不一样就好了,主函数重新写下

我不太理解是把其他函数编程模块吗?
回复

使用道具 举报

6#
ID:48413 发表于 2017-3-10 21:39 | 只看该作者
不能的啊
回复

使用道具 举报

7#
ID:169574 发表于 2017-3-10 22:00 | 只看该作者

那应该怎么写一个点阵和流水灯的程序,我不知道怎么才能实现他们一起工作的程序
回复

使用道具 举报

8#
ID:169574 发表于 2017-3-10 22:00 | 只看该作者

那应该怎么写一个点阵和流水灯的程序,我不知道怎么才能实现他们一起工作的程序
回复

使用道具 举报

9#
ID:151348 发表于 2017-3-10 22:06 | 只看该作者
吧点阵驱动程序写成一个c文件,把流水灯的程序写成一个c文件,再写个包涵main函数的c文件,把这三个c文件都添加到keil中,在包涵main函数的c文件里写具体实现过程,比如调用其他两个c文件里的函数

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

10#
ID:169574 发表于 2017-3-10 22:21 | 只看该作者
imxuheng 发表于 2017-3-10 22:06
吧点阵驱动程序写成一个c文件,把流水灯的程序写成一个c文件,再写个包涵main函数的c文件,把这三个c文件都 ...

那那些定义之类的说明和驱动程序是写在各自的C文件中还是写在main函数的文件中?我自己写过一下,感觉有些问题……所以想问具体些
回复

使用道具 举报

11#
ID:151348 发表于 2017-3-11 09:12 | 只看该作者
Q_p 发表于 2017-3-10 22:21
那那些定义之类的说明和驱动程序是写在各自的C文件中还是写在main函数的文件中?我自己写过一下,感觉有 ...

估计你应该已经明白了,就是与某个模块(比如LCD1602、IIC驱动)相关的变量和函数放在同一个C文件下,然后在如果需要用某个模块的函数,就在包含main的C文件里调用

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

12#
ID:169574 发表于 2017-3-11 09:42 | 只看该作者
imxuheng 发表于 2017-3-11 09:12
估计你应该已经明白了,就是与某个模块(比如LCD1602、IIC驱动)相关的变量和函数放在同一个C文件下,然 ...

嗯 好像有些明白了。我在试一下 。谢谢
回复

使用道具 举报

13#
ID:169574 发表于 2017-3-11 10:02 | 只看该作者
imxuheng 发表于 2017-3-11 09:12
估计你应该已经明白了,就是与某个模块(比如LCD1602、IIC驱动)相关的变量和函数放在同一个C文件下,然 ...

写好各个c文件之后需要用模块化方式关联一下各个文件吗?还是直接在main里调用
回复

使用道具 举报

14#
ID:169574 发表于 2017-3-11 10:58 | 只看该作者
imxuheng 发表于 2017-3-11 09:12
估计你应该已经明白了,就是与某个模块(比如LCD1602、IIC驱动)相关的变量和函数放在同一个C文件下,然 ...

我自己改了一下程序,编译通过了,也用开发板试过了,然后就发现问题了。。main函数中调用2个C文件,led在前点阵就不能用,点阵在前led就不能用,能不能让他们一起工作?(不知道是不是陷在各自的循环里了才不能一起工作)
可能我main函数写的有问题,或者一直都是在云里雾里的。。。
下面的是我的main函数,dianzhen和led是各自的程序。不知道我理解得对不对。
#include<reg51.h>
#include<intrins.h>
void main()
{
        dianzhen();       
        led();               
}

评分

参与人数 1黑币 +100 收起 理由
admin + 100 赞一个!

查看全部评分

回复

使用道具 举报

15#
ID:123289 发表于 2017-3-11 10:59 | 只看该作者
单片机上电后从何处开始执行呢?
C规定:从MIAN开始。
如果有多个MIAN,楼主打算让计算机从从何处理开始执行呢?
建议如下:
假设有MIAN1、MIAN2、MIAN3……,那么就做一个MIAN,在MIAN中依序执行MIAN1、MIAN2、MIAN3……。你看这个建议可行不?

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

16#
ID:169574 发表于 2017-3-13 12:00 | 只看该作者
yzwzfyz 发表于 2017-3-11 10:59
单片机上电后从何处开始执行呢?
C规定:从MIAN开始。
如果有多个MIAN,楼主打算让计算机从从何处理开始 ...

我也不清楚,我写程序不太行
回复

使用道具 举报

17#
ID:168475 发表于 2017-3-13 20:43 | 只看该作者
有一个主函数  其他的模块函数都单独写 并且配一个.h文件

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

18#
ID:169574 发表于 2017-3-15 09:39 | 只看该作者
人生kui 发表于 2017-3-13 20:43
有一个主函数  其他的模块函数都单独写 并且配一个.h文件

.h函数是这样写吗?比如写个led的
#ifndef_LED_H_
#include_LED_H_
void led();(这里需要写具体函数吗,还是就这么简单就ok了)
#endif
回复

使用道具 举报

19#
ID:137261 发表于 2017-3-16 17:31 | 只看该作者
一个程序只能有一个Main。只要没有复用那么整合成一个很容易的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表