Proteus仿真:简易独立式键盘

实现目标

使用中断,当一个按键按下时,显示第几个按键被按下。

Proteus仿真图

在这里插入图片描述

C51代码(中断)

#include <REG52.H>      /* special function register declarations */
#include <intrins.h>

#define byte unsigned char
#define uchar unsigned char
#define word unsigned int
#define uint unsigned int
#define ulong unsigned long
#define BYTE 	unsigned char
#define WORD 	unsigned int

#define TRUE  1
#define FALSE 0
void initUart(void);/*初始化串口波特率,使用定时器2*/
#define KEY_PORT  P1 /*按键接在P1口*/
uchar key_Value;  	 /*存放键值*/
bit   int0_flag; 	 /*中断标记*/

/******** main 函数 *********/
void main (void) {	
	initUart(); /* 初始化串口 */
	int0_flag=0;/*设置中断0标记*/
	TCON=0x55;  /* 电平触发外部中断 */
	IE=0x81;    /*打开外中断int0*/
	do {
    	if (int0_flag) { /*如果有中断*/
        	switch (key_Value){ /*根据中断源分支*/
	     		case 1:
					printf ("key-press0 is pressed\n");
					/* 可在此处插入按键0处理程序 */
				break;
	     		case 2:
					printf ("key-press1 is pressed\n");
					/* 可在此处插入按键1处理程序 */
				break;
	     		case 4:
					printf ("key-press2 is pressed\n");
					/* 可在此处插入按键2处理程序 */
				break;
			    default:break;
			}
			int0_flag=0;	/*清中断0标记*/			 
		 }
    }while(TRUE);
}

/***********  外中断0服务程序***************/
void exint0(void) interrupt 0
{
	EA=0;/* 关总中断 */
    int0_flag=1; /*设置中断0标记*/
	/*读取外部中断源输入,并屏蔽高5位*/
    key_Value= ~KEY_PORT & 0x07;
	EA=1;/* 开总中断 */
}

/********** 初始化串口波特率 ************/
void initUart(void)/*初始化串口波特率,使用定时器2*/
{
/* Setup the serial port for 9600 baud at 11.0592MHz */
	SCON = 0x50;  //串口工作在方式1
	RCAP2H=(65536-(3456/96))>>8;
	RCAP2L=(65536-(3456/96))%256;
  	T2CON=0x34;
    TI  = 1;     /* 置位TI*/
}

笔记

思路(个人理解):没有一个按下时,三个按钮对应线路呈现高电平,只要任何一个按键被按下,便会产生一个低电平,触发INT0中断,然后读取P1口中的P1.0、P1.1、P1.2【key_Value= ~KEY_PORT & 0x07】,根据key_Value确定具体是哪一个按钮被按下,完成相应的操作

本文Proteus仿真图及源程序获取见:
在这里插入图片描述

运行结果

在这里插入图片描述

说明

参考课本:单片机原理与嵌入式系统设计

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海轰Pro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值