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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 9151|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

求助一個(gè)4*4鍵盤掃描程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
10黑幣
我想用51單片機(jī)實(shí)現(xiàn)4*4鍵盤掃描功能,鍵盤通常有幾種可能,一種是抖動(dòng),一種是按下,一種是抬起,一種是長(zhǎng)按(分辨3000毫秒時(shí)長(zhǎng)為長(zhǎng)按),我們只要實(shí)現(xiàn)按下就發(fā)送指令到串口,在電腦上通過(guò)串口助手可以獲取單片機(jī)發(fā)來(lái)的指令,指令形式按照“0-9*ABCD”分別代表16個(gè)鍵。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2017-11-3 14:09 | 只看該作者
1606188581 發(fā)表于 2017-11-5 11:43
有沒(méi)有電路圖呢?我是小白,麻煩簡(jiǎn)單畫個(gè)圖紙也行


回復(fù)

使用道具 舉報(bào)

板凳
ID:245536 發(fā)表于 2017-11-3 15:23 | 只看該作者
由于我的黑幣太少無(wú)法懸賞太多,我可以用現(xiàn)金方式懸賞,有意義留言即可
回復(fù)

使用道具 舉報(bào)

地板
ID:82765 發(fā)表于 2017-11-3 20:49 | 只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
回復(fù)

使用道具 舉報(bào)

5#
ID:213173 發(fā)表于 2017-11-4 07:20 | 只看該作者
送你一個(gè)示例,4*4矩陣鍵盤接在P2(只能接P1或P2,不能接P3,否則與串口沖突。如果接P0要加上拉電阻)。
#include <AT89X52.H>
#define uint unsigned int                 //宏定義無(wú)符號(hào)整型數(shù)據(jù)
#define uchar unsigned char         //宏定義無(wú)符號(hào)字符型數(shù)據(jù)
uchar key=0xff;                                        //定義鍵值全局變量
bit flag=0;                                                //定義發(fā)送標(biāo)志

void keyscan()                                        //按鍵掃描程序
{
        static bit sign=0;                        //按鍵有效標(biāo)志
        static uint count=0;                //消抖計(jì)數(shù)變量                       
        uchar num=0;                                //臨時(shí)變量
        P2=0xf0;                                                //賦值P2 1111 0000
        if((P2!=0xf0)&&(sign==0))        //檢測(cè)按鍵有效
        {
                count++;                                //消抖計(jì)數(shù)
                if(count>=500)                        //100~1000,根據(jù)主循環(huán)周期調(diào)整約10~20ms
                {                       
                        sign=1;                                //按鍵有效標(biāo)志置1
                        num=P2;                                //保存P2值xxxx 0000,x為0或1
                        num|=0x0f;                        //保存num按位或0x0f值xxxx 1111
                        P2=num;                                //賦值P2 xxxx 1111
                        num=P2;                                //保存P2值xxxx xxxx
                        switch(num)
                        {
                                case 0xee: key=0x00; break;
                                case 0xde: key=0x01; break;
                                case 0xbe: key=0x02; break;
                                case 0x7e: key=0x03; break;
                                case 0xed: key=0x04; break;
                                case 0xdd: key=0x05; break;
                                case 0xbd: key=0x06; break;
                                case 0x7d: key=0x07; break;
                                case 0xeb: key=0x08; break;
                                case 0xdb: key=0x09; break;
                                case 0xbb: key=0x0a; break;
                                case 0x7b: key=0x0b; break;
                                case 0xe7: key=0x0c; break;
                                case 0xd7: key=0x0d; break;
                                case 0xb7: key=0x0e; break;
                                case 0x77: key=0x0f; break;
                        }
                        flag=1;
                }
        }
        else                                                //鍵抬起
        {
                sign=0;                                        //按鍵有效標(biāo)志清0
                count=0;                                //消抖計(jì)數(shù)清0
        }
}
void main()                                                //主函數(shù)
{
        TMOD=0x20;//定時(shí)器1方式2(8位重載)
        TH1=0xfd; //波特率9600
        TL1=0xfd; //波特率9600
        TR1=1;        //開定時(shí)器1
        SM0=0;        //設(shè)置串口方式1(8位UART波特率可變)
        SM1=1;        //設(shè)置串口方式1(8位UART波特率可變)
        while(1)
        {
                keyscan();                        //按鍵掃描程序
                if(flag==1)                        //發(fā)送標(biāo)志為1
                {
                        flag = 0;                //發(fā)送標(biāo)志清0
                        SBUF = key;                //發(fā)送鍵值數(shù)據(jù)
                        while(!TI)                //等待發(fā)送中斷請(qǐng)求標(biāo)志位為1
                        TI=0;                                //發(fā)送中斷請(qǐng)求標(biāo)志位清0
                }
        }
}
回復(fù)

