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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

4個單片機IO,LED燈,按鍵共用,STC怎么編程?

  [復制鏈接]
跳轉到指定樓層
樓主
4個IO,LED燈,按鍵共用,STC怎么編程
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:748096 發表于 2020-8-15 05:44 | 只看該作者
建議LED燈PWM模式,調整占空比,在IO口高電平時檢測按鍵是否按下,如果按下等待按鍵處理程序,LED燈暫時就不要管了。
回復

使用道具 舉報

板凳
ID:332444 發表于 2020-8-15 06:45 | 只看該作者
IO口復用必須借助其它芯片先行解放IO才能談及復用的可能,還需要有控制其它芯片的IO。
回復

使用道具 舉報

地板
ID:213173 發表于 2020-8-15 07:36 | 只看該作者
LED燈、按鍵共用4個單片機IO示例


#include <reg52.h>

sfr P1M0 = 0x92;  //0000,0000 端口1模式寄存器0
sfr P1M1 = 0x91;  //0000,0000 端口1模式寄存器1

sbit LED1 = P1^4;        //LED端口聲明
sbit LED2 = P1^5;
sbit LED3 = P1^6;
sbit LED4 = P1^7;

unsigned char KeySec=0;//鍵值變量

/**********************************
  1ms延時程序(僅限于STC15W 1T MCU)
**********************************/
void Delay1ms()                //@12.000MHz
{
        unsigned char i, j;
        i = 12;
        j = 169;
        do
        {
                while (--j);
        } while (--i);
}

/**********************************
        按鍵掃描程序
**********************************/
void key_scan()
{
        static unsigned char count=0;//靜態計數變量
        static bit sign_key=0;                        //靜態標志位
        unsigned char time_key,time_LED;//臨時變量

        time_LED=P1&0xf0;//保存4個LED狀態
        P1M0=0x00;//P1.4~7設置弱上拉
        P1M1=0x00;//P1.4~7設置弱上拉
        P1|=0xf0; //P1.4~7置高電平       
        if(P1&0xf0!=0xf0)//有鍵按下
        {
                if(++count>=10 && sign_key==0)//消抖
                {
                        sign_key=1;//自鎖
                        time_key=P1&0xf0;//保存P1.4~7狀態
                        switch(time_key)
                        {
                                case 0xe0: KeySec=1; break;//輸出鍵值
                                case 0xd0: KeySec=2; break;
                                case 0xb0: KeySec=3; break;
                                case 0x70: KeySec=4; break;
                        }
                }
        }
        else //抬起
        {
                count=0;//計數變量清0
                sign_key=0;//鍵態標志清0
        }
        P1&=0x0f;    //P1.4~7清0
        P1|=time_LED;//還原4個LED狀態
        P1M0=0xf0;   //還原P1.4~7推挽設置
        P1M1=0x00;   //還原P1.4~7推挽設置
}
/*********************************
        按鍵服務程序
*********************************/
void key_service()
{
        switch(KeySec)
        {
                case 1:        LED1=~LED1;KeySec=0;break;
                case 2:        LED2=~LED2;KeySec=0;break;
                case 3:        LED3=~LED3;KeySec=0;break;
                case 4:        LED4=~LED4;KeySec=0;break;
        }                  
}
/********************************
        主程序
********************************/
void main()
{
        P1M0=0xf0;//P1.4~7設置推挽
        P1M1=0x00;//P1.4~7設置推挽
        while(1)
        {
                key_scan();
                key_service();
                Delay1ms();//控制主循環周期約1ms
        }
}




回復

使用道具 舉報

5#
ID:716656 發表于 2020-8-15 08:36 | 只看該作者
wulin 發表于 2020-8-15 07:36
LED燈、按鍵共用4個單片機IO示例

學習了
回復

使用道具 舉報

6#
ID:259648 發表于 2020-8-15 23:18 | 只看該作者
wulin 發表于 2020-8-15 07:36
LED燈、按鍵共用4個單片機IO示例

  又漲姿勢了  很實用
