找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4418|回復(fù): 20
打印 上一主題 下一主題
收起左側(cè)

關(guān)于keil模塊化編寫程序的問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:169574 發(fā)表于 2017-3-10 10:30 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
keil 模塊化編寫程序時(shí),可以在模塊中添加main函數(shù)嗎?如果不能那2個(gè)程序能用模塊整合成一個(gè)嗎?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:169574 發(fā)表于 2017-3-10 11:04 | 只看該作者
本帖最后由 Q_p 于 2017-3-10 20:22 編輯

#include<reg52.h>


sbit T_STR = P2^6;       //鎖存引腳,屏上標(biāo)識(shí)位STR
sbit R1    = P0^4;       //數(shù)據(jù)引腳,屏上標(biāo)識(shí)R1
sbit G1    = P2^4;       //數(shù)據(jù)引腳,屏上標(biāo)識(shí)G1
sbit T_CLK = P2^5;       //時(shí)鐘引腳,屏上標(biāo)識(shí)位CLK
sbit OE    = P2^7;       //使能引腳,屏上標(biāo)識(shí)EN/OE

unsigned char MoveBitNum,MoveBitNumtemp,IncNum;//移動(dòng)位數(shù),臨時(shí)移動(dòng)位數(shù),大于一個(gè)字節(jié)增加字節(jié)數(shù)
unsigned int HzNum;//漢字個(gè)數(shù)
unsigned char buff[10];

/*-----------------------------------------------
             16x16漢字取模數(shù)據(jù)
------------------------------------------------*/
unsigned char code hztest[][32]=    //取模選擇字節(jié)倒序 ,正序得出的字是反的,可以在軟件中設(shè)置自動(dòng)倒敘
{


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, //前面一屏大小的空字符,不顯示,這里根據(jù)屏的大小修改,這個(gè)是1個(gè)漢字屏
                                                                                 //所以寫入1個(gè)漢字

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, //尾部的一屏的空字符,用于清屏,參數(shù)和屏大小有關(guān)。
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,


};
/*-----------------------------------------------
             向595寫入一個(gè)字節(jié) 單紅色
------------------------------------------------*/
void InputByte( unsigned  char DataR1) //寫一個(gè)字節(jié)
{
unsigned  char i;
for(i=8; i>0; i--)
{
R1 = !(DataR1&0x01);                  
T_CLK = 0;
T_CLK = 1;
DataR1 = DataR1 >> 1;
}
}
/*-----------------------------------------------
             向595寫入兩個(gè)字節(jié) 雙色
------------------------------------------------*/
void Input2Byte( unsigned  char DataR1,unsigned  char DataG1) //寫一個(gè)字節(jié)
{
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;
}
}


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


