此程序用于初学嵌入式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了
五、完整电路图
六、显示效果
该方法(轮询法)效率低,只能用于一些比较简单的且单一的应用系统中,在大多数情况下都是采用中断方式,咱们下次再说。