回復

使用道具 舉報

7#
ID:777834 發表于 2021-8-31 15:35 來自手機 | 只看該作者
wulin 發表于 2020-8-15 07:36
LED燈、按鍵共用4個單片機IO示例



你好,我按你上面的程序在stc12c2052ad上不能工作,不知道是那里的原因,P1M0、P1M1有修改,LED1在P1.5、LED2在P1.4,其它一樣
回復

使用道具 舉報

8#
ID:777834 發表于 2021-8-31 15:42 來自手機 | 只看該作者
wulin 發表于 2020-8-15 07:36
LED燈、按鍵共用4個單片機IO示例



程序如下

IMG_20210831_153850.jpg (1.76 MB, 下載次數: 134)

IMG_20210831_153850.jpg

IMG_20210831_153905.jpg (1.55 MB, 下載次數: 140)

IMG_20210831_153905.jpg
回復

使用道具 舉報

9#
ID:161164 發表于 2021-8-31 16:29 | 只看該作者
本帖最后由 lkc8210 于 2021-8-31 16:33 編輯

例子用的是STC15



你用的是STC12



有試過跟STC15一樣設置嗎?
P1M0=0xF0;
P1M1=0x00;
回復

使用道具 舉報

10#
ID:963053 發表于 2021-8-31 17:01 來自手機 | 只看該作者
………………

CSDN_1630400410697.jpg (238.88 KB, 下載次數: 131)

CSDN_1630400410697.jpg
回復

使用道具 舉報

11#
ID:777834 發表于 2021-8-31 17:31 來自手機 | 只看該作者
lkc8210 發表于 2021-8-31 16:29
例子用的是STC15



那我燈在P1口啊,
回復

使用道具 舉報

12#
ID:624769 發表于 2021-8-31 17:56 | 只看該作者
你是幾個LED,幾個按鍵?一般一個IO復用LED和按鍵,不是很推薦,如果LED是周期點亮,比如數碼管的公共級,通常是一個IO復用多個按鍵,接到不同數碼管的公共級,通過數碼管的周期點亮,區別不同按鍵的狀態,這樣的效果比較好,比反復切換IO狀態要好。
回復

使用道具 舉報

13#
ID:777834 發表于 2021-8-31 20:41 來自手機 | 只看該作者
188610329 發表于 2021-8-31 17:56
你是幾個LED,幾個按鍵?一般一個IO復用LED和按鍵,不是很推薦,如果LED是周期點亮,比如數碼管的公共級,通 ...

2個燈,2個按鍵,電路跟手冊上的一樣
回復

使用道具 舉報

14#
ID:777834 發表于 2021-8-31 22:19 來自手機 | 只看該作者
沒人說下了嗎
回復

使用道具 舉報

15#
ID:777834 發表于 2021-9-8 11:24 來自手機 | 只看該作者
溫存723 發表于 2020-8-15 23:18
又漲姿勢了  很實用

我反復調試都不行,說說你的想法或程序,謝謝啦
回復

使用道具 舉報

16#
ID:777834 發表于 2021-9-14 16:59 來自手機 | 只看該作者
wulin 發表于 2020-8-15 07:36
LED燈、按鍵共用4個單片機IO示例



大佬,幫忙分析下,我反復調試都不行,謝謝啦
回復

使用道具 舉報

17#
ID:777834 發表于 2021-9-14 19:20 來自手機 | 只看該作者
wulin 發表于 2020-8-15 07:36
LED燈、按鍵共用4個單片機IO示例



大佬,幫我分析下,我反復調試好久了都不行,謝謝啦
回復

使用道具 舉報

18#
ID:777834 發表于 2021-9-14 21:09 | 只看該作者
電路圖

捕獲.PNG (56.6 KB, 下載次數: 130)

捕獲.PNG
回復

使用道具 舉報

19#
ID:777834 發表于 2021-9-14 21:33 來自手機 | 只看該作者
wulin 發表于 2020-8-15 07:36
LED燈、按鍵共用4個單片機IO示例



