久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2923|回復: 15
打印 上一主題 下一主題
收起左側

關于單片機IO口定義的問題

[復制鏈接]
跳轉到指定樓層
樓主
         
    上圖,為什么在主函數外直接給P1口賦值,編譯時會報出未定義,編譯通不過?
下圖,而在主函數中賦值卻可以通過編譯。



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:99525 發表于 2022-6-18 00:51 | 只看該作者
放在main()函數前要顯性指明sfr:
sfr P1=0xFE;
回復

使用道具 舉報

板凳
ID:213173 發表于 2022-6-18 07:15 | 只看該作者
P1已經在頭文件中被定義為寄存器的地址名:sfr P1 = 0x90;。在函數外寫P1=0xfe;被編譯器當變量處理當然出現語法錯誤。在函數內寫P1=0xfe;實際是把0xfe寫入地址0x90的寄存器。
回復

使用道具 舉報

地板
ID:372579 發表于 2022-6-18 09:51 | 只看該作者
在主函數外要聲明
sbit P1 = 0xFE;
回復

使用道具 舉報

5#
ID:542552 發表于 2022-6-18 12:04 | 只看該作者
aide51 發表于 2022-6-18 09:51
在主函數外要聲明
sbit P1 = 0xFE;

1.在keil軟件嘗試了一下,編譯不通過。
2.sbit是對位進行操作的,而且是對于能位操作的寄存器才能使用。
如P1^1 = 0XFE; 這樣是沒有問題的
回復

使用道具 舉報

6#
ID:542552 發表于 2022-6-18 12:05 | 只看該作者
雪玉寐影 發表于 2022-6-18 00:51
放在main()函數前要顯性指明sfr:
sfr P1=0xFE;

嘗試了,編譯通過不了。
回復

使用道具 舉報

7#
ID:383215 發表于 2022-6-18 12:29 | 只看該作者
這是樓主編程不規范造成的,按照我自己的理解,標準的單片機C語言,第一句是頭文件,頭文件到主函數之間是庫文件、常量、變量、子函數聲明定義、以及各種數組之類的定義,中斷函數和所有子函數必須放在主函數之后,主函數之前定義的變量是全局變量,子函數內部定義的變量是局部變量,我就是這樣編所有的單片機程序,所以這方面我基本沒有出過問題,有人為了偷懶,把子函數放在主函數之前,免去了函數聲明之類的語句,我覺得看著就不舒服,程序就像倒著放一樣,P1=0xfe,這已經是實質性的賦值運算語句,怎么能放在主函數前面?
回復

使用道具 舉報

8#
ID:542552 發表于 2022-6-18 12:32 | 只看該作者
wulin 發表于 2022-6-18 07:15
P1已經在頭文件中被定義為寄存器的地址名:sfr P1 = 0x90;。在函數外寫P1=0xfe;被編譯器當變量處理當然出現 ...

那順便幫我看下下面的代碼:
P1 = 0Xfe;
while(1)
        {
                        P1= _crol_(P1,1);
                        Delay(100);
        }
為什么這個代碼沒有流水的效果?
我的理解是每一次循環P1里面的位都向左移一位,不知道我的理解是不是錯誤.
如:第一次循環后:P1 是1111 1101
      第二次循環后:P1 是1111 1011
然后以此類推,產生流水的效果。
實際過程中,第一個燈亮后,第二個燈亮,然后就一直停留在第二個燈亮,第三個燈不亮,后面的燈也不亮。
下面的代碼可以實現流水燈:
P1 = 0xFE;
        while(1)
        {
                for(k = 0;k < 8;k++)
                {
                        P1= _crol_(P1,1);
                        Delay(100);
                }
        }
回復

使用道具 舉報

9#
ID:542552 發表于 2022-6-18 12:40 | 只看該作者
kmsj 發表于 2022-6-18 12:29
這是樓主編程不規范造成的,按照我自己的理解,標準的單片機C語言,第一句是頭文件,頭文件到主函數之間是 ...

