此程序用于初学嵌入式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;
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了
五、完整电路图

六、显示效果

该方法(轮询法)效率低,只能用于一些比较简单的且单一的应用系统中,在大多数情况下都是采用中断方式,咱们下次再说。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/54475.html