国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

藍橋杯單片機開發(fā)及應(yīng)用-基礎(chǔ)模塊06-矩陣鍵盤

這篇具有很好參考價值的文章主要介紹了藍橋杯單片機開發(fā)及應(yīng)用-基礎(chǔ)模塊06-矩陣鍵盤。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、先前知識

使用到的74HC138譯碼器、74HC573鎖存器和數(shù)碼管模塊等,在前面的基礎(chǔ)模塊的介紹中都有簡單介紹,這里就不再介紹了。

  1. 按鍵之矩陣鍵盤模塊

藍橋杯板子上按鍵部分的右下角有個J5模塊,用跳帽來進行獨立按鍵和矩陣鍵盤之間的切換。此次使用矩陣鍵盤的時候需要把跳帽接到1~2引腳。

矩陣鍵盤就是4×4,一共16個按鍵。其工作原理是,用跳帽將四行按鍵的左邊都與單片機的引腳相連,那么電平就為單片機引腳輸出電平。按鍵在沒有按下的時候按鍵下方的兩個觸點是沒有接在一起的,也就是說原理圖上按鍵的左邊腳始終是與單片機引腳輸出的電平相同。當(dāng)按鍵按下,按鍵下方的金屬墊片接觸時,兩個觸點接通,那么按鍵右邊的腳(也是單片機其他的引腳)就會檢測到與按鍵左邊引腳相同的電平。就是依據(jù)此特征來判斷按鍵是否被按下。

我們看到藍橋杯板子上的按鍵是有四個腳的,而上篇文章中的獨立按鍵和此次的矩陣鍵盤,似乎都只用到了兩個腳,那么是不是錯誤的呢?

其實不是,按鍵雖然有四個端口,但是按鍵內(nèi)部有兩個腳是短接的,另外兩個腳是引出腳,一個作為輸入,一個作為輸出。

藍橋杯單片機板子,# 藍橋杯基礎(chǔ)模塊,藍橋杯,單片機,51單片機,c語言,Powered by 金山文檔

圖一、按鍵模塊

  1. 部分代碼解釋

就第一行按鍵部分的代碼而言(其他行按鍵的代碼類似):

在矩陣鍵盤中要判斷哪一個按鍵按下需要用到掃描的思想,從上到下依次給每一行低電平,當(dāng)某一列檢測到低電平的時候,就可以用坐標(biāo)的思想,找到是哪一個按鍵被按下。一次只能把一行給低電平,掃哪一行哪一行就是低電平。

? ? R1 = 0;? ? ? ? ? ? ? ? // 先檢測第一行按鍵是否被按下,那么就給第一行低電平
    R2 = R3 = R4 = 1;? ? ? // 其他行給高電平
    C1 = C2 = C3 = C4 = 1;?// 先初始化默認每一列的按鍵都沒有被按下
    if( C1 == 0 )                // 第一行第一列被按下,S7
    {
        while( C1 == 0 );
        Key_Num = 7;
    }
    else if( C2 == 0 )          // 第一行第二列被按下,S11
    {
        while( C2 == 0 );
        Key_Num = 11;
    }
    else if( C3 == 0 )          // 第一行第三列被按下,S15
    {
        while( C3 == 0 );
        Key_Num = 15;
    }
    else if( C4 == 0 )          // 第一行第四列被按下,S19
    {
        while( C4 == 0 );
        Key_Num = 19;
    }

二、模塊控制實現(xiàn)過程簡述

先把按鍵的跳帽接到1~2引腳上,然后定義輸出行和輸入行,再用掃描的方法控制矩陣鍵盤。

三、所要實現(xiàn)的功能

首先上電之后數(shù)碼管的后兩位顯示00,然后根據(jù)板子上矩陣鍵盤的每個按鍵的名稱,當(dāng)按鍵被按下后在數(shù)碼管上顯示相應(yīng)的數(shù)字。(也就是如果某個按鍵上標(biāo)的數(shù)是S07,那么該按鍵按下后數(shù)碼管的后兩位就顯示07,如果某個按鍵上標(biāo)的數(shù)是S16,那么該按鍵按下后數(shù)碼管的后兩位就顯示16)程序循環(huán)實現(xiàn)上述功能。

四、代碼實現(xiàn)

①引腳以及參數(shù)定義

// 矩陣鍵盤定義輸入行
sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;


// 矩陣鍵盤定義輸出列
sbit C1 = P4^4;
sbit C2 = P4^2;
sbit C3 = P3^5;
sbit C4 = P3^4;