使用道具 舉報(bào)

6#
ID:111634 發(fā)表于 2017-11-4 21:21 | 只看該作者
本帖最后由 zl2168 于 2017-11-4 21:32 編輯

介紹你幾個(gè)短按/長(zhǎng)按處理的案例
Proteus仿真一下,確認(rèn)有效。

實(shí)例96  能預(yù)置初值的倒計(jì)時(shí)秒表
實(shí)例96 能設(shè)置初值的倒計(jì)時(shí)秒表.rar (40 KB, 下載次數(shù): 8)

實(shí)例91  具有校正功能的時(shí)鐘1302LCD1602顯示)
實(shí)例91 帶校正時(shí)鐘1302(LCD1602顯示).rar (52.68 KB, 下載次數(shù): 5)

實(shí)例93  具有校正功能的時(shí)鐘1302LED數(shù)碼管顯示)
實(shí)例93 帶校正時(shí)分秒的時(shí)鐘1302(6位LED數(shù)碼管顯示).rar (732.75 KB, 下載次數(shù): 4)

以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1內(nèi)有常用的單片機(jī)應(yīng)用100案例,用于仿真實(shí)驗(yàn)操作,電路與程序真實(shí)可靠可信可行。仿真電路和Hex文件能在清華出版社網(wǎng)站免費(fèi)下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網(wǎng)上書店打折購(gòu)買。

99.9秒秒表.jpg (128.43 KB, 下載次數(shù): 94)

99.9秒秒表.jpg

實(shí)例95 99.9秒秒表.rar

38.86 KB, 下載次數(shù): 3

回復(fù)

使用道具 舉報(bào)

7#
ID:245536 發(fā)表于 2017-11-5 11:43 | 只看該作者
wulin 發(fā)表于 2017-11-4 07:20
送你一個(gè)示例,4*4矩陣鍵盤接在P2(只能接P1或P2,不能接P3,否則與串口沖突。如果接P0要加上拉電阻)。
#in ...

有沒(méi)有電路圖呢?我是小白,麻煩簡(jiǎn)單畫個(gè)圖紙也行
回復(fù)

使用道具 舉報(bào)

