单片机c51中断 — 中断扫描法行列式键盘

这篇具有很好参考价值的文章主要介绍了单片机c51中断 — 中断扫描法行列式键盘。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目文件

文件

关于项目的内容知识点可以见专栏单片机原理及应用 的第五章,中断

 


在第4章中已介绍过行列式键盘的工作原理,并编写了相应的键盘扫描程序。但应注意的是,在单片机应用系统中,键盘扫描只是 CPU 工作的内容之一。CPU 在忙于各项工作任务时,需要兼顾键盘扫描,既保证不失时机地响应键操作,又不过多地占用CPU 时间。因此,可以采用中断扫描方式来提高CPU的效率,即只有在键盘有键按下时,才执行键盘扫描程序如果无键按下,则将键盘视为不存在。

首先改写硬件:

单片机c51中断 — 中断扫描法行列式键盘当各列电平都为0时,无论压下哪个按键,对应的行线和列线会产生逻辑与运算的结果,与门的输出端都可形成INTO的中断请求信号。这样便可将按键的扫描查询工作放在中断函数中进行,从而就能达到既快速响应按键动作,又提高CPU工作效率的目的。

当按键被按下时,按键所在的行线和列线之间就会产生一个电压差,从而触发行列式键盘电路中的4与门集成元件进行逻辑与运算。具体来说,按键所在的行线会被拉低至地电位,而按键所在的列线则会被拉高至高电位。这样,行线和列线之间就会产生一个电压差,从而触发4与门集成元件的输出端输出一个低电平信号,即INTO引脚的中断请求信号。处理器通过检测INTO引脚的电平变化来判断是否有按键被按下,如果有按键被按下,处理器就会进入中断函数进行按键扫描查询工作,从而快速响应按键动作。

 

解释一下:U3的4个输入端与行线像并联 (20-23)行线初始为1,输入端为1
设置列电平刚开始为0,如果有按键按下其中一个行线变为0
那么与U3进行与传给INT0非,1*0=0
脉冲触发
然后为1变为0,负跳变脉冲,可以中断IE0=1

单片机c51中断 — 中断扫描法行列式键盘


  • 主函数:
void main(void) {
   P0 = 0x00; 			 //开机黑屏
   IT0=1;				 //脉冲触发
   EX0=1;				 //INT0允许
   EA=1;				 //总中断允许
   P2 = 0x0f;			 //为首次中断做准备,列线全为0,行线全为1
   while(1);			 //模拟其他程序功能
}

这里P2=0x0f
P2是跟按键连接起来的
这样0x0f=0000 1111
高4位为0;
27-24是列线为0,行线全为1

  • 再写中断函数:
void getKey () interrupt 0{						   //中断函数
	char key_scan[] = {0xef, 0xdf, 0xbf, 0x7f};	   //键扫描码
	char i = 0, j = 0;
	for (i = 0; i < 4 ; i++) {
		P2= key_scan[i];  			//输出扫描码 
		for (j = 0 ; j < 16 ;j++) {
			if (key_buf[j]== P2){ //读键值,并判断键号
			   P0= led_mod[j];		//显示闭合键键号
			   break;
			}}}
	P2=0x0f;			 //为下次中断做准备
}

前面的都是行列式键盘的通用
需要注意的是
这里不需要判断行电压是否变换

if ((P2 & 0x0f) != 0x0f) 

是因为:
一旦行线变化就是按键按下,中断就会发生,不需要判断,加上也行

注意最后结束后

P2=0x0f;			 //为下次中断做准备

这里P2=0x0f
P2是跟按键连接起来的
这样0x0f=0000 1111
高4位为0;
27-24是列线为0,行线全为1

 

  • 总代码:
#include <reg51.h>
char led_mod[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,	  //led字模
				  0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71};	  
char key_buf[] = {0xee, 0xde, 0xbe, 0x7e,0xed, 0xdd, 0xbd, 0x7d,//键值
				  0xeb, 0xdb, 0xbb, 0x7b,0xe7, 0xd7, 0xb7, 0x77};

void getKey () interrupt 0{						   //中断函数
	char key_scan[] = {0xef, 0xdf, 0xbf, 0x7f};	   //键扫描码
	char i = 0, j = 0;
	for (i = 0; i < 4 ; i++) {
		P2= key_scan[i];  			//输出扫描码 
		for (j = 0 ; j < 16 ;j++) {
			if (key_buf[j]== P2){ //读键值,并判断键号
			   P0= led_mod[j];		//显示闭合键键号
			   break;
			}
		}
	}
	P2=0x0f;			 //为下次中断做准备
}
 
