![]() |
kmsj 發(fā)表于 2022-6-21 23:28 肯定是一個模塊一個.C文件這樣寫更方便,需要哪個模塊直接復制過來改一下配置 |
天ノ憶 發(fā)表于 2022-6-21 17:17 目前只有一個c文件夠用了,以前程序越編越長,覺得可以分成幾個模塊就好了,后來發(fā)現(xiàn)Keil有折疊功能,我把所有程序折疊起來,需要修改哪個打開哪個,我現(xiàn)在編的程序不復雜,不到2000行,等到折疊都很麻煩的時候再考慮分成幾個模塊。 |
kmsj 發(fā)表于 2022-6-18 12:29 你的程序肯定只有一個.c文件吧 |
現(xiàn)在可以了,麻煩了。 |
51520 發(fā)表于 2022-6-18 12:32 你的Delay(100);是延長100us嗎?如果是的話你的程序其實已經(jīng)實現(xiàn)了流水燈的效果,只是你的眼睛不行沒有看出來而已。 |
你這個是函數(shù)外的賦值代碼,當然報錯了。 |
51520 發(fā)表于 2022-6-18 12:32
|
kmsj 發(fā)表于 2022-6-18 12:29 學習了,學習了。出現(xiàn)了語法上的錯誤。 |
wulin 發(fā)表于 2022-6-18 07:15 那順便幫我看下下面的代碼: P1 = 0Xfe; while(1) { P1= _crol_(P1,1); Delay(100); } 為什么這個代碼沒有流水的效果? 我的理解是每一次循環(huán)P1里面的位都向左移一位,不知道我的理解是不是錯誤. 如:第一次循環(huán)后:P1 是1111 1101 第二次循環(huán)后:P1 是1111 1011 然后以此類推,產生流水的效果。 實際過程中,第一個燈亮后,第二個燈亮,然后就一直停留在第二個燈亮,第三個燈不亮,后面的燈也不亮。 下面的代碼可以實現(xiàn)流水燈: P1 = 0xFE; while(1) { for(k = 0;k < 8;k++) { P1= _crol_(P1,1); Delay(100); } } |
這是樓主編程不規(guī)范造成的,按照我自己的理解,標準的單片機C語言,第一句是頭文件,頭文件到主函數(shù)之間是庫文件、常量、變量、子函數(shù)聲明定義、以及各種數(shù)組之類的定義,中斷函數(shù)和所有子函數(shù)必須放在主函數(shù)之后,主函數(shù)之前定義的變量是全局變量,子函數(shù)內部定義的變量是局部變量,我就是這樣編所有的單片機程序,所以這方面我基本沒有出過問題,有人為了偷懶,把子函數(shù)放在主函數(shù)之前,免去了函數(shù)聲明之類的語句,我覺得看著就不舒服,程序就像倒著放一樣,P1=0xfe,這已經(jīng)是實質性的賦值運算語句,怎么能放在主函數(shù)前面? |
雪玉寐影 發(fā)表于 2022-6-18 00:51 嘗試了,編譯通過不了。 |
aide51 發(fā)表于 2022-6-18 09:51 1.在keil軟件嘗試了一下,編譯不通過。 2.sbit是對位進行操作的,而且是對于能位操作的寄存器才能使用。 如P1^1 = 0XFE; 這樣是沒有問題的 |
在主函數(shù)外要聲明 sbit P1 = 0xFE; |
P1已經(jīng)在頭文件中被定義為寄存器的地址名:sfr P1 = 0x90;。在函數(shù)外寫P1=0xfe;被編譯器當變量處理當然出現(xiàn)語法錯誤。在函數(shù)內寫P1=0xfe;實際是把0xfe寫入地址0x90的寄存器。 |
放在main()函數(shù)前要顯性指明sfr: sfr P1=0xFE; |
Powered by 單片機教程網(wǎng)