Proteus仿真-矩阵键盘(实验一)

最近,由于在学习51单片机,学会了用proteus进行仿真

Proteus仿真-矩阵键盘

由于一般的按键是单独接在一根I/O线上,构成所谓的独立式键盘。其特点是电路简单,易于编程,但占用的I/O口线比较多,当需要较多按键时可能产生I/O口资源紧张问题。为此,可以采用行列式键盘方案,具体做法是,将I/O口分为行线和列线,按键设置在跨接行线和列线的交点上,列线通过上拉电阻接正电源。
在这里插入图片描述

分为4x4行列式键盘,其中键盘从左到右,上到下分别标号1-16,有四位数码管,其中第一个,第二位共同显示键盘的标号,第三位和第四位分别显示所按按键的行列标号,如下
在这里插入图片描述

我们在上面的基础上,可以在增加一个蜂鸣器,按标号显示次数,如05,则蜂鸣器响5声。
在这里插入图片描述
电阻可以设置成1k,蜂鸣器电压可以设置成2V.

完整的图如下.
在这里插入图片描述

在keil 51中,对应的代码如下.

//由于本次实验内容较简单,未考虑代码优化和代码工程化.
#include <reg52.h>
char key_buf[4][4]={{0xee,0xde,0xbe,0x7e},{0xed,0xdd,0xbd,0x7d},{0xeb,0xdb,0xbb,0x7b},{0xe7,0xd7,0xb7,0x77}}; //  第一行的第一列....第四列...第二行....
char led_mod[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};	//1 2 3 4 5 6 7 8 9 0		 共阴数码管.
sbit wela1 = P3^0;		 //位选口
sbit wela2 = P3^1;
sbit wela3 = P3^2;
sbit wela4 = P3^3;
sbit beep = P1^0;	//蜂鸣器.
char ValueH=0,ValueL=0,ValueX=0,ValueY=0,M=0;
static int times = 0,Q=0;
void delay(int Z);	//延迟函数,可用定时器精确
void NoteNumber();	//记下按下的行,列数
void ShowNumber();	//显示数码
void Buzzer();
void main(){
	beep=1;
	while(1){
		NoteNumber();
	}
}
void Buzzer(){
	char flag = M;	//几次的标记
	int n=0,m=0	;
	while(flag){
		for(n=0;n<2;n++){
			beep=~beep;
			for(m=0;m<20;m++)
				ShowNumber();
		}
		flag = flag - 1;
	}
}
void delay(int Z){												                                                                               
	int i=0;
	while(Z--){
		for(i=0;i<113;i++);
	}
}
void NoteNumber(){
	char key_scan[4] = {0xfe,0xfd,0xfb,0xf7};  //0xfe,对应端口高到低.分别为第一行.....第四行
	int i=0,j=0,n=0,m=0;
	for(i=0;i<4;i++){
		P2 = key_scan[i];
		if((P2&0x0f)!=0x0f){
			//有按键按下,判断是哪个.
			delay(2);
			if ((P2&0x0f)!=0x0f) {	  //按键消抖
				for(j=0;j<4;j++){
					if (P2==key_buf[i][j]){
						//哪个,显示.
						M = i*4+j+1;	  //几个.
						//重新开始计时
						ValueH=M/10;
						ValueL=M%10;
						ValueX = i + 1;
						ValueY = j + 1;
						Buzzer();
					}
				}
			}
		}
	}
	ShowNumber();
}
void ShowNumber(){
	P0 = led_mod[ValueH];
	wela1=0;	 //打开位选
	delay(2);	 //延迟,否则可能不显示.
	wela1=1;   	//关闭位选
	P0 = led_mod[ValueL];
	wela2=0;
	delay(2);
	wela2=1;
	P0 = led_mod[ValueX];
	wela3=0;
	delay(2);
	wela3=1;
	P0 = led_mod[ValueY];
	wela4=0;
	delay(2);	//几行几列.
	wela4=1;	
} 

最后也有一些困惑,按照C语言的思路来理解keil C,似乎有些地方不同(不是指语法方面),例如变量问题,明明全局变量,在ShowNumber()中修改不行,而在NoteNumber()中修改又可以?

由于作者水平有限,总有些知识漏洞,希望大家批评指正。

  • 16
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Proteus仿真是一款功能强大的电子电路仿真软件,可用于帮助开发人员设计和验证电路设计的正确性和性能。在stm32时钟设计和实现方面,Proteus仿真可以提供以下几个方面的帮助: 1. 时钟电路设计:Proteus仿真软件提供了各种元件和器件模型,可以用于设计stm32的时钟电路。开发人员可以在软件中添加和连接时钟源、晶振、电容、电感等元件,并设置其参数和特性。 2. 时钟频率设定:Proteus仿真软件允许开发人员设定时钟的频率。可以通过调节晶振的参数、加入PLL锁相环电路和设置分频器等方式,实现对stm32时钟频率的控制和调整。通过仿真,可以验证时钟频率的稳定性和精度。 3. 时钟分频设计:在stm32的时钟设计中,时钟分频是很常见的需求。Proteus仿真软件允许开发人员设计和验证时钟分频电路的正确性。通过添加和设置分频器,可以将时钟分频为需要的频率,满足不同外设和模块对时钟频率的要求。 4. 时钟精度和稳定性验证:Proteus仿真软件可以模拟外部环境对时钟信号的影响,如电源噪声、温度变化等,帮助开发人员验证时钟的精度和稳定性。可以通过仿真来检测和调整时钟电路,使其满足系统要求。 总之,Proteus仿真软件在stm32时钟设计和实现方面是一个强大的辅助工具。通过仿真,可以帮助开发人员验证电路设计的正确性、稳定性和精度,加快产品开发的进度,以及减少出错的风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值