void main(void) {
   P0 = 0x00; 			 //开机黑屏
   IT0=1;				 //脉冲触发
   EX0=1;				 //INT0允许
   EA=1;				 //总中断允许
   P2 = 0x0f;			 //为首次中断做准备,列线全为0,行线全为1
   while(1);			 //模拟其他程序功能
}

结果:
单片机c51中断 — 中断扫描法行列式键盘

运行视频:

单片机c51中断 — 中断扫描法行列式键盘文章来源地址https://www.toymoban.com/news/detail-497593.html

到了这里,关于单片机c51中断 — 中断扫描法行列式键盘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AT89C51单片机实现单片机串口互动(中断方式,单片机--单片机,应答)

     说一下功能:客户机发送0x01到服务机 2服务单片机应答0xf2到客户机 3客户机接收到0xf2,发送信息153432这6个数字到服务机 4client发送完信息后发送0xaa结束通信 5server接收到0xaa后回复0xaa结束通信,从此老死不相往来 看代码: 服务端代码:    

    2024年02月13日
    浏览(53)
  • c51单片机串口通信(中断方式接收数据)(单片机--单片机通信)示例代码 附proteus图

         单片机一般采用中断方式接受数据,这样便于及时处理 其中发送数据段采用的是查询方式,接收端采用了中断方式, 要注意的地方有: 在中断处理函数int_0()内,处理数据前要先关闭中断,否则中断可能会不断传过来, EA=0; 然后退出中断处理函数前恢复中断处理能力:

    2024年02月13日
    浏览(60)
  • C51单片机中断系统与定时器/计时器(理论部分)

    前言 文章的开始,有人可能会问,我们在前几节课学了延时函数,为什么不用延时函数来取代定时器,而必须学定时器呢?这里,有如下几个理由: 1.使用delay函数时,单片机的cpu做不了其他事情,只能等待延时结束。 2.用了定时器cpu就可以做其他的事情,只要定时器溢出时

    2023年04月15日
    浏览(39)
  • 题解:按钮加减计数器设计(单片机C51)(外部中断)

               需求 :使用 4位共阴极段码表及共阳极数码管 ,通过 外部中断 方式,实现 两个按钮 分配加1、减1功能 。         今天我就来 讲解 一下 这道题 : 目录 1.代码 1.1定义头文件 1.2定义延时函数(毫秒) 1.3定义主函数 1.4定义0~15共阴极数码管字符码 1.5定义中断

    2024年02月02日
    浏览(55)
  • 初识C51单片机(详解)

    前言: 单片机是一种我们常见的开发板,我们经常会在一些项目中使用到它。而今天我们要介绍的是C51单片机,下面来介绍一下今天的”主角“:STC89C52RC40I-LQFP44单片机(后面将用到它做一些项目)。 1.了解命名规则一张图搞定: 2.学会看单片机电路原理图 只是一些初中的电

    2024年02月10日
    浏览(58)
  • c51单片机(预备知识)

            单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备(小键盘、LED显示器)。 0)  无源晶振:12MHZ 1) 振荡周期 :也称时钟周期,是指为单片机提供

    2024年02月08日
    浏览(94)
  • 单片机C51数据类型

    C51数据类型 C语言的基本数据类型:char、int、short、long、float、double。 1、 Keil C51 编译器支持的数据类型。    对于Keil C51编译器,short型与int型相同,double型与float型相同。 Keil C51支持的数据类型表 数据类型 长度 值域 unsigned char 单字节 0~255 signed char 单字节 -128~+127 unsigned

    2024年02月08日
    浏览(68)
  • C51单片机实现呼吸灯

         呼吸灯的效果是灯的亮度由暗缓慢变亮再缓慢变暗。      实现思路是改变小灯亮与暗在单位周期的占空比。如下图 具体代码如下:

    2024年02月11日
    浏览(48)
  • 【C51】10-基础51单片机的小车项目(51完结)

    10.1小车的安装 10.2电机模块的开发(L9110S) 接通 VCC , GND 模块电源指示灯亮, 以下资料来源官方,但是不对,根据下节课实际调试 IA1 输入高电平, IA1 输入低电平,【 OA1 OB1 】电机正转; IA1 输入低电平, IA1 输入高电平,【 OA1 OB1 】电机反转; IA2 输入高电平, IA2 输入低

    2024年02月08日
    浏览(49)
  • 第二十二天 c51单片机

    136.语音识别切换小车循迹跟随避障且Oled显示状态

    2024年02月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包