数码管显示4×4键盘矩阵按键实验报告

此程序用于初学嵌入式ARM时的程序 一、介绍 这里是keil4 MDK和Proteus8.6 联合使用,芯片为LPC2103。 二、了解GPIO的控制寄存器组 IOPINx——引脚功能选择寄存器 IOxDIR——GPIO方向寄存器 IOxSET——GPIO输出置位寄存器 IOxCLR——GPIO清零寄存器 IOxPIN——GPIO引脚值寄存器 三、按键电路图 三、工作原理 取p0

此程序用于初学嵌入式ARM时的程序
一、介绍
这里是keil4 MDK和Proteus8.6 联合使用,芯片为LPC2103。
二、了解GPIO的控制寄存器组
IOPINx——引脚功能选择寄存器
IOxDIR——GPIO方向寄存器
IOxSET——GPIO输出置位寄存器
IOxCLR——GPIO清零寄存器
IOxPIN——GPIO引脚值寄存器
三、按键电路图

三、工作原理
取p0.12到p0.15为输出口,p0.8到p0.11为输入口,将输出口和输入口通过按键连接,让输出口发送高电平,当按键按下时,输入口检测到低电平,即可以触发某个程序,从而实现对数码管的控制。此程序数码管由p0.0到p0.7来控制。
但是该方法(轮询法)效率低,只能用于一些比较简单的且单一的应用系统中,作为一个简单的例子,也在很多教科书上出现。
四、代码实现
引用头文件LPC2103.h,我这个头文件是老师给的,但是有的头文件的定义可能和程序里的不一样,需要改,比如:如果头文件中写的是 #define IOPIN (*((volatile unsigned long *) 0xE0028000))
而程序中使用IO0DIR就会报错,因为和头文件不符
所以我在头文件中加了一个0,就是改为了IO0DIR,报错就没了

#include“LPC2103.h”

设置初始化函数,将p0.0到p0.15功能选择为GPIO,取p0.12到p0.15为输出口,p0.8到p0.11为输入口。

void Initialization()
{
	PINSEL0=0x0000;//设置为GPIO
	IO0DIR=0xf0ff;
}

数码管显示函数,这里是共阴极0到F的段码表

void LED(int a)		//数码管显示程序
{
	 unsigned char liang[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
	IO0SET=liang[a];
}

接下来就是主函数了
首先定义两个32位的变量——put和cleck
因为我要让输出口依次发送高电平,所以我打算用移位来实现,所以是对put赋初始值,

int main ()
{ 
   unsigned int put,cleck;
   unsigned char i,j;
   Initialization();//初始化
   IO0CLR=0xffff; //清0
   put=0x1000;

接下来进入循环,外循环i是控制输出口,内循环j控制输入口,其中有个检测电平状态的if语句,用的是IO0PIN 寄存器,为了实现按键按下显示数,松开灭的效果,加了个while语句。
然后在每个循环的最后就是移位操作。

for(i=0;i<4;i++)
   {
   	  IO0SET=put;//发送
	  cleck=0x0100;
	  for(j=0;j<4;j++)
	  {
		if((IO0PIN&cleck)!=0)  while((IO0PIN&cleck)!=0)   LED(4*j+i);  //等待按键按下
		cleck=(cleck<<1);
	  }
	  IO0CLR=put;
	  put=(put<<1);	    
   }	
}

这里还有一个问题怎么查表呢
如果按正常来说
从左往右依次递增,则可以找到该数与i,j的关系
可以得到为该数=4*j+i,所以就可以用前面定义的函数LED了
五、完整电路图
在这里插入图片描述
六、显示效果
在这里插入图片描述
该方法(轮询法)效率低,只能用于一些比较简单的且单一的应用系统中,在大多数情况下都是采用中断方式,咱们下次再说。

知秋君
上一篇 2024-07-09 15:36
下一篇 2024-07-09 15:02

相关推荐