原理圖

U (78.33 KB, 下載次數: 157)

U
回復

使用道具 舉報

20#
ID:155507 發表于 2021-9-14 22:03 | 只看該作者
你把你的代碼完整地貼上來看看
(不要截圖!不要截圖!不要截圖!)

語焉不詳、去頭掐尾也是愛莫能助的了。。。

回復

使用道具 舉報

21#
ID:777834 發表于 2021-9-14 22:49 來自手機 | 只看該作者
angmall 發表于 2021-9-14 22:03
你把你的代碼完整地貼上來看看
(不要截圖!不要截圖!不要截圖!)


代碼我貼了呀,怎么顯示,我再重新貼上,不好意思
回復

使用道具 舉報

22#
ID:777834 發表于 2021-9-14 22:54 來自手機 | 只看該作者
#include <reg52.h>
#include<intrins.h>

sfr P1M0  = 0x91;
sfr P1M1  = 0x92;

sbit LED1 = P1^4;        //LED端口聲明
sbit LED2 = P1^5;
sbit LED3 = P1^6;
sbit LED4 = P1^7;

unsigned char KeySec=0;//鍵值變量

/**********************************
  1ms延時程序
**********************************/
void Delay1ms()                //@12.000MHz
{
        unsigned char i, j;

        _nop_();
        _nop_();
        i = 12;
        j = 168;
        do
        {
                while (--j);
        } while (--i);
}
/**********************************
        按鍵掃描程序
**********************************/
void key_scan()
{
        static unsigned char count=0;//靜態計數變量
        static bit sign_key=0;                        //靜態標志位
        unsigned char time_key,time_LED;//臨時變量

        time_LED=P1&0xf0;//保存4個LED狀態
        P1M0=0xf0;//P1.4~7設置弱上拉
        P1M1=0x00;//P1.4~7設置弱上拉
        P1|=0xf0; //P1.4~7置高電平        
        if(P1&0xf0!=0xf0)//有鍵按下
        {
                if(++count>=10 && sign_key==0)//消抖
                {
                        sign_key=1;//自鎖
                        time_key=P1&0xf0;//保存P1.4~7狀態
                        switch(time_key)
                        {
                                case 0xe0: KeySec=1; break;//輸出鍵值
                                case 0xd0: KeySec=2; break;
                                case 0xb0: KeySec=3; break;
                                case 0x70: KeySec=4; break;
                        }
                }
        }
        else //抬起
        {
                count=0;//計數變量清0
                sign_key=0;//鍵態標志清0
        }
        P1&=0x0f;    //P1.4~7清0
        P1|=time_LED;//還原4個LED狀態
        P1M0=0x00;   //還原P1.4~7推挽設置
        P1M1=0xf0;   //還原P1.4~7推挽設置
}
/*********************************
        按鍵服務程序
*********************************/
void key_service()
{
        switch(KeySec)
        {
                case 1:        LED1=~LED1;KeySec=0;break;
                case 2:        LED2=~LED2;KeySec=0;break;
                case 3:        LED3=~LED3;KeySec=0;break;
                case 4:        LED4=~LED4;KeySec=0;break;
        }                  
}
/********************************
        主程序
********************************/
void main()
{
        P1M0=0xf0;//P1.4~7設置推挽
        P1M1=0x00;//P1.4~7設置推挽
        while(1)
        {
                key_scan();
                key_service();
                Delay1ms();//控制主循環周期約1ms
        }
}
回復

使用道具 舉報

23#
ID:777834 發表于 2021-9-15 12:39 來自手機 | 只看該作者
angmall 發表于 2021-9-14 22:03
你把你的代碼完整地貼上來看看
(不要截圖!不要截圖!不要截圖!)


大佬,代碼己貼上
回復

使用道具 舉報

24#
ID:130230 發表于 2021-9-17 09:06 | 只看該作者
可以用狀態機做,在較短的時間間隔里面切換狀態,一個狀態用來檢測按鍵,一個狀態用來點亮led。
回復