8#
ID:243738 發(fā)表于 2017-11-5 12:42 | 只看該作者
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define GPIO_DIG P0
  5. #define GPIO_KEY P1

  6. uchar code DIG_CODE[17]=
  7. {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  8. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  9. //數(shù)碼管的顯示碼
  10. uchar KeyValue;
  11. //用來(lái)存放讀取到的按下的鍵值
  12. void Delay10ms();
  13. //延時(shí)10ms
  14. void KeyDown();
  15. //按鍵函數(shù)
  16. void main(void)
  17. {
  18.         while(1)
  19.         {
  20.                 KeyDown();
  21.                 GPIO_DIG=~DIG_CODE[KeyValue];
  22.                 //數(shù)碼管顯示按鍵值
  23.         }                               
  24. }
  25. void KeyDown(void)
  26. {
  27.         char a=0;
  28.         GPIO_KEY=0x0f;//P1高四位低電平0000,低四位高電平1111
  29.         if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
  30.         {
  31.         Delay10ms();//延時(shí)10ms消抖
  32.                 if(GPIO_KEY!=0x0f)//再次檢測(cè)鍵盤是否按下
  33.                 {
  34.                         GPIO_KEY=0x0f;//測(cè)試列 00001111
  35.                                 switch(GPIO_KEY)
  36.                                 {
  37.                                         case(0x07): KeyValue=0;break;//00000111,第一列有按鍵按下  
  38.                                         case(0x0b): KeyValue=1;break;//00001011,第二列有按鍵按下
  39.                                         case(0x0d): KeyValue=2;break;//00001101,第三列有按鍵按下
  40.                                         case(0x0e): KeyValue=3;break;//00001110,第四列有按鍵按下
  41.                                 }
  42.                         GPIO_KEY=0xf0;//測(cè)試行 11110000
  43.                                 switch(GPIO_KEY)
  44.                                 {
  45.                                         case(0x70): KeyValue=KeyValue;break;//01110000,第一行有按鍵按下
  46.                                         case(0xb0): KeyValue=KeyValue+4;break;//10110000,第二行有按鍵按下
  47.                                         case(0xd0): KeyValue=KeyValue+8;break;//11010000,第三行有按鍵按下
  48.                                         case(0xe0): KeyValue=KeyValue+12;break;//11100000,第四行有按鍵按下
  49.                                 }//得到相應(yīng)的鍵值
  50.                         while((a<50)&&(GPIO_KEY!=0xf0))//按鍵松手檢測(cè)
  51.                                 {
  52.                                 Delay10ms();
  53.                                 a++;
  54.                                 }
  55.                         }
  56.         }
  57. }

  58. void Delay10ms(void)   //誤差 0us
  59. {
  60.     uchar a,b,c;
  61.     for(c=1;c>0;c--)
  62.         for(b=38;b>0;b--)
  63.             for(a=130;a>0;a--);
  64. }


  65. /*逐行掃描:高四位輪流輸出低電平來(lái)對(duì)矩陣鍵盤
  66. 進(jìn)行逐行掃描,當(dāng)?shù)退奈唤邮盏降臄?shù)據(jù)不全為1時(shí)
  67. 說(shuō)明有按鍵按下,然后通過(guò)接收到的數(shù)據(jù)是哪一
  68. 位為0來(lái)判斷哪一個(gè)按鍵被按下*/
  69. /*行列掃描:我們可以通過(guò)高四位全部輸出低電平,
  70. 低四位輸出高電平。當(dāng)接收到的數(shù)據(jù),低四位不全為高電平時(shí),
  71. 說(shuō)明有按鍵按下,然后通過(guò)接收的數(shù)據(jù)值,判斷是哪一列有
  72. 按鍵按下,然后再反過(guò)來(lái),高四位輸出高電平,第四位輸出低電平,
  73. 然后根據(jù)接收到的高四位的值判斷是哪一行有按鍵按下,這樣就能夠
  74. 確定是哪一個(gè)按鍵按下了。*/
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

9#
ID:245536 發(fā)表于 2017-11-5 13:43 | 只看該作者

電路圖有嗎?我不太在行
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美a级成人淫片免费看 | 美女国产 | 91麻豆精品一区二区三区 | 狠狠婷婷综合久久久久久妖精 | 成人精品啪啪欧美成 | 久久一视频 | 蜜桃综合在线 | 久久国产精品免费一区二区三区 | 一级片免费观看 | h视频在线免费观看 | 浴室洗澡偷拍一区二区 | 亚洲网在线 | 国产高清一区二区 | 久久综合一区二区三区 | 久久视频精品 | 欧美精品一区二区免费视频 | a在线免费观看 | 男女羞羞网站 | 亚洲欧美日韩国产综合 | 精品久久香蕉国产线看观看亚洲 | 日韩在线一区二区三区 | 亚洲久久在线 | 亚洲精选一区二区 | 成人不卡一区二区 | 国产精品一区二区无线 | 国产午夜精品一区二区三区嫩草 | 精品国产伦一区二区三区观看方式 | 精品免费国产视频 | 成人国产在线观看 | 国产毛片在线看 | 欧美在线a| 日韩亚洲视频 | 蜜桃视频一区二区三区 | 国产日韩欧美 | 午夜视频在线观看网站 | 一区二区三区日韩 | 一区二区视频在线 | 亚洲一区二区精品视频 | 特黄毛片视频 | h视频在线观看免费 | 91视频一区二区三区 |