學習了,學習了。出現了語法上的錯誤。
回復

使用道具 舉報

10#
ID:213173 發表于 2022-6-18 13:35 | 只看該作者
51520 發表于 2022-6-18 12:32
那順便幫我看下下面的代碼:
P1 = 0Xfe;
while(1)
  1. #include <reg51.H>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. void Delay(uint k)
  6. {
  7.         uint i,j;
  8.         for(i=k;i>0;i--)
  9.                 for(j=110;j>0;j--);
  10. }

  11. void main()
  12. {
  13.         P1=0xfe;
  14.         while(1)
  15.         {
  16.                 P1= _crol_(P1,1);
  17.                 Delay(100);
  18.         }
  19. }
復制代碼
回復

使用道具 舉報

11#
ID:824490 發表于 2022-6-18 17:12 | 只看該作者
你這個是函數外的賦值代碼,當然報錯了。
回復

使用道具 舉報

12#
ID:491577 發表于 2022-6-18 18:31 | 只看該作者
51520 發表于 2022-6-18 12:32
那順便幫我看下下面的代碼:
P1 = 0Xfe;
while(1)

你的Delay(100);是延長100us嗎?如果是的話你的程序其實已經實現了流水燈的效果,只是你的眼睛不行沒有看出來而已。
回復

使用道具 舉報

13#
ID:542552 發表于 2022-6-18 23:21 | 只看該作者

現在可以了,麻煩了。
回復

使用道具 舉報

14#
ID:139866 發表于 2022-6-21 17:17 | 只看該作者
kmsj 發表于 2022-6-18 12:29
這是樓主編程不規范造成的,按照我自己的理解,標準的單片機C語言,第一句是頭文件,頭文件到主函數之間是 ...

你的程序肯定只有一個.c文件吧
回復

使用道具 舉報

15#
ID:383215 發表于 2022-6-21 23:28 | 只看該作者
天ノ憶 發表于 2022-6-21 17:17
你的程序肯定只有一個.c文件吧

目前只有一個c文件夠用了,以前程序越編越長,覺得可以分成幾個模塊就好了,后來發現Keil有折疊功能,我把所有程序折疊起來,需要修改哪個打開哪個,我現在編的程序不復雜,不到2000行,等到折疊都很麻煩的時候再考慮分成幾個模塊。
回復

使用道具 舉報

16#
ID:139866 發表于 2022-6-24 12:52 | 只看該作者
kmsj 發表于 2022-6-21 23:28
目前只有一個c文件夠用了,以前程序越編越長,覺得可以分成幾個模塊就好了,后來發現Keil有折疊功能,我 ...

肯定是一個模塊一個.C文件這樣寫更方便,需要哪個模塊直接復制過來改一下配置
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区在线 | 综合久久99 | 毛片av免费看| 国产福利在线视频 | av在线免费观看网址 | 国产九九精品 | 天堂av中文在线 | 成人精品福利 | 性一爱一乱一交一视频 | 国产一区二区在线免费观看 | 亚洲精品99 | 午夜黄色| 日韩有码在线播放 | 91亚洲一区| 亚洲国产在| 国产四区 | 日韩三片| 国产99久久久国产精品 | 99热精品国产 | 国产无套一区二区三区久久 | 一区二区三区视频在线观看 | 欧美福利 | 国产精品欧美一区二区 | 亚洲最新在线视频 | 久久成人18免费网站 | 精品久草 | 91精品国产91久久久久游泳池 | 亚洲黄色网址视频 | 欧美日韩精品一区二区天天拍 | 欧美中文一区 | 999久久久久久久久 国产欧美在线观看 | 国内精品免费久久久久软件老师 | 午夜视频免费在线 | 欧美一卡二卡在线观看 | 久久精品高清视频 | 精品九九九 | 日韩视频国产 | 久久久人成影片免费观看 | 中文字幕免费视频 | 伊人艹| 精品国产精品三级精品av网址 |