使用道具 舉報

25#
ID:777834 發表于 2021-9-17 09:31 來自手機 | 只看該作者
jizhongbiao 發表于 2021-9-17 09:06
可以用狀態機做,在較短的時間間隔里面切換狀態,一個狀態用來檢測按鍵,一個狀態用來點亮led。

來個例程
回復

使用道具 舉報

26#
ID:959346 發表于 2021-9-17 10:10 | 只看該作者

    while(1)
        {
                vLedOff(); // 關閉LED,將IO口設置成輸入模式
                Delay1ms();//控制主循環周期約1ms,等待IO穩定后檢測按鍵
                key_scan(); // 按鍵檢測,不用處理LED
                key_service();
                vLedDisplay(); // 檢測完按鍵后點亮LED
                Delay1ms();//控制主循環周期約1ms,LED點亮周期。
        }
// 另,你LED數據最好用一個變量來保存,不要通過讀IO口狀態備份,容易產生問題。
回復

使用道具 舉報

27#
ID:161164 發表于 2021-9-17 17:39 | 只看該作者



用了地板的電路(就是10k+1k+1k那個)
再加上你的代碼
只改了其中一句
if((P1&0xf0)!=0xf0)//有鍵按下//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
加了括號,不加的話會有警告:warning C294: unreachable code


回復

使用道具 舉報

28#
ID:777834 發表于 2021-9-17 21:11 來自手機 | 只看該作者
lkc8210 發表于 2021-9-17 17:39
用了地板的電路(就是10k+1k+1k那個)
再加上你的代碼
只改了其中一句

大佬,昨天還是前天我也驗證可以了,就是按鍵按下的那個判斷語句少了括號,加上了就可以了,但是這個電路還有不足的地方,上電瞬間會亮一下,就算加下拉電阻可以消除,但對按鍵也有影響,只能折中吧,還有關了LED還會微亮,你實測中有沒有發現
回復

使用道具 舉報

29#
ID:624769 發表于 2021-9-17 22:00 | 只看該作者

你電路設計不合理啊……

在按鍵設計中,一般都是避免和 強推挽共用的…… 按你的電路設計,其實你可以設計成 兩個LED一頭并聯,連接到 P1.4, 另外一頭分別接到 數碼管的 A,B, 把數碼管的本來 3 分頻改成 4分頻,就是把這兩個 LED 拓展成數碼管的第4個”數字“ 這樣你最多可以接 8 個LED.
然后,把 按鍵一頭并聯,接到P1.5, 另一頭接數碼管的 8.9.12 中的任意兩個, 在數碼管的輪流點亮過程中 點亮哪個位的時候,P1.5 電平變了,就說明哪個按鍵被按下了,這樣,你最多可以有 3個 + 剛才說的LED 新增加的 P1.4 的那個公共端,總共 4個按鍵,這樣設計電路不是更合理可靠,還不用不停 切換IO狀態么?
回復

使用道具 舉報

30#
ID:777834 發表于 2021-9-17 22:10 來自手機 | 只看該作者
188610329 發表于 2021-9-17 22:00
你電路設計不合理啊……

在按鍵設計中,一般都是避免和 強推挽共用的…… 按你的電路設計,其實你可以 ...

謝謝講解,其實我是看到手冊上有這樣接法,也看到別人有這樣用,所以也想學習下
回復

使用道具 舉報

31#
ID:777834 發表于 2021-9-17 23:45 來自手機 | 只看該作者
188610329 發表于 2021-9-17 22:00
你電路設計不合理啊……

在按鍵設計中,一般都是避免和 強推挽共用的…… 按你的電路設計,其實你可以 ...

比如有時僅剩一個IO口時,要做指示跟按鍵用,也可以這樣用吧
回復

使用道具 舉報

32#
ID:624769 發表于 2021-9-18 00:29 | 只看該作者
jianuli 發表于 2021-9-17 23:45
比如有時僅剩一個IO口時,要做指示跟按鍵用,也可以這樣用吧

如果僅僅剩一個IO, 而你的單片機,又沒有別的按鍵,也沒有別的LED,或者數碼管連接,也沒有其他長期周期性工作的元件的時候,又偏偏需要 一個按鍵,和一個LED的時候,作為下下策,可以這樣接,但是,站在共用IO的角度來講,LED和按鍵通過切換IO模式來,共用IO是最不推薦的共用方法, 而大多數時候,你的整個電路中,應該能找到,其他的IO口和LED或按鍵共用的IO的。LED和按鍵的共用,應該作為實在沒辦法的時候的最后辦法。比如你單片機作為主機,SPI的 始能 引腳 只有單片機去拉低從機的 沒有從機拉低主機的,你也可以接按鍵,只要被拉低了,就是按鍵被按下了。而即便這個時候,SPI在傳輸也沒有所謂,因為始能引腳正在被拉低,完全不影響正在發生的傳輸。 等等,各種共用方法很多很多。
回復

使用道具 舉報

33#
ID:161164 發表于 2021-9-20 14:22 | 只看該作者
jianuli 發表于 2021-9-17 21:11
大佬,昨天還是前天我也驗證可以了,就是按鍵按下的那個判斷語句少了括號,加上了就可以了,但是這個電路 ...

有沒有微亮沒留意
試完就把電路拆了
回看我上傳的gif
好像沒有耶~
回復

使用道具 舉報

34#
ID:777834 發表于 2021-9-24 09:35 來自手機 | 只看該作者
lkc8210 發表于 2021-9-20 14:22
有沒有微亮沒留意
試完就把電路拆了
回看我上傳的gif

有微亮
回復

使用道具 舉報

35#
ID:596446 發表于 2022-8-23 11:00 | 只看該作者

如果共用使用的端口有P1.1,P21,P32,P41呢?怎么寫?
回復

使用道具 舉報

36#
ID:596446 發表于 2022-9-22 20:35 | 只看該作者
怎么做成呼吸燈?
回復

使用道具 舉報

37#
ID:735692 發表于 2023-3-31 07:08 來自手機 | 只看該作者
wulin 發表于 2020-8-15 07:36
LED燈、按鍵共用4個單片機IO示例



我要說一下此電路配合此程序是錯誤的,事實上此電路,在弱上拉下無法將接有正向的導通的LED端口拉向高電平,程序和電路都需要修改才能正常工作
回復

使用道具 舉報

38#
ID:161164 發表于 2023-3-31 10:26 | 只看該作者
jackyangjiali 發表于 2023-3-31 07:08
我要說一下此電路配合此程序是錯誤的,事實上此電路,在弱上拉下無法將接有正向的導通的LED端口拉向高電 ...

但我沒改電路也成功也~
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99福利视频 | 中文字字幕在线中文乱码范文 | www视频在线观看 | 日本不卡一区 | 99久久国产综合精品麻豆 | 成人精品鲁一区一区二区 | 欧美老少妇一级特黄一片 | 亚洲精品视频在线 | 奇米四色在线观看 | 欧洲成人午夜免费大片 | 精品视频免费 | 国产7777| 久久久久国产 | 久久精品中文字幕 | 美女在线一区二区 | 综合国产 | 欧美激情免费在线 | 国产精品亚洲成在人线 | 欧美一区二区三区的 | 色伊人网 | 激情综合五月 | 免费精品在线视频 | 精品久久一区 | 久草在线青青草 | 国产精品久久久久久久久久久久冷 | 成人在线免费观看视频 | 亚洲成人免费视频在线 | 99久久久国产精品 | 国产第1页| 欧美啊v在线观看 | 女朋友的闺蜜3韩国三级 | 91视频久久 | 国产成人99久久亚洲综合精品 | 久久久久久久久久久高潮一区二区 | 亚洲一区二区三区四区在线观看 | 久久久国产一区二区三区 | 欧美三级电影在线播放 | 91视频在线看 | 男人天堂999 | 欧美不卡一区 | 日韩视频免费 |