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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機不同的IO口如何組成類似數組的形式

[復制鏈接]
跳轉到指定樓層
樓主
ID:188773 發表于 2020-4-28 09:22 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
現在有12個IO口作為輸入,接的是自鎖按鍵。程序需要掃描這12個IO口的高低狀態來執行后續操作,最簡單的寫法就是定義每個IO口然后直接去一一掃描。如下代碼:
sbit keyin1 = P3^4;                        //自鎖按鍵,0按下
sbit keyin2 = P3^5;
sbit keyin3 = P3^0;
sbit keyin4 = P3^1;
sbit keyin5 = P3^2;
sbit keyin6 = P3^3;
sbit keyin7 = P2^0;
sbit keyin8 = P2^1;
sbit keyin9 = P2^2;
sbit keyin10 = P2^7;
sbit test   = P3^6;
sbit mute   = P3^7;                        //輕觸按鍵,0按下


void KeyScanf()
{
        if(keyin1==0)                  //按鍵1按下
                 ....
         else            //按鍵1未按下
                 .....

        if(keyin2==0)                  
         ....
         else           
         ......

        if(keyin3==0)                  
                 .....
         else           
                 .....

但是這樣感覺代碼特別冗余,想問問有沒有辦法將keyin1-keyin12放到一個數組之類的結構里面,方便進行for循環,減少代碼的數量,如下代碼KEY[]中裝著所有的IO口。
for(n=0;n<13,n++)
                {
                        if(KEY[n]==0)                  //按鍵1按下
                        ....
                        else            //按鍵1未按下
                        .....                               
                }




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

使用道具 舉報

沙發
ID:584814 發表于 2020-4-28 09:41 | 只看該作者
想法灰常地好,你能確定每個按鍵按下和不按下的功能一樣的話直接并上去就好。
當然你也可以做個函數模塊,對每個按鍵進行賦值方便調用。
回復

使用道具 舉報

板凳
ID:213173 發表于 2020-4-28 11:12 | 只看該作者
宏定義端口組即可

#include <reg51.h>

#define Merge_key ((P2>>4&0x08)|(P2&0x07))<<8|P3

void main(void)
{
        unsigned int num;
        while(1)
        {
                num=Merge_key;
                if(num!=0x0fff)
                {
                        switch(num)
                        {
                                case 0x0ffe: /*任務 1*/ break;
                                case 0x0ffd: /*任務 2*/ break;
                                case 0x0ffb: /*任務 3*/ break;
                                case 0x0ff7: /*任務 4*/ break;
                                case 0x0fef: /*任務 5*/ break;
                                case 0x0fdf: /*任務 6*/ break;
                                case 0x0fbf: /*任務 7*/ break;
                                case 0x0f7f: /*任務 8*/ break;
                                case 0x0eff: /*任務 9*/ break;
                                case 0x0dff: /*任務10*/ break;
                                case 0x0bff: /*任務11*/ break;
                                case 0x07ff: /*任務12*/ break;
                                //其它N組合    任務N
                                //......
                                default: break;
                        }       
                }
        }
}
回復

使用道具 舉報

地板
ID:188773 發表于 2020-4-28 14:08 | 只看該作者
man1234567 發表于 2020-4-28 09:41
想法灰常地好,你能確定每個按鍵按下和不按下的功能一樣的話直接并上去就好。
當然你也可以做個函數模塊, ...

好像C51沒有位數組,所以很疑惑能不能這樣做
回復

使用道具 舉報

5#
ID:188773 發表于 2020-4-28 16:29 | 只看該作者
wulin 發表于 2020-4-28 11:12
宏定義端口組即可

#include

您這是個很好的思路,我試試宏定義把不同端口放在一起,但是還是要去檢測每一位,因為按鍵是自鎖的,可能出現同時1個、2個甚至12個同時按下的情況,switch列舉太麻煩了。
回復

使用道具 舉報

6#
ID:213173 發表于 2020-4-28 17:56 | 只看該作者
guan1989 發表于 2020-4-28 16:29
您這是個很好的思路,我試試宏定義把不同端口放在一起,但是還是要去檢測每一位,因為按鍵是自鎖的,可能 ...

可以把鍵態列一個unsigned int 數組用查表法。
回復

使用道具 舉報

7#
ID:328014 發表于 2020-4-28 18:23 | 只看該作者
類似問題的解決方案:http://www.zg4o1577.cn/bbs/dpj-186076-1.html
回復

使用道具 舉報

8#
ID:332444 發表于 2020-4-28 20:30 | 只看該作者
12個按鍵,用8個IO口能組成矩陣16個按鍵。
回復

使用道具 舉報

9#
ID:188773 發表于 2020-4-28 20:58 | 只看該作者
51hei團團 發表于 2020-4-28 18:23
類似問題的解決方案:http://www.zg4o1577.cn/bbs/dpj-186076-1.html

位結構體和聯合體不能用于循環減少代碼的長度吧?我的初衷是減少代碼長度。
回復

使用道具 舉報

10#
ID:188773 發表于 2020-4-28 22:57 | 只看該作者
這是我修改后的代碼,實現了十二個按鍵的循環掃描,試運行了下基本邏輯是對的,希望大家幫我看看有什么需要改進的,初學者還有很多不懂的。

#include<reg52.h>
#define bitRead(Y,X) ( ~Y & (1 << (X-1)) )                                                   // 讀取 Y 的X位,其他位屏蔽為0,Y的X位為0則X位置為1,否則置位0
#define bitSet(Y,X) Y |= (1 << (X-1))                // Y的X位置1
#define bitClear(Y,X) Y &= ~(1 << (X-1))              // Y的X位置0
#define Merge_key         ((P2>>4&0x08)|(P2&0x07))<<8|P3                 //16位從高位到低位排序位:0 0 0 0 / P2.7        P2.2        P2.1        P2.0        /        P3.7        P3.6        P3.5        P3.4        /        P3.3        P3.2        P3.1        P3.0
/*------------------------------------------------
函數名稱:  KEY_Initialise()
函數功能:         按鍵初始化
入口參數:        
出口參數:         無
備 注:
------------------------------------------------*/
uint data key_alarm=0xff; //按鍵按下是否生效標志位:LED1,LED2,...lLED10,test,mute,null,null,null,null
uint data key_value=0x00; //實時存儲按鍵按下標志位:LED1,LED2,LED3...LED10,test,mute,LED_ALARM,buzzer,null,null;用于顯示和通訊

void KEY_Initialise()                         //KEY1-KEY10,TEST,MUTE
        {
        static uint KEY        ;
        static uchar uckey_num ;
        static uint code KEY_transient[]={0x0001,0x0002,0x0004,0x0008,                //P3.0  P3.1  P3.2  P3.3
                                                                                                                         0x0010,0x0020,0x0040,0x080,                //P3.4  P3.5  P3.6  P3.7
                                                                                                                         0x0100,0x0200,0x0400,0x0800};        //P2.0  P2.1  P2.2  P2.7
        static uchar data keytime_Y[12]={0,0,0,0,0,0,0,0,0,0,0,0};//timeY按下計時消抖 LED1,LED2,...lLED10,test,mute
        static uchar data keytime_N[12]={0,0,0,0,0,0,0,0,0,0,0,0};//timeN未按下計時消抖LED1,LED2,...lLED10,test,mute
        static uchar code Const_Keysnake_time=200;
                                                                                                                         
       
                KEY = Merge_key ;
                if ( KEY != 0X0FFF )
                {
                        for ( uckey_num = 0 ; uckey_num < 13 ; uckey_num ++ )
                        {        uint abc=bitRead ( KEY,uckey_num+1);
                                if ( bitRead ( KEY,uckey_num+1 ) == KEY_transient[uckey_num] )//函數邏輯不對,需確定
                                {
                                        keytime_Y[uckey_num]++;        //按下消抖計時加1
                                        keytime_N[uckey_num]=0;        //未按下消抖計時清零       
                                        if(keytime_Y[uckey_num]>Const_Keysnake_time) //消抖濾波 ,受程序循環影響延時時間,需要程序完成后校準Const_Keysnake_time值
                                                {
                                                keytime_Y[uckey_num]=0;         //按下消抖計時清零
                                                bitSet(key_value,uckey_num+1);        //是否按下標志位
                                                }
                                        }
                                else            //按鍵1未按下
                                        {
                                        keytime_N[uckey_num]++;                //未按下消抖計時加1
                                        keytime_Y[uckey_num]=0;          //按下消抖計時清零
                                                if(keytime_N[uckey_num]>Const_Keysnake_time)
                                                {
                                                keytime_N[uckey_num]=0;
                                                bitClear(key_value,uckey_num+1);
                                                }
                                        }
                        }
                }
                }
回復

使用道具 舉報

11#
ID:188773 發表于 2020-4-28 22:58 | 只看該作者
xianfajushi 發表于 2020-4-28 20:30
12個按鍵,用8個IO口能組成矩陣16個按鍵。

我的是自鎖按鍵,矩陣按鍵在同時按下時偵測不了吧
回復

使用道具 舉報

12#
ID:188773 發表于 2020-4-28 22:59 | 只看該作者
wulin 發表于 2020-4-28 17:56
可以把鍵態列一個unsigned int 數組用查表法。

我按這個思路寫了個,能否幫我看下有沒有什么要改的(代碼規范,標準,邏輯都可以)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕在线视频精品 | 精品国产乱码久久久久久丨区2区 | 成人免费视频久久 | 三级成人在线 | a毛片 | 亚洲午夜精品视频 | 成人久久网 | 性xxxxx| 国产性生活一级片 | 亚洲欧美一区二区在线观看 | 精品久久一区 | 自拍视频国产 | 久久综合av | 国产精品资源在线 | 男女羞羞视频大全 | 亚洲国产成人精品女人久久久 | 成人在线免费观看 | 狠狠ri | 精国产品一区二区三区 | 国产视频欧美 | 亚洲欧美一区二区三区在线 | 99久久久久 | 97色伦网 | 欧美日韩一区二区三区在线观看 | av大片在线观看 | 人人人人干 | 国产一区h | 黄色大片观看 | 欧美精品影院 | 毛片99 | 天天躁日日躁aaaa视频 | 欧美黄色一级毛片 | 精品二区 | 91精品久久久久久久久久 | 九九热精品视频 | 国产精品久久久久久久久图文区 | 亚洲成人中文字幕 | 国产精品www | 综合国产第二页 | 欧美日韩黄| 992人人草|