tft每日頭條

 > 圖文

 > c51單片機怎麼檢測按鍵

c51單片機怎麼檢測按鍵

圖文 更新时间:2024-12-15 14:47:55
  • 實驗準備

  • 課程内容

第六課 輸入控制—鍵盤實驗準備:

使用前一課已裝配好的實驗闆

共陽極單位數碼管1隻

蜂鳴器模塊一件

電阻:10k 8隻 或排阻(用于P0上拉)

(或直接使用完整的開發闆)

課程内容:一、8位獨立鍵盤

c51單片機怎麼檢測按鍵(第六課輸入控制)1

從原理圖看到,8個按鍵都有一個腳 接GND,即 0;

也就是說,哪個鍵按下去,對應接這個鍵的管腳 就是 0。

實驗,把獨立鍵盤到P2組,注意P2的 IO 順序與其他三排不同。剛好,這獨立鍵盤的接口排序與P2的IO順序相同。

就用前一課的程序,稍作修改。

void main()

{

for(;;)

{

c51單片機怎麼檢測按鍵(第六課輸入控制)2

c51單片機怎麼檢測按鍵(第六課輸入控制)3

從成品與原理圖中可以看到,矩陣鍵盤與前面課程中的LED點陣有點類似,隻是這裡僅用一組IO端口就夠了,橫線4條與縱線4條各連接按的一個腳。隻要控制橫線狀态全1,縱線某線為0,當這縱線某鍵按下,判斷對應的橫線哪個變為0,就可以知道哪個鍵被按下了。

void main()

{

uchar a = 0x00;

for(;;)

{

P2 = 0xFE;

a = P2;

if(a==0xEE) P0=light[1];

if(a==0xDE) P0=light[2];

if(a==0xBE) P0=light[3];

if(a==0x7E) P0=light[10];//顯示 A

P2 = 0xFD;

a = P2;

if(a==0xED) P0=light[4];

if(a==0xDD) P0=light[5];

if(a==0xBD) P0=light[6];

if(a==0x7D) P0=light[11];//顯示 b

P2 = 0xFB;

a = P2;

if(a==0xEB) P0=light[7];

if(a==0xDB) P0=light[8];

if(a==0xBB) P0=light[9];

if(a==0x7B) P0=light[12];//顯示 C

P2 = 0xF7;

a = P2;

if(a==0xE7) P15=0;//蜂鳴器響

if(a==0xD7) P0=light[0];

if(a==0xB7) P15=1;//蜂鳴器靜音

if(a==0x77) P0=light[13];//顯示 d

}

}

代碼分析:

P2初值 0xFE(11111110)也就是僅讓最低位的一條線為0,

按下後,如讀到P2值是 0xEE (11101110),那麼表示高4位的4線中排在開頭的線與最低位連接了,從1變成0了,也就從這判斷了 按下了矩陣鍵盤的1鍵。

a = P2; //讀P2值

if(a==0xEE) P0=light[1];

判斷,如果判斷到這狀态,表示鍵盤的1按下了,數碼管顯示1

其他按鍵類似。

三、程序優化與增補C語言基礎

先看回之前的程序 中的 if 結構

if ---

if --- else ---

if--- else if ---else if --- else ---

if 語句 嵌套

if (條件)

{

if --- else ---

}

else

{

if ---

}

好用的條件運算符

表達式1?表達式2:表達式3

例如

求最大值

if (a>b) max=a;

else max = b;

直接換成一句: max= (a>b)?a:b;

多分支結構 swith/case

可以把前面的 矩陣鍵盤優化改造

循環:

除了以前的for 循環,還有 while 循環 和 do---while循環(P76流程圖)

修改前面的程序 改用 while 循環

break 語句 修改前面的程序 按某鍵時退出循環

continue語句 修改前面的程序 加這句讓後面的數不顯示 即對應語句跳過

常量與變量

mDelay(1000);

可以定義一個 uchar speed; 然後調用 mDelay(speed);

實驗,按不同的鍵 修改 延時的時間 快 慢

整型常量,整型變量 帶符号,無符号

字符型常量,變量

(注意,字符在内存中也是以數字存放的)

即 char c=’a’; 與 int c=97;效果一樣

注意 字符是用單引号括起的

如果用雙引号,那麼就成是字符串,字符串是字符的集合,以數組形式定義。

數組,可以看 function.h

單片機本身速度慢,一般不做有關負數的運算

數的溢出。之前實驗中倒計時中 就是數的溢出造成BUG

實型數據 (又稱為浮點數)

兩種方式,一種是直接用10進制 帶小數

另一種 類似于 平常講的 科學記數法 123e3

C語言中 定義 實型數據 兩種命名方法

Double(雙精度) float(單精度)

平常使用,如果用到實數,一般用 double

C51單片機一般不用實型數據,即使要用,也是采用變通方式,

例如,用整數方式運算,然後在數碼管某位顯示 小數點 讓整個數顯示 成小數形式

C51特有常用數據 function.h 中有示例

sbit bit

程序存儲位置 code

了解各種運算符

算述運算符 其中一個求字節數 sizeof

一個字節8位,所以function.h 的數組長度 可以直接用 sizeof 求得

強制轉換與默認轉換 (大概知道即可)

全局變量 局部變量

了解 變量有效作用範圍即可

數組與指針

從 function.h 中認識數組

補充字符型數組

char a[]={“Welcome”};

注意其中用雙引号而不是之前單個字符的單引号

這字符數組a長度 是8,因為最後一個符号 \0 是C語言自動加上的

指針的概念,例如,已有數組

uchar code light[] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x8C,0x89,0xC7,0x91,0xBF,0xFF};

然後定義:

char *p;

p=&light[0];//把前面第一組數0xC0在電腦中存儲的位置記在p中

如果之後 p ,就指向第二個數0xF9,如果這裡用個命令

b = *p; 表示把p所指的位置的數取出給 b

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved