51单片机——数码管、按键、矩阵按键C语言入门编程

发布者:星空行者最新更新时间:2022-09-19 来源: csdn关键字:51单片机  数码管  按键  矩阵按键 手机看文章 扫描二维码
随时随地手机看文章

数码管:

        数码管按段数可分为七段数码管和八段数码管,八段数码管多一个DP(小数点)二极管。也可分为共阳极数码管(低电平点亮)和共阴极数码管(高电平点亮)。本开发板上使用的是2个四位一体共阴极数码管。数码管静态显示是控制数码管的每一个引脚,输入一次电平之后可以一直显示直到再一次改变电平,静态显示会增加IO口的使用,结构复杂成本高,但是会减少占用CPU的时间。数码管动态显示通过位选—段选—清零(消影)来通过发光管余辉和人的视觉暂留是我们感觉出每一位同时显示。 通过74HC138译码器(C为高位B为次高位A为低位)输入高电平输出低电平进行位选,然后通过74HC245驱动数码管段选(a为低位,DP为高位)。

//共阴极数码管段码表

0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71,0X00

 0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F    空

 

//共阳极数码管段码表

0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E,0XFF

 0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F    空

1.静态数码管:第二位数码管显示0

#include

 

void main()

{

    P2_2=0;//位选 LED7

    P2_3=1;

    P2_4=1;

    P0=0x3f;//段选 显示0

    while(1)

    {

        

    }

}


2.动态数码管:每一位数码管依次显示对应位数

数码管函数1


#include

 

unsigned char NixieNum[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71,0X00};//共阴极段码

 

void shumaguan(unsigned char wei,duan)

{

    P0=0x00;//清零消影 采用delay函数亮度增强

    switch(wei)//位选

    {

        case 1:P2_2=1;P2_3=1;P2_4=1;break;//P2_4为高位

        case 2:P2_2=0;P2_3=1;P2_4=1;break;

        case 3:P2_2=1;P2_3=0;P2_4=1;break;

        case 4:P2_2=0;P2_3=0;P2_4=1;break;

        case 5:P2_2=1;P2_3=1;P2_4=0;break;

        case 6:P2_2=0;P2_3=1;P2_4=0;break;

        case 7:P2_2=1;P2_3=0;P2_4=0;break;

        case 8:P2_2=0;P2_3=0;P2_4=0;break;

    }

    P0=NixieNum[duan];//段选

}


数码管函数2


#include

#include "DELAY.h"

 

unsigned char NixieNum[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71,0X00};//段码

 

void shumaguan(unsigned char wei,duan)

{

    switch(wei)//位选

    {

        case 1:P2_2=1;P2_3=1;P2_4=1;break;//P2_4为高位

        case 2:P2_2=0;P2_3=1;P2_4=1;break;

        case 3:P2_2=1;P2_3=0;P2_4=1;break;

        case 4:P2_2=0;P2_3=0;P2_4=1;break;

        case 5:P2_2=1;P2_3=1;P2_4=0;break;

        case 6:P2_2=0;P2_3=1;P2_4=0;break;

        case 7:P2_2=1;P2_3=0;P2_4=0;break;

        case 8:P2_2=0;P2_3=0;P2_4=0;break;

    }

    P0=NixieNum[duan];//段选

    delay(1);//延时1ms稳定图像 清零消影 静态关闭消影

    P0=0x00;//清零消影 静态关闭消影

}


主函数


#include

#include "shumaguan.h"

 

void main()

{

    

    while(1)

    {

        shumaguan(1,0);

        shumaguan(2,1);

        shumaguan(3,2);

        shumaguan(4,3);

        shumaguan(5,4);

        shumaguan(6,5);

        shumaguan(7,6);

        shumaguan(8,7);

    }

}


按键:

        两端距离长的表示默认是导通状态,距离短的默认是断开状态。如果按键按下,初始导通状态变为断开,初始断开状态变为导通。通常的按键都是机械弹性开关,由于弹性作用,在闭合时不会马上稳定的接通,在断开时也不会马上断开,一般会抖动5-10ms。所以为了消抖,一般由软件消抖20ms。IO口既可以输出也可以输入,当按键按下时IO口电平会被接地,所以我们只需要检测按键什么时候被拉低就可以。

1.独立按键:按下按键对应LED亮灭


按键函数


#include

#include "DELAY.h"

 

unsigned char anjian()

{

    unsigned char jianwei=0;

    if(P3_1==0){delay(20);while(P3_1==0);delay(20);jianwei=1;}//检测按键是否为0,消抖,检测是否松手,消抖

    if(P3_0==0){delay(20);while(P3_0==0);delay(20);jianwei=2;}

    if(P3_2==0){delay(20);while(P3_2==0);delay(20);jianwei=3;}

    if(P3_3==0){delay(20);while(P3_3==0);delay(20);jianwei=4;}

    return jianwei;

}


主函数


#include

#include "anjian.h"

 

void main()