// 參數(shù)定義
unsigned char Key_Num;    // 按鍵角標(biāo)

②數(shù)碼管段碼

// 數(shù)碼管段碼
unsigned char code SMG_Duanma[18] = 
{
    0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 , 0x82 , 0xf8 , 0x80 ,
    0x90 , 0x88 , 0x80 , 0xc6 , 0xc0 , 0x86 , 0x8e , 0xbf , 0x7f
};    // 0~F - .

③138譯碼器通道選擇函數(shù)

// 通道選擇
void HC138_Init( unsigned char channel )
{
    switch( channel )
    {
        case 0:
            P2 = (P2 & 0x1f) | 0x00;    // 0
        break;
        case 4:
            P2 = (P2 & 0x1f) | 0x80;    // Y4C
        break;
        case 5:
            P2 = (P2 & 0x1f) | 0xa0;    // Y5C
        break;
        case 6:
            P2 = (P2 & 0x1f) | 0xc0;    // Y6C
        break;
        case 7:
            P2 = (P2 & 0x1f) | 0xe0;    // Y7C
        break;
    }
}

④初始化系統(tǒng)-關(guān)閉目前不需要的蜂鳴器和繼電器

// 初始化系統(tǒng)
void Init_System(void)
{
    // 關(guān)閉LED燈
    HC138_Init( 4 );
    P0 = 0xff
    
    // 關(guān)閉蜂鳴器和繼電器
    HC138_Init( 5 );
    P0 = 0xaf;          // 1010 1111

    HC138_Init( 0 );    // 關(guān)閉通道選擇
}

⑤單個數(shù)碼管點亮函數(shù)

// 單個數(shù)碼管點亮
void SMG_Light( unsigned char pos , unsigned char dat )
{
    HC138_Init( 6 );
    P0 = 0x01 << pos;    // 某個數(shù)碼管處于準(zhǔn)備階段
    
    HC138_Init( 7 );
    P0 = dat;            // 顯示數(shù)值
}

⑥數(shù)碼管顯示函數(shù)

// 數(shù)碼管顯示
void SMG_Show( unsigned char num )
{
    SMG_Light( 0 , 0xff );? ? // 不用的數(shù)碼管就關(guān)閉
    Delay_tms( 10 );
    SMG_Light( 1 , 0xff );
    Delay_tms( 10 );
    SMG_Light( 2 , 0xff );
    Delay_tms( 10 );
    SMG_Light( 3 , 0xff );
    Delay_tms( 10 );
    SMG_Light( 4 , 0xff );
    Delay_tms( 10 );
    SMG_Light( 5 , 0xff );
    Delay_tms( 10 );
    SMG_Light( 6 , SMG_Duanma[ num / 10 ] );
    Delay_tms( 10 );
    SMG_Light( 7 , SMG_Duanma[ num % 10 ] );
    Delay_tms( 10 );
}

⑦按鍵掃描函數(shù)

// 按鍵掃描
void Key_Scan(void)
{
    // 第一行
    R1 = 0;
    R2 = R3 = R4 = 1;
    C1 = C2 = C3 = C4 = 1;
    if( C1 == 0 )                // S7
    {
        while( C1 == 0 );
        Key_Num = 7;
    }
    else if( C2 == 0 )          // S11
    {
        while( C2 == 0 );
        Key_Num = 11;
    }
    else if( C3 == 0 )          // S15
    {
        while( C3 == 0 );
        Key_Num = 15;
    }
    else if( C4 == 0 )          // S19
    {
        while( C4 == 0 );
        Key_Num = 19;
    }
    
    // 第二行
    R2 = 0;
    R1 = R3 = R4 = 1;
    C1 = C2 = C3 = C4 = 1;
    if( C1 == 0 )                // S6
    {
        while( C1 == 0 );
        Key_Num = 6;
    }
    else if( C2 == 0 )          // S10
    {
        while( C2 == 0 );
        Key_Num = 10;
    }
    else if( C3 == 0 )          // S14
    {
        while( C3 == 0 );
        Key_Num = 14;
    }
    else if( C4 == 0 )          // S18
    {
        while( C4 == 0 );
        Key_Num = 18;
    }
    
    // 第三行
    R3 = 0;
    R2 = R1 = R4 = 1;
    C1 = C2 = C3 = C4 = 1;
    if( C1 == 0 )                // S5
    {
        while( C1 == 0 );
        Key_Num = 5;
    }
    else if( C2 == 0 )          // S9
    {
        while( C2 == 0 );
        Key_Num = 9;
    }
    else if( C3 == 0 )          // S13
    {
        while( C3 == 0 );
        Key_Num = 13;
    }
    else if( C4 == 0 )          // S17
    {
        while( C4 == 0 );
        Key_Num = 17;
    }
    
    // 第四行
    R4 = 0;
    R2 = R3 = R1 = 1;
    C1 = C2 = C3 = C4 = 1;
    if( C1 == 0 )                // S4
    {
        while( C1 == 0 );
        Key_Num = 4;
    }
    else if( C2 == 0 )          // S8
    {
        while( C2 == 0 );
        Key_Num = 8;
    }
    else if( C3 == 0 )          // S12
    {
        while( C3 == 0 );
        Key_Num = 12;
    }
    else if( C4 == 0 )          // S16
    {
        while( C4 == 0 );
        Key_Num = 16;
    }
}

