標(biāo)題: 關(guān)于keil模塊化編寫程序的問題 [打印本頁]

作者: Q_p    時間: 2017-3-10 10:30
標(biāo)題: 關(guān)于keil模塊化編寫程序的問題
keil 模塊化編寫程序時,可以在模塊中添加main函數(shù)嗎?如果不能那2個程序能用模塊整合成一個嗎?

作者: Q_p    時間: 2017-3-10 11:04
本帖最后由 Q_p 于 2017-3-10 20:22 編輯

#include<reg52.h>


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

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

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


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


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


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


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

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

//彩燈循環(huán)
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++) // 掃描每一個字節(jié) 0x01為1個 在內(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;        
}
作者: cy2005abc    時間: 2017-3-10 17:05
頂一個
作者: 滄浪    時間: 2017-3-10 20:09
不能啊,肯定只能有一個MAIN函數(shù),其余的函數(shù)你可以只要名字不一樣就好了,主函數(shù)重新寫下
作者: Q_p    時間: 2017-3-10 20:58
滄浪 發(fā)表于 2017-3-10 20:09
不能啊,肯定只能有一個MAIN函數(shù),其余的函數(shù)你可以只要名字不一樣就好了,主函數(shù)重新寫下

我不太理解是把其他函數(shù)編程模塊嗎?
作者: meilidianzhi    時間: 2017-3-10 21:39
不能的啊
作者: Q_p    時間: 2017-3-10 22:00
meilidianzhi 發(fā)表于 2017-3-10 21:39
不能的啊

那應(yīng)該怎么寫一個點(diǎn)陣和流水燈的程序,我不知道怎么才能實(shí)現(xiàn)他們一起工作的程序
作者: Q_p    時間: 2017-3-10 22:00
meilidianzhi 發(fā)表于 2017-3-10 21:39
不能的啊

那應(yīng)該怎么寫一個點(diǎn)陣和流水燈的程序,我不知道怎么才能實(shí)現(xiàn)他們一起工作的程序
作者: imxuheng    時間: 2017-3-10 22:06
吧點(diǎn)陣驅(qū)動程序?qū)懗梢粋c文件,把流水燈的程序?qū)懗梢粋c文件,再寫個包涵main函數(shù)的c文件,把這三個c文件都添加到keil中,在包涵main函數(shù)的c文件里寫具體實(shí)現(xiàn)過程,比如調(diào)用其他兩個c文件里的函數(shù)
作者: Q_p    時間: 2017-3-10 22:21
imxuheng 發(fā)表于 2017-3-10 22:06
吧點(diǎn)陣驅(qū)動程序?qū)懗梢粋c文件,把流水燈的程序?qū)懗梢粋c文件,再寫個包涵main函數(shù)的c文件,把這三個c文件都 ...

那那些定義之類的說明和驅(qū)動程序是寫在各自的C文件中還是寫在main函數(shù)的文件中?我自己寫過一下,感覺有些問題……所以想問具體些
作者: imxuheng    時間: 2017-3-11 09:12
Q_p 發(fā)表于 2017-3-10 22:21
那那些定義之類的說明和驅(qū)動程序是寫在各自的C文件中還是寫在main函數(shù)的文件中?我自己寫過一下,感覺有 ...

估計你應(yīng)該已經(jīng)明白了,就是與某個模塊(比如LCD1602、IIC驅(qū)動)相關(guān)的變量和函數(shù)放在同一個C文件下,然后在如果需要用某個模塊的函數(shù),就在包含main的C文件里調(diào)用
作者: Q_p    時間: 2017-3-11 09:42
imxuheng 發(fā)表于 2017-3-11 09:12
估計你應(yīng)該已經(jīng)明白了,就是與某個模塊(比如LCD1602、IIC驅(qū)動)相關(guān)的變量和函數(shù)放在同一個C文件下,然 ...

嗯 好像有些明白了。我在試一下 。謝謝
作者: Q_p    時間: 2017-3-11 10:02
imxuheng 發(fā)表于 2017-3-11 09:12
估計你應(yīng)該已經(jīng)明白了,就是與某個模塊(比如LCD1602、IIC驅(qū)動)相關(guān)的變量和函數(shù)放在同一個C文件下,然 ...

寫好各個c文件之后需要用模塊化方式關(guān)聯(lián)一下各個文件嗎?還是直接在main里調(diào)用
作者: Q_p    時間: 2017-3-11 10:58
imxuheng 發(fā)表于 2017-3-11 09:12
估計你應(yīng)該已經(jīng)明白了,就是與某個模塊(比如LCD1602、IIC驅(qū)動)相關(guān)的變量和函數(shù)放在同一個C文件下,然 ...

我自己改了一下程序,編譯通過了,也用開發(fā)板試過了,然后就發(fā)現(xiàn)問題了。。main函數(shù)中調(diào)用2個C文件,led在前點(diǎn)陣就不能用,點(diǎn)陣在前l(fā)ed就不能用,能不能讓他們一起工作?(不知道是不是陷在各自的循環(huán)里了才不能一起工作)
可能我main函數(shù)寫的有問題,或者一直都是在云里霧里的。。。
下面的是我的main函數(shù),dianzhen和led是各自的程序。不知道我理解得對不對。
#include<reg51.h>
#include<intrins.h>
void main()
{
        dianzhen();       
        led();               
}
作者: yzwzfyz    時間: 2017-3-11 10:59
單片機(jī)上電后從何處開始執(zhí)行呢?
C規(guī)定:從MIAN開始。
如果有多個MIAN,樓主打算讓計算機(jī)從從何處理開始執(zhí)行呢?
建議如下:
假設(shè)有MIAN1、MIAN2、MIAN3……,那么就做一個MIAN,在MIAN中依序執(zhí)行MIAN1、MIAN2、MIAN3……。你看這個建議可行不?
作者: Q_p    時間: 2017-3-13 12:00
yzwzfyz 發(fā)表于 2017-3-11 10:59
單片機(jī)上電后從何處開始執(zhí)行呢?
C規(guī)定:從MIAN開始。
如果有多個MIAN,樓主打算讓計算機(jī)從從何處理開始 ...

我也不清楚,我寫程序不太行
作者: 人生kui    時間: 2017-3-13 20:43
有一個主函數(shù)  其他的模塊函數(shù)都單獨(dú)寫 并且配一個.h文件
作者: Q_p    時間: 2017-3-15 09:39
人生kui 發(fā)表于 2017-3-13 20:43
有一個主函數(shù)  其他的模塊函數(shù)都單獨(dú)寫 并且配一個.h文件

.h函數(shù)是這樣寫嗎?比如寫個led的
#ifndef_LED_H_
#include_LED_H_
void led();(這里需要寫具體函數(shù)嗎,還是就這么簡單就ok了)
#endif
作者: 淡然若夢    時間: 2017-3-16 17:31
一個程序只能有一個Main。只要沒有復(fù)用那么整合成一個很容易的




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1