{

    unsigned char i;

    while(1)

    {

        i=anjian();

        if(i==1){P2_0=~P2_0;}//如果第一个按下,第一个灯状态取反

        if(i==2){P2_1=~P2_1;}

        if(i==3){P2_2=~P2_2;}

        if(i==4){P2_3=~P2_3;}

    }

}


矩阵按键:

        每一个独立按键都需要借一个IO口,但是矩阵按键会大大减少IO资源的使用。开发板上将 16 个按 键排成 4 行 4 列,第一行将每个按键的一端连接在一起构成行线,第一列将每 个按键的另一端连接在一起构成列线,这样便一共有 4 行 4 列共 8 根线,我们将 这 8 根线连接到单片机的 8 个 I/O 口上,通过程序扫描键盘就可检测 16 个 键。用这种方法我们也可实现 3 行 3 列 9 个键、 5 行 5 列 25 个键、 6 行 6 列 36 个键甚至更多。跟独立按键相同,我们只需要检测按键什么时候被拉低就可以。本次我们采用行扫描的方法使用矩阵按键,并且不要忘记消抖。

1.矩阵按键:按下的每个按键,数码管显示对应键码

矩阵函数


#include

#include "DELAY.h"

 

unsigned char juzhen()//行扫描

{

    unsigned char juzhenNum;

    P1=0x7f;

    if(P1_3==0){delay(20);while(P1_3==0);delay(20);juzhenNum=1;}

    if(P1_2==0){delay(20);while(P1_2==0);delay(20);juzhenNum=2;}

    if(P1_1==0){delay(20);while(P1_1==0);delay(20);juzhenNum=3;}

    if(P1_0==0){delay(20);while(P1_0==0);delay(20);juzhenNum=4;}

    P1=0xbf;

    if(P1_3==0){delay(20);while(P1_3==0);delay(20);juzhenNum=5;}

    if(P1_2==0){delay(20);while(P1_2==0);delay(20);juzhenNum=6;}

    if(P1_1==0){delay(20);while(P1_1==0);delay(20);juzhenNum=7;}

    if(P1_0==0){delay(20);while(P1_0==0);delay(20);juzhenNum=8;}

    P1=0xdf;

    if(P1_3==0){delay(20);while(P1_3==0);delay(20);juzhenNum=9;}

    if(P1_2==0){delay(20);while(P1_2==0);delay(20);juzhenNum=10;}

    if(P1_1==0){delay(20);while(P1_1==0);delay(20);juzhenNum=11;}

    if(P1_0==0){delay(20);while(P1_0==0);delay(20);juzhenNum=12;}

    P1=0xef;

    if(P1_3==0){delay(20);while(P1_3==0);delay(20);juzhenNum=13;}

    if(P1_2==0){delay(20);while(P1_2==0);delay(20);juzhenNum=14;}

    if(P1_1==0){delay(20);while(P1_1==0);delay(20);juzhenNum=15;}

    if(P1_0==0){delay(20);while(P1_0==0);delay(20);juzhenNum=16;}

    return juzhenNum;

}

主函数


#include

#include "shumaguan.h"

#include "juzhen.h"

 

void main()

{

    unsigned char i=0;

    while(1)

    {

        i=juzhen();

        shumaguan(1,i);

    }

}

关键字:51单片机  数码管  按键  矩阵按键 引用地址:51单片机——数码管、按键、矩阵按键C语言入门编程

上一篇:51单片机——74HC595、LED点阵、直流电动机C语言入门编程
下一篇:51单片机——LED发光二极管、蜂鸣器C语言入门编程

推荐阅读最新更新时间:2024-11-13 09:43

