单片机
返回首页

用51单片机矩阵键盘控制数码管显示数字

2022-07-26 来源:csdn

#include//头文件

#define keys P1//宏定义矩阵键盘

#define smg P0//宏定义数码管

sbit SMGA=P2^2;//位定义

sbit SMGB=P2^3;

sbit SMGC=P2^4;

unsigned int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f

                     ,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴数码管字形码

unsigned int k;

void delay()//延时函数

{

    unsigned char a,b;

for(a=0;a<200;a++)

for(b=0;b<200;b++);

}

void jzjp()//矩阵键盘函数

{

unsigned int i=0;

//unsigned int k; 本人遇到的错误,在该函数下定义的k,导致主函数中用k时出现错误,应在整体下定义

keys=0x0f;//行列扫描,高四位输出低电平,低四位输出高电平

if(keys!=0x0f)//如果keys不等于该值则说明有按键按下

{

delay();//按键消抖

if(keys!=0x0f)//确实按下按键,第四位不全为1

{

switch(keys)//列判断

{

case(0x07):k=0;break;//对应列按键按下时矩阵键盘对应的数,并存储于k

case(0x0b):k=1;break;

case(0x0d):k=2;break;

case(0x0e):k=3;break;

}

keys=0xf0;

switch(keys)//行判断

{

case(0x70):k=k;break;//对应行按键按下时矩阵键盘对应的数,并存储于k

case(0xb0):k=k+4;break;

case(0xd0):k=k+8;break;

case(0xe0):k=k+12;break;

}

//扫描过程,如果case(0x07)时第一列按键按下,k=0,break跳出switch,

//行判断,case(0x70)时第一行按键按下,k=k,跳出switch

// 如果case(0x0b)时第二列按键按下,k=1,break跳出switch,

//行判断,case(0xb0)时第二行按键按下,k=k+4(第一个按键向后数4个)跳出switch。。

             while((i<50)&&(keys!=0xf0))//按键总是按着不松开超过一定时间时强制退出,从新扫描显示你所按着不动的按键

{

  delay();

i++;

}

}


}

}

void main()//主函数

{

while(1)

{

SMGA=0;//Y0非输出端对应的数码管显示

SMGB=0;

SMGC=0;

jzjp();

smg=table[k];//数码管显示

}

}


注:


该开发板矩阵键盘接于P1口

该程序时用矩阵键盘控制的最后一个动态数码管,3-8译码器的输入端接于P2口的2,3,4端,P0口接数码管驱动端。

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章