/*-----------------------------------------------
                      主程序
------------------------------------------------*/
main()
{
unsigned char count;//16行掃描數(shù)據(jù),范圍0-15
unsigned int i,  j;
unsigned char temp;

while(1)
{


i++;
if(i==100)//更改流動(dòng)速度,1T單片機(jī)和12T單片機(jī)速度大約5-8倍,注意更改參數(shù)
   {
   i=0;
   MoveBitNum++;
if(MoveBitNum==16)//每次移動(dòng)完一個(gè)漢字大小后循環(huán)
    {
      MoveBitNum=0;
          HzNum+=1;    //調(diào)用下一個(gè)漢字
          if(HzNum>=50)//需要顯示的漢字個(gè)數(shù),包括前面的一屏空字符的個(gè)數(shù),后面清屏的空字符不包含在內(nèi),這里是(漢字個(gè)數(shù)+1)
             HzNum=0;   //完全顯示完后循環(huán)調(diào)用
    }
  }


Delay(1);//控制掃描頻率
for(j=0;j<2;j++) //取每個(gè)漢字的前2個(gè)字節(jié),
        {             //漢字個(gè)數(shù)+1
         buff[j+j]=hztest[HzNum+j][count+count];  //每次移動(dòng)完一個(gè)漢字后,選擇下一個(gè)漢字
         buff[j+j+1]=hztest[HzNum+j][count+count+1];
        }

  if(MoveBitNum<8)                   //  判讀移動(dòng)距離是大于一個(gè)字節(jié)還是小于一個(gè)字節(jié),因?yàn)橐粋€(gè)字節(jié)左移右移最大只能8位
          { IncNum=0; MoveBitNumtemp=MoveBitNum; }
  else
          { IncNum=1; MoveBitNumtemp=MoveBitNum-8;}//大于8就減去8得到的數(shù)值還是小于8

T_STR=0;       //鎖存無效
  for(j=0;j<2;j++)          //按bit的方式移動(dòng)緩沖區(qū)的內(nèi)容,然后輸出到595,即取出的數(shù)值每個(gè)字節(jié)左移一定的位數(shù),
          {                                     //后面左移出的數(shù)據(jù)整合到前面的字節(jié)中,保持?jǐn)?shù)據(jù)的連續(xù)性            
           temp=(buff[j+IncNum]>>MoveBitNumtemp)|(buff[j+1+IncNum]<<(8-MoveBitNumtemp));//這句比較重要,需要自行拿出2個(gè)字節(jié)的數(shù)據(jù)模擬分析
       InputByte(temp);//輸出到595
          }//8個(gè)字節(jié)傳輸完鎖存輸出
  OE  = 1;
  P0=15-count;//用P0口的前4位控制16行,屏內(nèi)部通過4-16譯碼器工作,循環(huán)掃描16行
  T_STR=1;      //鎖存有效,此時(shí)一行的數(shù)據(jù)顯示到屏上
  OE = 0;


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


#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
sbit shcp=P2^0;         // 移位寄存時(shí)鐘 1有效
sbit ds=P2^1;        // 輸入
sbit stcp=P2^2;          //  輸出時(shí)鐘 1有效
sbit k1=P3^2;
sbit k2=P3^3;
uchar n=100;

//彩燈循環(huán)
uchar data_s[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //        逆時(shí)針流水燈
                                 0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,                                         //        閃爍
                                0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01, // 順時(shí)針流水燈
                                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++) // 掃描每一個(gè)字節(jié) 0x01為1個(gè) 在內(nèi)部左移
        {
                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;        
}
回復(fù)

使用道具 舉報(bào)

板凳
ID:169688 發(fā)表于 2017-3-10 17:05 | 只看該作者
頂一個(gè)
回復(fù)

使用道具 舉報(bào)

地板
ID:111517 發(fā)表于 2017-3-10 20:09 | 只看該作者
不能啊,肯定只能有一個(gè)MAIN函數(shù),其余的函數(shù)你可以只要名字不一樣就好了,主函數(shù)重新寫下

評(píng)分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:169574 發(fā)表于 2017-3-10 20:58 | 只看該作者
滄浪 發(fā)表于 2017-3-10 20:09
不能啊,肯定只能有一個(gè)MAIN函數(shù),其余的函數(shù)你可以只要名字不一樣就好了,主函數(shù)重新寫下

我不太理解是把其他函數(shù)編程模塊嗎?
回復(fù)

使用道具 舉報(bào)

6#
ID:48413 發(fā)表于 2017-3-10 21:39 | 只看該作者
不能的啊
回復(fù)

使用道具 舉報(bào)

7#
ID:169574 發(fā)表于 2017-3-10 22:00 | 只看該作者

那應(yīng)該怎么寫一個(gè)點(diǎn)陣和流水燈的程序,我不知道怎么才能實(shí)現(xiàn)他們一起工作的程序
回復(fù)

使用道具 舉報(bào)

8#
ID:169574 發(fā)表于 2017-3-10 22:00 | 只看該作者

那應(yīng)該怎么寫一個(gè)點(diǎn)陣和流水燈的程序,我不知道怎么才能實(shí)現(xiàn)他們一起工作的程序
回復(fù)

使用道具 舉報(bào)

9#
ID:151348 發(fā)表于 2017-3-10 22:06 | 只看該作者
吧點(diǎn)陣驅(qū)動(dòng)程序?qū)懗梢粋€(gè)c文件,把流水燈的程序?qū)懗梢粋€(gè)c文件,再寫個(gè)包涵main函數(shù)的c文件,把這三個(gè)c文件都添加到keil中,在包涵main函數(shù)的c文件里寫具體實(shí)現(xiàn)過程,比如調(diào)用其他兩個(gè)c文件里的函數(shù)

評(píng)分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

10#
ID:169574 發(fā)表于 2017-3-10 22:21 | 只看該作者
imxuheng 發(fā)表于 2017-3-10 22:06
吧點(diǎn)陣驅(qū)動(dòng)程序?qū)懗梢粋€(gè)c文件,把流水燈的程序?qū)懗梢粋€(gè)c文件,再寫個(gè)包涵main函數(shù)的c文件,把這三個(gè)c文件都 ...

那那些定義之類的說明和驅(qū)動(dòng)程序是寫在各自的C文件中還是寫在main函數(shù)的文件中?我自己寫過一下,感覺有些問題……所以想問具體些
回復(fù)

使用道具 舉報(bào)

11#
ID:151348 發(fā)表于 2017-3-11 09:12 | 只看該作者
Q_p 發(fā)表于 2017-3-10 22:21
那那些定義之類的說明和驅(qū)動(dòng)程序是寫在各自的C文件中還是寫在main函數(shù)的文件中?我自己寫過一下,感覺有 ...