⑧延時函數(shù)

void Delay_tms( unsigned int t )
{
    int i;
    while( t-- )
    {
        for( i=115 ; i>0 ; i-- )
        {
            
        }
    }
}

⑨整個函數(shù)展示文章來源地址http://www.zghlxwxcb.cn/news/detail-775463.html


#include <STC15F2K60S2.H>
#include "Delay_ms.h"


// 矩陣鍵盤定義輸入行
sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;


// 矩陣鍵盤定義輸出列
sbit C1 = P4^4;
sbit C2 = P4^2;
sbit C3 = P3^5;
sbit C4 = P3^4;


// 參數(shù)定義
unsigned char Key_Num;    // 按鍵角標(biāo)


// 數(shù)碼管段碼
unsigned char code SMG_Duanma[18] = 
{
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
    0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f
};    // 0~F - .


// 通道選擇
void HC138_Init( unsigned char channel )
{
    switch( channel )
    {
        case 0:
            P2 = (P2 & 0x1f) | 0x00;    // 0
        break;
        case 4:
            P2 = (P2 & 0x1f) | 0x80;    // Y4C
        break;
        case 5:
            P2 = (P2 & 0x1f) | 0xa0;    // Y5C
        break;
        case 6:
            P2 = (P2 & 0x1f) | 0xc0;    // Y6C
        break;
        case 7:
            P2 = (P2 & 0x1f) | 0xe0;    // Y7C
        break;
    }
}


// 初始化系統(tǒng)
void Init_System(void)
{
    // 關(guān)閉LED燈
    HC138_Init( 4 );
    P0 = 0xff
    
    // 關(guān)閉蜂鳴器和繼電器
? ? HC138_Init( 5 );
    P0 = 0xaf;          // 1010 1111

    HC138_Init( 0 );    // 關(guān)閉通道選擇
}


// 單個數(shù)碼管點亮
void SMG_Light( unsigned char pos , unsigned char dat )
{
    HC138_Init( 6 );
    P0 = 0x01 << pos;    // 某個數(shù)碼管處于準(zhǔn)備階段
    
    HC138_Init( 7 );
    P0 = dat;            // 顯示數(shù)值
}


// 數(shù)碼管顯示
void SMG_Show( unsigned char num )
{
    SMG_Light( 0 , 0xff );
    Delay_tms( 10 );
    SMG_Light( 1 , 0xff );
    Delay_tms( 10 );
    SMG_Light( 2 , 0xff );
    Delay_tms( 10 );
    SMG_Light( 3 , 0xff );
    Delay_tms( 10 );
    SMG_Light( 4 , 0xff );
    Delay_tms( 10 );
    SMG_Light( 5 , 0xff );
    Delay_tms( 10 );
    SMG_Light( 6 , SMG_Duanma[ num / 10 ] );
    Delay_tms( 10 );
    SMG_Light( 7 , SMG_Duanma[ num % 10 ] );
    Delay_tms( 10 );
}


