//方法1-推荐
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP = P3^7;     //蜂鸣器//定义数码管0到F
uchar code DSY_CODE[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00
};uchar Pre_KeyNO = 16,KeyNO = 16;       //1 0000  为了后面的扫描按键void DelayMS(uint ms)
{uchar t;while(ms--){for(t=0;t<120;t++);}
}//检查是那个按键被按下
void Keys_Scan()
{uchar Tmp;P1 = 0x0f;DelayMS(1);Tmp = P1 ^ 0x0f;              //switch(Tmp)                  //列{case 1: KeyNO = 0; break;case 2: KeyNO = 1; break;case 4: KeyNO = 2; break;case 8: KeyNO = 3; break;default: KeyNO = 16;}P1 = 0xf0;DelayMS(1);Tmp = P1  ^ 0xf0;
//  Tmp = P1 >> 4 ^ 0x0f;switch(Tmp)                    //行{case 1: KeyNO += 0; break;case 2: KeyNO += 4; break;case 4: KeyNO += 8; break;case 8: KeyNO += 12;}
}//蜂鸣器函数
void Beep()
{uchar i;for(i=0;i<100;i++){DelayMS(1);BEEP = ~BEEP;}BEEP = 1;
}void main()
{P0 = 0x00;     //给数码管引脚初始化,数码管全灭while(1){P1 = 0xf0;       //给P1初始化,但按键有一个被按下,P1  !=  0xf0if(P1 != 0xf0)Keys_Scan();if(Pre_KeyNO != KeyNO)    //当KeyNO不等于16时,有按键被按下,进行数码管点亮{P0 = ~DSY_CODE[KeyNO];  //数码管是共阴极的Beep();Pre_KeyNO = KeyNO;}DelayMS(100);}
}
方法2
#include <reg52.h>#define LED_PORT P0//定义数码管接口
#define KEY_PORT P1//定义键盘接口
sbit BEE=P3^0;//定义蜂鸣器接口char rowValue;//按键所在的行值   从0开始
char columnValue;//按键所在的列值  从0开始/***********************
**按键键值所对应的编码**
**   0  1  2  3       **
**   4  5  6  7       **
**   8  9  A  B       **
**   C  D  E  F       **
***********************/
char keyCode[][4]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*******************************************************
函数名:ledDsplay()
功能:根据按键的“行值”和“列值”,把按键的值显示到数码管,当“行值”和“列值”为“-1”时,数码管灭灯
输入参数:row:按键的“行值column:按键的“列值”
输出参数: 无
返回值:无
*******************************************************/
void ledDsplay(char row,char column)
{if((-1==row) && (-1==column))LED_PORT = 0;//来数码管elseLED_PORT = keyCode[row][column];//显示键值
}void delay(unsigned int d)
{while(--d);
}#define BEE_ON BEE=1    //宏定义 蜂鸣器开
#define BEE_OFF BEE=0   //宏定义 蜂鸣器关/*******************************************************
函数名:findColumn()
功能:根据按键接口所读入的值,判断按键的列值
输入参数:value:从按键接口读入的值
输出参数: 无
返回值:-1:没有任何列被按下    其它:按键的列值
*******************************************************/
char findColumn(char value)
{char i;value=value>>4;for(i=0;i<4;i++){if(0==((value>>i)&0x01))return i;}return -1;
}/*******************************************************
函数名:scanKey()
功能:扫描键盘,如果键盘有按键按下,则把按键的行值和列值保存在全局变量rowValue和columnValue
输入参数:无
输出参数: 当返回值为0时,输出参数为全局变量rowValue和columnValue
返回值:0有按键按下  -1没有按键按下
*******************************************************/
char scanKey()
{char scanRow;for(scanRow=0;scanRow<4;scanRow++){KEY_PORT = ~(1<<scanRow);//扫描第0行if((KEY_PORT&0xf0) != 0xf0){delay(1250);//延时去抖if((KEY_PORT&0xf0) != 0xf0)//真的有按下{BEE_ON;columnValue=KEY_PORT&0xf0;while(1){if((KEY_PORT&0xf0) == 0xf0)//按键凝似台起{delay(1250);if((KEY_PORT&0xf0) == 0xf0)//按键确定台起{BEE_OFF;if(-1!=findColumn(columnValue)){rowValue= scanRow;columnValue=findColumn(columnValue);return 0;}}}}}}}return -1;}void main()
{BEE_OFF;ledDsplay(-1,-1);//初始化,数码管灭while(1){if(0==scanKey())//如果有按键被按下ledDsplay(rowValue,columnValue);}
}

用定时器0的中断,进行键盘扫描,判断键位

//实例78:矩阵式键盘按键音
#include<reg52.h>   //包含51单片机寄存器定义的头文件
sbit Beep=P3^0;    //将sound位定义为P3.0unsigned char Pre_KeyNO = 16,KeyNO = 16;     //1 0000  为了后面的扫描按键
//定义数码管0到F
unsigned char code DSY_CODE[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00
};
/**************************************************************
函数功能:蜂鸣器发声延时约120ms
**************************************************************/void delay_sound(void)
{unsigned char i;for(i=0;i<250;i++);}
/**************************************************************
函数功能:软件延时子程序约20ms
**************************************************************/void delay20ms(void)
{unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<60;j++);}void Beep2(void)
{unsigned char i;for(i=0;i<200;i++)  //让P3.7引脚电平不断取反输出音频{Beep=0;delay_sound();Beep=1;delay_sound();}
}
/**************************************************************
函数功能:主函数
**************************************************************/ void main(void){EA=1;                  //开总中断ET0=1;                 //定时器T0中断允许       TMOD=0x01;             //使用定时器T0的模式1TH0=(65536-500)/256;   //定时器T0的高8位赋初值TL0=(65536-500)%256;   //定时器T0的高8位赋初值 TR0=1;                 //启动定时器T0        while(1)               //无限循环,等待键盘按下;}
/**************************************************************
函数功能:定时器0的中断服务子程序,进行键盘扫描,判断键位
**************************************************************/ void time0_interserve(void) interrupt 1 using 1    //定时器T0的中断编号为1,使用第一组寄存器{unsigned char i;unsigned char Tmp;TR0=0;                   //关闭定时器T0P1=0xf0;                 //所有行线置为低电平“0”,所有列线置为高电平“1”if((P1&0xf0)!=0xf0)      //列线中有一位为低电平“0”,说明有键按下delay20ms();           //延时一段时间、软件消抖if((P1&0xf0)!=0xf0)      //确实有键按下{Tmp = P1 ^ 0x0f;switch(Tmp)                  //列{case 1: KeyNO = 0; break;case 2: KeyNO = 1; break;case 4: KeyNO = 2; break;case 8: KeyNO = 3; break;default: KeyNO = 16;}P1 = 0xf0;delay20ms();  Tmp = P1  ^ 0xf0;
//      Tmp = P1 >> 4 ^ 0x0f;switch(Tmp)                    //行{case 1: KeyNO += 0; break;case 2: KeyNO += 4; break;case 4: KeyNO += 8; break;case 8: KeyNO += 12;}              if(Pre_KeyNO != KeyNO)    //当KeyNO不等于16时,有按键被按下,进行数码管点亮{P0 = ~DSY_CODE[KeyNO];   //数码管是共阴极的Beep2();Pre_KeyNO = KeyNO;}}TR0=1;                    //关定时器T0TH0=(65536-500)/256;      //定时器T0的高8位赋初值TL0=(65536-500)%256;      //定时器T0的高8位赋初值        }

代码与仿真文件   https://download.csdn.net/download/m0_48459378/23977439

数码管显示4×4键盘矩阵按键相关推荐

  1. c语言键盘控制数码管显示,3*4矩阵键盘控制4位数码管显示的C程序

    这个很简单 ;******************************************************************************** ;*  标题:  伟纳电 ...

  2. 【Proteus仿真】数码管+4x4键盘矩阵按键简易计算器

    [Proteus仿真]数码管+4x4键盘矩阵按键简易计算器 Proteus仿真 仿真器件 74HC573数据缓冲器 8位共阴数码管 主程序代码 /*-------------------------- ...

  3. 计算机键盘是编码键盘还是非编码键盘,矩阵按键原理图_矩阵按键扫描实例

    键盘分编码键盘和非编码键盘.键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘.而靠软件编程来识别的称为非编码键盘. 在一般嵌入式应用中,用的最多的是非编码键盘 ...

  4. Android 显示系统键盘搜索按键,实现搜索功能

    系统键盘的搜索按钮,默认情况下是被隐藏的,如果要使用必须要手动设置,才可以调用搜索按键功能. 具体使用,只需要如下三个步骤: 1:在布局文件中的EditText中添加如下两个属性 android:im ...

  5. 【51单片机】矩阵按键实现数码管显示

    目录 前言 数码管 共阴极数码管 共阳极数码管 共阴极数码管表 数码管硬件设计 数码管显示软件设计 矩阵按键 按键介绍 按键消抖 矩阵按键硬件设计 矩阵按键实现数码管显示软件设计 总结 前言 闲的没事 ...

  6. 8255数码管显示0到9_汇编语言--键盘扫描及显示实验(含代码解释)

    实验题目 将8255单元与键盘及数码管显示单元连接,编写实验程序,扫描键盘输入,并将扫描结果送数码管显示.键盘采用4X4键盘,每个数码管显示值可为0-F共16个数. 实验具体内容如下:将键盘进行编号, ...

  7. STM32F407控制TM1638按键数码管显示模块

    TM1638按键数码管显示模块 实物图 原理图 tm1638.c文件 #include "tm1638.h" #include "delay.h" // // ...

  8. 51单片机c语言按键扫描程序,单片机按键扫描数码管显示C语言程序

    电子科学与技术 单片机按键扫描数码管显示C语言程序 按键扫描数码管显示程序共定义了6个键的功能:K1.K2.K3.K4以及K5.K8组成的一对复合键,其中K2,K3为连击键,K5为上档键.在正常工作模 ...

  9. 单片机_CT107D训练平台电路原理图\蓝桥杯训练板\输入输出模块\矩阵按键\蜂鸣器电路\继电器电路\LM386功率放大电路,驱动扬声器

    输入/输出模块 配置 4×4 键盘矩阵,其中四个按键可通过跳线配置为独立按键: 配置继电器.蜂鸣器: 配置功率放大电路,驱动扬声器. 1>4×4 键盘矩阵原理图如下: 图片中的按键电路可以切换成 ...

最新文章

  1. 实时实例分割的Deep Snake:CVPR2020论文点评
  2. 软件外包项目管理的经验感悟
  3. 添加Page_Init事件
  4. pytorch CrossEntropyLoss用法
  5. MySQL——Access|SQL Server示例数据库Northwind导入到MySQL 8.0时出错解决方案
  6. npm 更改默认全局路径以及国内镜像
  7. 【单调栈】向右看齐(luogu 2947)
  8. Spring Boot文档阅读笔记-对Messaging with RabbitMQ解析
  9. Java 8都出那么久了,Stream API了解下?
  10. python新手入门代码-[代码全屏查看]-新手初学Python实现某论坛自动签到功能
  11. Android 谷歌巨头,国际巨头强势助攻,谷歌新系统开始提速,华为的对手不止一个...
  12. VS2017逐步配置OpenCV教程
  13. ip地址详解(深入网络层分析)
  14. 第1关:MapReduce综合应用案例 — 电信数据清洗
  15. 我的美国CS面试经验分享
  16. 【PC工具】可能是最好用的下载工具:IDM特点及功能汇总,IDM破解版下载,PC好用的迅雷下载版本合集...
  17. 达梦DW+DSC环境mal压缩测试
  18. 教你如何用腾讯云服务器备案
  19. 监控dns流量有哪些方法?
  20. 好片推荐---《WALL·E》(又名《机器人瓦力》

热门文章

  1. html大学生网站开发实践作业大全_化妆品口红网站html+css+js
  2. ARCGIS9.3安装说明
  3. python文件读写 npy
  4. FTP服务器搭建及自动下载文件脚本
  5. 查看本地IP到目的IP地址经由的路由器IP地址
  6. linux arm printf 函数与串口,11、串口实现printf()函数--s3c440
  7. Python基础(输出五行五角星,数量每行递增/输出九九乘法表)
  8. 创业有什么好的项目吗?
  9. matlab profile,[转载]matlab profile的使用【原创】
  10. 【人工智能】目前业界可以下载到的一些大语言模型