估計(jì)你應(yīng)該已經(jīng)明白了,就是與某個(gè)模塊(比如LCD1602、IIC驅(qū)動(dòng))相關(guān)的變量和函數(shù)放在同一個(gè)C文件下,然后在如果需要用某個(gè)模塊的函數(shù),就在包含main的C文件里調(diào)用

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

12#
ID:169574 發(fā)表于 2017-3-11 09:42 | 只看該作者
imxuheng 發(fā)表于 2017-3-11 09:12
估計(jì)你應(yīng)該已經(jīng)明白了,就是與某個(gè)模塊(比如LCD1602、IIC驅(qū)動(dòng))相關(guān)的變量和函數(shù)放在同一個(gè)C文件下,然 ...

嗯 好像有些明白了。我在試一下 。謝謝
回復(fù)

使用道具 舉報(bào)

13#
ID:169574 發(fā)表于 2017-3-11 10:02 | 只看該作者
imxuheng 發(fā)表于 2017-3-11 09:12
估計(jì)你應(yīng)該已經(jīng)明白了,就是與某個(gè)模塊(比如LCD1602、IIC驅(qū)動(dòng))相關(guān)的變量和函數(shù)放在同一個(gè)C文件下,然 ...

寫好各個(gè)c文件之后需要用模塊化方式關(guān)聯(lián)一下各個(gè)文件嗎?還是直接在main里調(diào)用
回復(fù)

使用道具 舉報(bào)

14#
ID:169574 發(fā)表于 2017-3-11 10:58 | 只看該作者
imxuheng 發(fā)表于 2017-3-11 09:12
估計(jì)你應(yīng)該已經(jīng)明白了,就是與某個(gè)模塊(比如LCD1602、IIC驅(qū)動(dòng))相關(guān)的變量和函數(shù)放在同一個(gè)C文件下,然 ...

我自己改了一下程序,編譯通過了,也用開發(fā)板試過了,然后就發(fā)現(xiàn)問題了。。main函數(shù)中調(diào)用2個(gè)C文件,led在前點(diǎn)陣就不能用,點(diǎn)陣在前l(fā)ed就不能用,能不能讓他們一起工作?(不知道是不是陷在各自的循環(huán)里了才不能一起工作)
可能我main函數(shù)寫的有問題,或者一直都是在云里霧里的。。。
下面的是我的main函數(shù),dianzhen和led是各自的程序。不知道我理解得對(duì)不對(duì)。
#include<reg51.h>
#include<intrins.h>
void main()
{
        dianzhen();       
        led();               
}

評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 贊一個(gè)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

15#
ID:123289 發(fā)表于 2017-3-11 10:59 | 只看該作者
單片機(jī)上電后從何處開始執(zhí)行呢?
C規(guī)定:從MIAN開始。
如果有多個(gè)MIAN,樓主打算讓計(jì)算機(jī)從從何處理開始執(zhí)行呢?
建議如下:
假設(shè)有MIAN1、MIAN2、MIAN3……,那么就做一個(gè)MIAN,在MIAN中依序執(zhí)行MIAN1、MIAN2、MIAN3……。你看這個(gè)建議可行不?

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

16#
ID:169574 發(fā)表于 2017-3-13 12:00 | 只看該作者
yzwzfyz 發(fā)表于 2017-3-11 10:59
單片機(jī)上電后從何處開始執(zhí)行呢?
C規(guī)定:從MIAN開始。
如果有多個(gè)MIAN,樓主打算讓計(jì)算機(jī)從從何處理開始 ...

我也不清楚,我寫程序不太行
回復(fù)

使用道具 舉報(bào)

17#
ID:168475 發(fā)表于 2017-3-13 20:43 | 只看該作者
有一個(gè)主函數(shù)  其他的模塊函數(shù)都單獨(dú)寫 并且配一個(gè).h文件

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

18#
ID:169574 發(fā)表于 2017-3-15 09:39 | 只看該作者
人生kui 發(fā)表于 2017-3-13 20:43
有一個(gè)主函數(shù)  其他的模塊函數(shù)都單獨(dú)寫 并且配一個(gè).h文件

.h函數(shù)是這樣寫嗎?比如寫個(gè)led的
#ifndef_LED_H_
#include_LED_H_
void led();(這里需要寫具體函數(shù)嗎,還是就這么簡單就ok了)
#endif
回復(fù)

使用道具 舉報(bào)

19#
ID:137261 發(fā)表于 2017-3-16 17:31 | 只看該作者
一個(gè)程序只能有一個(gè)Main。只要沒有復(fù)用那么整合成一個(gè)很容易的
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表