数码管显示4×4键盘矩阵按键
//方法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键盘矩阵按键相关推荐
- c语言键盘控制数码管显示,3*4矩阵键盘控制4位数码管显示的C程序
这个很简单 ;******************************************************************************** ;* 标题: 伟纳电 ...
- 【Proteus仿真】数码管+4x4键盘矩阵按键简易计算器
[Proteus仿真]数码管+4x4键盘矩阵按键简易计算器 Proteus仿真 仿真器件 74HC573数据缓冲器 8位共阴数码管 主程序代码 /*-------------------------- ...
- 计算机键盘是编码键盘还是非编码键盘,矩阵按键原理图_矩阵按键扫描实例
键盘分编码键盘和非编码键盘.键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘.而靠软件编程来识别的称为非编码键盘. 在一般嵌入式应用中,用的最多的是非编码键盘 ...
- Android 显示系统键盘搜索按键,实现搜索功能
系统键盘的搜索按钮,默认情况下是被隐藏的,如果要使用必须要手动设置,才可以调用搜索按键功能. 具体使用,只需要如下三个步骤: 1:在布局文件中的EditText中添加如下两个属性 android:im ...
- 【51单片机】矩阵按键实现数码管显示
目录 前言 数码管 共阴极数码管 共阳极数码管 共阴极数码管表 数码管硬件设计 数码管显示软件设计 矩阵按键 按键介绍 按键消抖 矩阵按键硬件设计 矩阵按键实现数码管显示软件设计 总结 前言 闲的没事 ...
- 8255数码管显示0到9_汇编语言--键盘扫描及显示实验(含代码解释)
实验题目 将8255单元与键盘及数码管显示单元连接,编写实验程序,扫描键盘输入,并将扫描结果送数码管显示.键盘采用4X4键盘,每个数码管显示值可为0-F共16个数. 实验具体内容如下:将键盘进行编号, ...
- STM32F407控制TM1638按键数码管显示模块
TM1638按键数码管显示模块 实物图 原理图 tm1638.c文件 #include "tm1638.h" #include "delay.h" // // ...
- 51单片机c语言按键扫描程序,单片机按键扫描数码管显示C语言程序
电子科学与技术 单片机按键扫描数码管显示C语言程序 按键扫描数码管显示程序共定义了6个键的功能:K1.K2.K3.K4以及K5.K8组成的一对复合键,其中K2,K3为连击键,K5为上档键.在正常工作模 ...
- 单片机_CT107D训练平台电路原理图\蓝桥杯训练板\输入输出模块\矩阵按键\蜂鸣器电路\继电器电路\LM386功率放大电路,驱动扬声器
输入/输出模块 配置 4×4 键盘矩阵,其中四个按键可通过跳线配置为独立按键: 配置继电器.蜂鸣器: 配置功率放大电路,驱动扬声器. 1>4×4 键盘矩阵原理图如下: 图片中的按键电路可以切换成 ...
最新文章
- 实时实例分割的Deep Snake:CVPR2020论文点评
- 软件外包项目管理的经验感悟
- 添加Page_Init事件
- pytorch CrossEntropyLoss用法
- MySQL——Access|SQL Server示例数据库Northwind导入到MySQL 8.0时出错解决方案
- npm 更改默认全局路径以及国内镜像
- 【单调栈】向右看齐(luogu 2947)
- Spring Boot文档阅读笔记-对Messaging with RabbitMQ解析
- Java 8都出那么久了,Stream API了解下?
- python新手入门代码-[代码全屏查看]-新手初学Python实现某论坛自动签到功能
- Android 谷歌巨头,国际巨头强势助攻,谷歌新系统开始提速,华为的对手不止一个...
- VS2017逐步配置OpenCV教程
- ip地址详解(深入网络层分析)
- 第1关:MapReduce综合应用案例 — 电信数据清洗
- 我的美国CS面试经验分享
- 【PC工具】可能是最好用的下载工具:IDM特点及功能汇总,IDM破解版下载,PC好用的迅雷下载版本合集...
- 达梦DW+DSC环境mal压缩测试
- 教你如何用腾讯云服务器备案
- 监控dns流量有哪些方法?
- 好片推荐---《WALL·E》(又名《机器人瓦力》
热门文章
- html大学生网站开发实践作业大全_化妆品口红网站html+css+js
- ARCGIS9.3安装说明
- python文件读写 npy
- FTP服务器搭建及自动下载文件脚本
- 查看本地IP到目的IP地址经由的路由器IP地址
- linux arm printf 函数与串口,11、串口实现printf()函数--s3c440
- Python基础(输出五行五角星,数量每行递增/输出九九乘法表)
- 创业有什么好的项目吗?
- matlab profile,[转载]matlab profile的使用【原创】
- 【人工智能】目前业界可以下载到的一些大语言模型