STM32 软件按键消抖
引言 通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的抖动,如图1所示。 图1 分析 按键稳定闭合时间长短是由操作人员决定的,通常都会在 100ms 以上,刻意快速按的话能达到 40-50ms 左右,很难再低了。抖动时间是由按键的机械特性决定的,一般都会在 10ms以内,为了确保程序对按键的一次闭合或者一次断开只响应一次,必须进行按键的消抖处理。 方法一 在绝大多数情况下,我们是用软件即程序来实现消抖的。最简单的消抖原理,就是当检测到按键状态变化后,先等待一个 10m
[单片机]
STM32 软件<font color='red'>按键</font>消抖
单片机如何使用?51单片机C语言编程实例有哪些?
单片机如何使用,我们要知道单片机在哪里使用? 单片机是很多电子产品的核心器件,它具有一定的逻辑判断和事件处理能力的芯片。 可以对单片机编程不同的程序,从而实现不同的功能。 一、如何使用单片机? 首先我们需要掌握单片机的 编程语言 ,目前大多数的单片机 都支持C语言编程 ,个别低端单片机还需要汇编语言。 所以单片机开发,我们C语言编程基础就可以满足90%的需求了,对于汇编语言,我们可以针对性的,在使用的时候,突击学习掌握就OK了。 对于入门阶段的学生, 单片机的C语言知识需要学习到什么程度? 学习一些基础的语法就可以满足我们实现一些功能比较简单的程序开发了,例如流水灯,交通路灯等。 高级语法不需要刻意去学习,在初级学习没有意义
[单片机]
51单片机—单片机扩展外部RAM—6264—08
今天这个是是以前做过的,没做成,扩展ROM的时候失败了~~ 不过今天主要的就是扩展外部的RAM,这个相对比较简单点,不想外部的ROM还要设置太多的编译器~~ 单片机扩展外部RAM 一、扩展总线 1、简介(这种扩展是基于总线扩展的,所以,P0、P2口就已经不可以再做它用了) 1)数据总线宽度为8位,由P0口提供; 2)地址总线宽度为16位,可寻址范围2的16次,也就是64K。低8位A7~A0由P0口经地址锁存器提供,高8位A15~A8由P2口提供。由于P0口是数据、地址分时复用,所以P0口输出的低8位必须用地址锁存器进行锁存; 3)控制总线由RD、WR、PSEN、ALE和EA等信号组成,用于读/写控制、片外RAM选通、地址锁存控制和片
[单片机]
<font color='red'>51单片机</font>—单片机扩展外部RAM—6264—08
51单片机串口通讯UART
1、串行通信的的基本知识 在实际的工业生产,或者生活中,计算机的CPU要与外部的设备之间进行信息的交流,数据的交换,所有的这些信息交换均可称为通信。 通信的方式有两种,分别为串行通信和并行通信。我们通常根据实际信息传输的距离还决定采用哪种通信方式。 并行通信: 并行通信是指数据的各位同时进行传送(发送或者接收)的通信方式。其优点是传送速度快,缺点是数据有多少位,就需要有多少根传送线。 串行通信: 串行通信是指数据 一位一位的按顺序传送的通信,他的优点是传送线少(只需要一对传输线),特别适用于远距离的数据通信,缺点是传送速度低。 其通信的原理如下图所示 串行通信的数据传输方式: 分为3
[单片机]
<font color='red'>51单片机</font>串口通讯UART
51单片机STC89C52点亮一个LED(IO口的位操作)
程序源码 /*-----------------------包含头文件区域-------------------------*/ #include reg52.h //单片机头文件 /*-----------------------端口/引脚定义区域----------------------*/ sbit LED=P2^0; //位定义P2.0引脚名为LED /*-----------------------主函数区域-----------------------------*/ void main() { LED=0; //LED端口输出低电平,即点亮LED, while(1); //死循
[单片机]
<font color='red'>51单片机</font>STC89C52点亮一个LED(IO口的位操作)
51单片机玩转物联网基础篇05-控制继电器
前言 本节我们开始学习如何使用51单片机控制继电器,有了继电器,我们可以使用单片机输出的低电平控制高电平期间工作,比如继电器接到220V用电器上,可通过单片机智能控制用电器。 一、基础知识 1.继电器简介 继电器是具有隔离功能的自动开关元件,实际上是用小电流去控制大电流运作的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用,广泛应用于遥控、遥测、通讯、自动控制、机电一体化及电力电子设备中,是最重要的控制元件之一,继电器可以分为很多种,本实验使用光耦隔离继电器,实物图如下: 2.继电器控制原理 继电器原理图如下所示: 从上图可知,给继电器模块供电后,红色LED灯就会被点亮,当给IO引脚输入底电平后,单片
[单片机]
<font color='red'>51单片机</font>玩转物联网基础篇05-控制继电器
再造STM32---第十部分:GPIO输入—按键检测
本章参考资料:《STM32F4xx 参考手册》、库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。 按键检测使用到 GPIO 外设的基本输入功能,本章中不再赘述 GPIO 外设的概念,如您忘记了,可重读前面“GPIO 框图剖析”小节, STM32 标准库中 GPIO 初始化结构体GPIO_TypeDef 的定义与“定义引脚模式的枚举类型”小节中讲解的相同。 10.1 硬件设计: 按键机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳定接通或一下子断开,使用按键时会产生图 10-1 中的带波纹信号,需要用软件消抖处理滤波,不方便输入检测。本实验板连接的按键带硬件消
[单片机]
再造STM32---第十部分:GPIO输入—<font color='red'>按键</font>检测
MCS-51单片机汇编语言:数据传送指令有哪些
数据传送指令是MCS-51单片机汇编语言程序设计中使用最频繁的指令,包括内部 RAM、寄存器、外部RAM以及程序存储器之间的数据传送。 数据传送操作是指把数据从源地址传送到目的地址,源地址内容不变。 1. 以累加器A为目的操作数的指令 MOV A, #data ; A← #data MOV A, Rn ; n=0~7, A← (Rn) MOV A, @Ri ; i=0,1 , A← ((Ri)) MOV A, direct ; A← (Rn) direct为内部RAM或SFR地址 2. 以Rn为目的操作数的指令 MOV Rn, A ;Rn ← (A) , n=0~7
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved