2025年初学嵌入式ARM——矩阵式键盘控制数码管(轮询式)

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

小讯
上一篇 2025-01-19 18:54
下一篇 2025-04-01 14:38

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/54475.html