51单片机:独立按键与矩阵按键控制数码管

一,独立按键注意一下几点

>按下的时候,电压被拉低,所以IO口要传低电平( 0x0 )

>按下的时候要消除抖动 ( 延时10ms ),在判断,是否还是低电平,再做业务处理

下面这段程序,就是通过一个独立按键连接到p1口,控制静态数码管的 一段 进行亮和灭的切换。

#include <reg52.h>

sbit key_control = P1^0;
sbit led = P0^0;

typedef unsigned char u8;
typedef unsigned int u16;

void delay( u16 i ){
    while( i-- );
}

void key_press(){
    if( key_control == 0x0 ) {
        delay( 1110 );
        if( key_control == 0x0 ){
            led = ~led;
        }
        while( !key_control );
    }
}

void main (){
    /*
    while( 1 ){
        if( key_control == 0x0 ) {
            delay( 1110 ); //大概10ms
            if ( key_control == 0x0 ) {
                led = 1;
            }
        }else if( key_control == 0x1 ) {
            delay( 1110 );
            if ( key_control == 0x1 ) {
                led = 0;
            }
        }
    }
    */

    led = 0;
    while( 1 ) {
        key_press();
    }

}

二, 当按键比较多的时候,用矩阵按钮,因为如果不用矩阵按钮,一个独立按键需要一个IO口,浪费资源。

如: 16个独立按键需要16个io口, 而16个矩阵按键(4x4,一共8个管脚)需要8个IO口

下面的程序,通过16个矩阵按钮,控制静态数码管,显示0~F

#include <reg52.h>

#define GPIO_DIG    P0   //段选数码管
#define GPIO_KEY     P1      //矩阵按键

typedef unsigned char u8;
typedef unsigned int u16;

void delay( u16 i ){
    while( i-- );
}

u8 key_value;
//静态数码管段码
u8 character [16] = { 0xC0, 0xF9 , 0xA4 , 0xB0 , 0x99 , 0x92,
                      0x82 , 0xF8 , 0x80  , 0x90 , 0x88 , 0x83,
                      0xC6 , 0xA1 , 0x86 , 0x8E};

void key_down(){
    u8 count = 0;
    //行列扫描 判断哪个键被按下
    GPIO_KEY = 0x0F; //高四位全部输出低电平,低四位输出高电平-->判断被按下的按钮所在的列
    if( GPIO_KEY != 0x0F ) { //有按键按下
        delay( 1110 ); //消除抖动
        if( GPIO_KEY != 0x0F ){
            switch( GPIO_KEY ){
                case 0x07:
                    key_value = 0; //矩阵第1列的按钮被按下
                    break;
                case 0x0B:
                    key_value = 1; //矩阵第2列的按钮被按下
                    break;
                case 0x0D:
                    key_value = 2; //矩阵第3列的按钮被按下
                    break;
                case 0x0E:
                    key_value = 3; //矩阵第4列的按钮被按下
                    break;
            }
            GPIO_KEY = 0xF0; //高四位输出高电平,低四位输出低电平-->判断被按下的按钮所在的行
            switch( GPIO_KEY ){
                case 0x70:
                    key_value = key_value; //矩阵第1行的按钮被按下
                    break;
                case 0xB0:
                    key_value = key_value + 4; //矩阵第2行的按钮被按下
                    break;
                case 0xD0:
                    key_value = key_value + 8; //矩阵第3行的按钮被按下
                    break;
                case 0xE0:
                    key_value = key_value + 12; //矩阵第4行的按钮被按下
                    break;
            }

            GPIO_DIG = character[key_value];

            //如果一直按下按键,等待500ms,强制退出
            while( ( count < 50 ) && ( GPIO_KEY != 0xF0 ) ) {
                count++;
            }
        }
    }
}

void main (){

    while( 1 ) {
        key_down();
    }
}

原文地址:https://www.cnblogs.com/ghostwu/p/9142613.html

时间: 2024-09-30 19:16:22

51单片机:独立按键与矩阵按键控制数码管的相关文章

[51单片机] nRF24L01 无线模块 测试 按键-灯-远程控制

