日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单片机学习笔记(五)—— 键盘

發布時間:2024/3/13 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机学习笔记(五)—— 键盘 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、鍵盤的分類 ? ??? ??· 編碼式鍵盤
? ??? ??· 非編碼式鍵盤

? ??? ??編碼式鍵盤:鍵盤上閉合鍵的識別由專用的硬件編碼器實現,并產生鍵編碼號或鍵值。(如:計算機鍵盤)
? ??非編碼式鍵盤:軟件編程來識別。(單片機中使用最多)

2、非編碼式鍵盤
? ??· 獨立鍵盤
? ??· 矩陣鍵盤

? ??(1)獨立鍵盤

原理:當按鍵被按下時,P3.4?/?P3.7?將會與 GND 連通,即為低電平(0);

隨手代碼: ? ?
  • #include<reg52.h>
  • #define uint unsigned int
  • #define uchar unsigned char
  • sbit d1=P1^0;
  • sbit dula=P2^6; //數碼管段選信號
  • sbit wela=P2^7; //數碼管位選信號
  • sbit key1=P3^4; //獨立按鍵key1
  • uchar code table[]={ //數碼管顯示編碼
  • 0x3f,0x06,0x5b,0x4f,
  • 0x66,0x6d,0x7d,0x07,
  • 0x7f,0x6f,0x77,0x7c,
  • 0x39,0x5e,0x79,0x71};
  • uchar num;
  • void delay(uint z) //延時 (防抖)
  • {
  • uint x,y;
  • for(x=z;x>0;x--)
  • for(y=110;y>0;y--);
  • }
  • void main()
  • {
  • wela=1;
  • P0=0xfe; //打開低一數碼管
  • wela=0;
  • P3=0xff;
  • while(1)
  • {
  • if(key1==0) //監聽按鍵是否被按下
  • {
  • delay(5);//延時5ms (具體解釋見本文尾)
  • if(key1==0)//再次確認按鍵是否被按下
  • {
  • d1=0;
  • num++;
  • if(num==10)
  • num=0;
  • }
  • while(!key1);//松手監測
  • delay(5);
  • while(!key1);//再次確認是否松手
  • }
  • else
  • d1=1;
  • dula=1;
  • P0=table[num];//數碼管顯示
  • dula=0;
  • }
  • }
  • (2)矩陣鍵盤 ? ?? ? ? 通常,矩陣式鍵盤 8 個引腳接在單片機的 P3.0 ~P3.7上

    原理:(以下為第一行鍵盤,以此類推) ? ? (1)將 P3 口賦值為 0xfe (1111,1110)
    ? ? (2)定義一個變量 temp = P3, 通過 temp &= ?0xf0,取其高四位,判斷是否有鍵被按下
    ? ? (3)重讀 P3 口,判斷是哪一個鍵被按下

    隨手代碼:
  • #include<reg52.h>
  • #define uint unsigned int
  • #define uchar unsigned char
  • sbit dula = P2 ^ 6;
  • sbit wela = P2 ^ 7;
  • uchar code table[]={
  • 0x3f,0x06,0x5b,0x4f,
  • 0x66,0x6d,0x7d,0x07,
  • 0x7f,0x6f,0x77,0x7c,
  • 0x39,0x5e,0x79,0x71,0};
  • uchar num,temp,num1;
  • void delay(uint z)
  • {
  • uint x,y;
  • for(x = z; x > 0; x--)
  • for(y = 110; y > 0; y--);
  • }
  • uchar keyscan();
  • void display(uchar aa);
  • void main()
  • {
  • num = 17;
  • dula = 1;
  • P0 = 0;
  • dula = 0;
  • wela = 1;
  • P0 = 0xc0;
  • wela = 0;
  • while(1)
  • {
  • display(keyscan());
  • }
  • }
  • void display(uchar aa)//數碼管顯示
  • {
  • dula = 1;
  • P0 = table[ aa - 1 ];
  • dula = 0;
  • }
  • uchar keyscan()
  • {
  • P3 = 0xfe;
  • temp = P3;
  • temp = temp & 0xf0;
  • while(temp != 0xf0)//防抖
  • {
  • delay(5);
  • temp = P3;
  • temp = temp & 0xf0;
  • while(temp != 0xf0)
  • {
  • temp = P3;
  • switch(temp)
  • {
  • case 0xee: num = 1;
  • break;
  • case 0xde: num = 2;
  • break;
  • case 0xbe: num = 3;
  • break;
  • case 0x7e: num = 4;
  • break;
  • }
  • while(temp != 0xf0)//松手監測
  • {
  • temp=P3;
  • temp=temp&0xf0;
  • }
  • }
  • }
  • P3 = 0xfd;
  • temp = P3;
  • temp = temp & 0xf0;
  • while(temp != 0xf0)
  • {
  • delay(5);
  • temp = P3;
  • temp = temp & 0xf0;
  • while(temp != 0xf0)
  • {
  • temp = P3;
  • switch(temp)
  • {
  • case 0xed: num = 5;
  • break;
  • case 0xdd: num = 6;
  • ????break;
  • case 0xbd: num = 7;
  • break;
  • case 0x7d: num = 8;
  • break;
  • }
  • while(temp != 0xf0)
  • {
  • temp = P3;
  • temp = temp & 0xf0;
  • }
  • }
  • }
  • P3 = 0xfb;
  • temp = P3;
  • temp = temp & 0xf0;
  • while(temp != 0xf0)
  • {
  • delay(5);
  • temp = P3;
  • temp = temp & 0xf0;
  • while(temp != 0xf0)
  • {
  • temp = P3;
  • switch(temp)
  • {
  • ???? case 0xeb: num = 9;
  • break;
  • case 0xdb: num = 10;
  • break;
  • case 0xbb: num = 11;
  • break;
  • case 0x7b: num = 12;
  • break;
  • }
  • while(temp != 0xf0)
  • {
  • temp = P3;
  • ????temp = temp & 0xf0;
  • }
  • }
  • }
  • P3 = 0xf7;
  • temp = P3;
  • temp = temp & 0xf0;
  • while(temp != 0xf0)
  • {
  • delay(5);
  • temp = P3;
  • temp = temp & 0xf0;
  • while(temp != 0xf0)
  • {
  • temp = P3;
  • switch(temp)
  • {
  • case 0xe7: num = 13;
  • break;
  • case 0xd7: num = 14;
  • break;
  • case 0xb7: num = 15;
  • break;
  • case 0x77: num = 16;
  • break;
  • }
  • ????while(temp != 0xf0)
  • {
  • temp = P3;
  • temp = temp & 0xf0;
  • }
  • }
  • }
  • ????return num;
  • }
  • 3、抖動現象 ? ??? ??按鍵在閉合和斷開時,觸點會存在抖動現象

    ?圖 ?1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖 ?2 ? ?? ? ? 如圖1,我們可以在 delay(5)后,重新讀取,可消除抖動; 圖2是硬件防抖

    總結

    以上是生活随笔為你收集整理的单片机学习笔记(五)—— 键盘的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。