// 按鍵掃描
void Key_Scan(void)
{
? ? // 第一行
    R1 = 0;
    R2 = R3 = R4 = 1;
    C1 = C2 = C3 = C4 = 1;
    if( C1 == 0 )                // S7
    {
        while( C1 == 0 );
        Key_Num = 7;
    }
    else if( C2 == 0 )          // S11
    {
        while( C2 == 0 );
        Key_Num = 11;
    }
    else if( C3 == 0 )          // S15
    {
        while( C3 == 0 );
        Key_Num = 15;
    }
    else if( C4 == 0 )          // S19
    {
        while( C4 == 0 );
        Key_Num = 19;
    }
    
? ? // 第二行
    R2 = 0;
    R1 = R3 = R4 = 1;
    C1 = C2 = C3 = C4 = 1;
    if( C1 == 0 )                // S6
    {
        while( C1 == 0 );
        Key_Num = 6;
    }
    else if( C2 == 0 )          // S10
    {
        while( C2 == 0 );
        Key_Num = 10;
    }
    else if( C3 == 0 )          // S14
    {
        while( C3 == 0 );
        Key_Num = 14;
    }
    else if( C4 == 0 )          // S18
    {
        while( C4 == 0 );
        Key_Num = 18;
    }
    
? ? // 第三行
    R3 = 0;
    R2 = R1 = R4 = 1;
    C1 = C2 = C3 = C4 = 1;
    if( C1 == 0 )                // S5
    {
        while( C1 == 0 );
        Key_Num = 5;
    }
    else if( C2 == 0 )          // S9
    {
        while( C2 == 0 );
        Key_Num = 9;
    }
    else if( C3 == 0 )          // S13
    {
        while( C3 == 0 );
        Key_Num = 13;
    }
    else if( C4 == 0 )          // S17
    {
        while( C4 == 0 );
        Key_Num = 17;
    }
    
? ? // 第四行
    R4 = 0;
    R2 = R3 = R1 = 1;
    C1 = C2 = C3 = C4 = 1;
    if( C1 == 0 )                // S4
    {
        while( C1 == 0 );
        Key_Num = 4;
    }
    else if( C2 == 0 )          // S8
    {
        while( C2 == 0 );
        Key_Num = 8;
    }
    else if( C3 == 0 )          // S12
    {
        while( C3 == 0 );
        Key_Num = 12;
    }
    else if( C4 == 0 )          // S16
    {
        while( C4 == 0 );
        Key_Num = 16;
    }
}




int main(void)
{
    Init_System();              // 初始化系統(tǒng)
    while(1)
    {
        Key_Scan();             // 按鍵掃描
        SMG_Show( Key_Num );    // 數(shù)碼管顯示
    }
}

五、運行圖片

藍橋杯單片機板子,# 藍橋杯基礎(chǔ)模塊,藍橋杯,單片機,51單片機,c語言,Powered by 金山文檔