哈哈,穷吊死一个,自己做的一个超简单的板还没有电源提供,只得借助我的大开发板啦.其实这2个模块是完全可以分开的,无线嘛,你懂得!进入正题,这个实验的功能就是一个发送模块(大的那个板)连接4个按键,通过按动这4个不同的按键来发送4种不同的命令,来控制接收端(小的板)点亮4个不同的灯. >_<!首先是发送模块: 1 void main() 2 { 3 uchar Tx_Buf1[]={1}; //发送的信息1 4 uchar Rx_Buf[32]; //接收到的数据暂存器,最多32字节数据 5 i

基于51单片机的独立按键和矩阵按键用法

------------恢复内容开始------------ 主要实现如图所示的功能 将主函数以外的函数全部放在qiyu.h文件中 1 //qiyu.h 2 #define KEY_PORT P1 3 #define led P2 4 #define unchar unsigned char 5 #define uint unsigned int 6 7 sbit Buz = P1^5; 8 sbit LED = P2^0; 9 sbit K1 = P3^0; 10 sbit K2 = P3^1

单片机独立按键与矩阵按键

独立按键 首先既然是检测输入,对于当然要使能上拉电阻,来检测变化.因为除了P0口外,P2,P3,P4都是内置上拉电阻的准双向IO口,作为输入前需要拉为高电平. 当有按键按下,致使单片机的某个引脚接地,变为低电平时,我们就认为这个按键按下了.当按键松开后,由于输入不会锁存,所以此时拉高的引脚回归到高电平. 独立按键的内部原理. 独立按键的4个引脚中,两两为一组.每一组的2个引脚是连在一起的,当按键按键时,2个组又连接了,也就是4个脚都连接一起了. 按键的很重要注意点就是消除抖动,消抖.因为人按下按

单片机入门-矩阵键盘控制数码管显示

任务简述:通过按下4X4矩阵键盘实现数码管对应显示数字 实现方式:通过行列分接法,可以节省使用单片机的I/O口,扫描矩阵键盘是否有按下,判断P2端口得到的值. protues 硬件系统 单片机晶振复位电路: 锁存器.上拉电阻: 4x4矩阵键盘: 代码实现: void key44scan(void)//键盘扫描函数 { uint t; P2=0xfe; t=P2; t=t&0xf0; if(t!=0xf0) { delay(); t=P2; switch(t) { case 0xee:keynum

51单片机第四弹---矩阵键盘

原理图: 原理: 和独立键盘相似 /******************************************************************************* * 实 验 名 : 矩阵键盘实验 * 使用的IO : 数码管使用P0 矩阵键盘使用P3 * 实验效果 : 显示独立键盘的按键值 * 注 意 : *******************************************************************************/

51单片机使用中缀表示法实现计算器

-------------------------------------------- 开发板:畅学51单片机学习板 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 使用元件: STC51单片机芯片 51单片机核心板 LCD1602 矩阵键盘 11.

云龙51单片机视频教程全套包含案例课件及资料

课程简介: 视频教程从开发的角度来讲述单片机开发的整个流程:原理部分从最基本的电子元器件的认识进行讲解,讲述电路工作原理及如何进行电路设计:编程部分从零开始讲解,讲述C语言的基础知识.C 语言如何同实际电路发生联系,每一条语句坚持现场在电脑逐字输入.现场编写代码.现场调式程序.把相关知识点及时讲解:让大家在这一过程中,慢慢积累.转化为自身发现问题和解决问题的能力 .无论你基础如何,只要你认真看.认真听,保证让你学会单片机和C语言. 课程目录: 第一课 如何学好单片机 单片机能做什么,学习单片机需

51单片机按键连击

51单片机按键双击 关键字:51单片机  按键双击 //hnrain 改 //适用于CEPARK 51开发板 /****************************************************************************************** *********************** www.cepark.com            电子园 按键高阶攻略设计大赛 名称:        2*4矩阵键盘扫描 (状态机) 功能:       

电子时钟万年历+51单片机+1602液晶屏+DS1302+DS18B20+按键

这次课程设计要完成的是制作一个基于51单片机的电子时钟的万年历(protues仿真),需要用到1602液晶屏+DS1302+DS18B20+按键等模块.各个的模块就不在一一介绍,直接讲解这个系统的功能,首先是四个按键,第一个按键是选中需要修改时间位置,在按一次选中下一个,依次类推,第二个按键是对数值进行加一,第三个按键对数值进行减一,第四个按键确认. 先放仿真图 然后是代码: main.c #include <REG52.H> #include <intrins.h> #defin