到了這里,關(guān)于藍橋杯單片機開發(fā)及應(yīng)用-基礎(chǔ)模塊06-矩陣鍵盤的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 藍橋杯 單片機原理及應(yīng)用-試題匯總及答案

    單片機原理及應(yīng)用-試題匯總及答案 1、單片機是將微處理器、一定容量的 RAM 和ROM以及 I/O 口、定時器等電路集成在一塊芯片上而構(gòu)成的微型計算機。 2、單片機89C51片內(nèi)集成了 4 KB的FLASH ROM,共有 5 個中斷源。 3、兩位十六進制數(shù)最多可以表示 256 個存儲單元。 4、89C51是以下哪

    2024年02月07日
    瀏覽(93)
  • 藍橋杯單片機零基礎(chǔ)到國二經(jīng)驗分享

    藍橋杯單片機零基礎(chǔ)到國二經(jīng)驗分享

    ???????? 我參加的是第十三屆藍橋杯大賽,從最開始的零基礎(chǔ),毫無頭緒,到拿下國二,頗有體會,在這里將我的備賽經(jīng)驗分享給大家,希望可以幫到一些正在備賽的藍橋杯er 目錄 一.?藍橋杯-單片機組介紹 二 . 零基礎(chǔ)到國二歷程 ????????客觀題: ? ? ? ? 程序題:

    2024年02月03日
    瀏覽(91)
  • 藍橋杯-單片機設(shè)計與開發(fā)組-(1)經(jīng)驗分享

    藍橋杯-單片機設(shè)計與開發(fā)組-(1)經(jīng)驗分享

    ??????? 首先,我先自我介紹一下,本人是一名大二小菜。在2023年十四屆藍橋杯中獲得了省級二等獎,雖然談不上優(yōu)秀,不過在備賽過程中也有了自已的一套心得與看法,在兩個月備賽過程中,我已經(jīng)把16年到22真題全部獨立完成了。因此,有了一個想法想要在CSDN分享一下

    2024年02月05日
    瀏覽(90)
  • 藍橋杯單片機—— PCF8591的基本原理及A/D轉(zhuǎn)換應(yīng)用(14)

    藍橋杯單片機—— PCF8591的基本原理及A/D轉(zhuǎn)換應(yīng)用(14)

    一、原理分析 1、基本概念 PCF8591是一個單片集成、單獨供電、低功耗、 8-bit CMOS數(shù)據(jù)獲取器件 。PCF8591具有 4個模擬輸入、1個模擬輸出和1個串行I2C總線接口 。PCF8591的3個地址引腳 A0, A1和A2可用于硬件地址編程 ,允許在同個I2C總線上接入8個PCF8591器件,而無需額外的硬件。在

    2023年04月14日
    瀏覽(20)
  • 【藍橋杯單片機】工廠燈光控制系統(tǒng)案例解析(小蜜蜂老師基礎(chǔ)綜合實訓(xùn))

    【藍橋杯單片機】工廠燈光控制系統(tǒng)案例解析(小蜜蜂老師基礎(chǔ)綜合實訓(xùn))

    設(shè)備檢測——移位 L1~L8在板子上是從左至右,但是在對P0口賦值時是16進制從 高位(L8)—低位(L0) 根據(jù)原理圖,LED賦值 0亮1滅 為了方便賦值,可以把板子轉(zhuǎn)一下,讓LED排序與賦值順序相同 左移 右移 控制移位補0 ,使LED依次點亮、依次熄滅 unsigned char i 作為下文表格中的循環(huán)變量

    2023年04月09日
    瀏覽(20)
  • C51單片機基礎(chǔ)之4G模塊

    C51單片機基礎(chǔ)之4G模塊

    EC03-DNC是億佰特公司推出的 LTE CAT1 數(shù)傳模塊產(chǎn)品, 該產(chǎn)品軟件功能完善, 覆蓋絕大多數(shù)常規(guī)應(yīng)用場景, EC03-DNC 是為實現(xiàn)串口設(shè)備與網(wǎng)絡(luò)服務(wù),通過網(wǎng)絡(luò)相互傳輸數(shù)據(jù)而開發(fā)的產(chǎn)品 , 該產(chǎn)品是一款帶分集接收功能 的LTE-FDD/LTE-TDD 無線通信數(shù)傳模塊, 支持 LTE-FDD , LTE-TDD 網(wǎng)絡(luò)

    2023年04月08日
    瀏覽(21)
  • 藍橋杯STC15F2K60S2單片機 CCP/PCA/PWM模塊的學(xué)習(xí)與使用

    藍橋杯STC15F2K60S2單片機 CCP/PCA/PWM模塊的學(xué)習(xí)與使用

    有道是 “一花獨放不是春,萬紫千紅春滿園” 我們不能只滿足于 眼前所謂的 “夠用、能用” 的少量知識,而不去深入學(xué)習(xí)探究,進而不慎封鎖了自己的見識 和 更多 創(chuàng)新開發(fā)上的可能性。 曾經(jīng)僅滿足于學(xué)習(xí)了藍橋杯單片機的三個外部晶振 定時器: 定時器0、1、2. 就認為完

    2024年02月08日
    瀏覽(18)
  • 第十四屆藍橋杯(電子類)單片機開發(fā)——賽題源代碼分享

    第十四屆藍橋杯(電子類)單片機開發(fā)——賽題源代碼分享

    ? ? ? 需要源代碼一鍵三聯(lián),私聊我哦

    2024年02月05日
    瀏覽(92)
  • 單片機開發(fā)---ESP32-S3模塊上手

    單片機開發(fā)---ESP32-S3模塊上手

    想起來之前做的半成品單片機游戲機,又想繼續(xù)做一個,不過之前那個單片機驅(qū)動屏幕速率太低,已經(jīng)無法改進了。所以這次斥巨資購買了一款頂配的ESP32S開發(fā)板,做個簡單的游戲機,沒問題。 完整介紹鏈接 這花花綠綠的介紹,看著讓人甚是喜歡呢。 參考樂鑫官網(wǎng)的方式,

    2024年01月23日
    瀏覽(17)
  • STM32F103RCT6開發(fā)板M3單片機教程06--定時器中斷

    STM32F103RCT6開發(fā)板M3單片機教程06--定時器中斷

    除非特別說明,本章節(jié)描述的模塊應(yīng)用于整個 STM32F103xx 微控制器系列,因為我們使用是 STM32F103RCT6開發(fā)板是mini最小系統(tǒng)板。 本教程使用是( 光明谷SUN_STM32mini開發(fā)板 ) ? 首先了解一下是STM32F10X定時器(Timer) ? 注: 小容量產(chǎn)品是指閃存存儲器容量在16K至32K字節(jié)之間的STM32F101

    2024年02月04日
    瀏覽(99)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包