转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/20845823
这两天屌丝博主一直在看GPIO(其实就是I、O口),学过单片机的都知道。这个GPIO是最简单的程序了,我学习的时候俗称点灯。学单片机大多数都从点灯开始的。好了闲话少说开始正题。
学裸机程序是离不开手册的,所以想写好程序一定要仔细看手册。下面我将设计一个用按键控制LED二进制加减的程序来和小伙伴们交流GPIO。从原理图中能够看出LED是低电平被点亮的,高电平则熄灭。按键呢?按键则是按下去是低电平,没有按下是高电平。原理图介绍完了,然后咱们来说说如何控制他们。I O嘛,当然就是输入输出喽。
假如我想叫LED1量我只需要将该管脚的寄存器设置为输出,然后给他的另一个寄存器一个低电平就OK了。。这里面涉及到两个寄存器。一个是GPBCON这个是控制管脚的状态的,输出为(01)。还有一个是GPBDAT这个是给管脚低电平和高电平的寄存器。这两个就可以决定灯是否亮。按键和这个道理是一样的。
上面的这些都是编写程序的基础。
现在简单说下程序的思路。程序进入主函数后,进行初始化,将小灯全部熄灭,然后配置IO引脚,先初始化,然后再设置LED引脚为输出。键盘引脚为输入。进入循环如果按下K3小灯则以二进制形式加一。按下K4则减1。
#define GPGCON (*(volatile unsigned long *)0x56000060)
#define GPGDAT (*(volatile unsigned long *)0x56000064)
#define GPBCON (*(volatile unsigned long *)0x56000010)
#define GPBDAT (*(volatile unsigned long *)0x56000014)
/*
* LED1,LED2,LED4对应GPB5、GPB6、GPB7、GPB8
*/
#define GPB5_out (1<<(5*2))
#define GPB6_out (1<<(6*2))
#define GPB7_out (1<<(7*2))
#define GPB8_out (1<<(8*2))
#define GPB5_msk (3<<(5*2))
#define GPB6_msk (3<<(6*2))
#define GPB7_msk (3<<(7*2))
#define GPB8_msk (3<<(8*2))
/*
* K1,K2,K3,K4对应GPG0,GPG3,GPG5,GPG6
*/
#define GPG0_in (0<<(0*2))
#define GPG3_in (0<<(3*2))
#define GPG5_in (0<<(5*2))
#define GPG6_in (0<<(6*2))
#define GPG0_msk (3<<(0*2))
#define GPG3_msk (3<<(3*2))
#define GPG5_msk (3<<(5*2))
#define GPG6_msk (3<<(6*2))
void wait(volatile unsigned long dly)
{
for(; dly > 0; dly--);
}
int main()
{
//将四个灯初始化全为灭
GPBDAT = 0x1e0;//111100000
unsigned long dwDat;
unsigned long i=1;
// LED1,LED2,LED3,LED4对应的4根引脚设为输出
GPBCON &= ~(GPB5_msk | GPB6_msk | GPB7_msk | GPB8_msk);
GPBCON |= GPB5_out | GPB6_out | GPB7_out | GPB8_out;
// K1,K2,K3,K4对应的4根引脚设为输入
GPGCON &= ~(GPG5_msk | GPG6_msk);
GPGCON |= GPG5_in | GPG6_in;
while(1)
{
dwDat = GPGDAT; // 读取GPF管脚电平状态
if ((dwDat & (1<<5))==0) // K3按下了
wait(3000000); //延时消抖动
if ((dwDat & (1<<5))==0)
{
GPBDAT = GPBDAT-32; //减去32就是为了叫第六位(LED1)为0,点亮 第一个小灯
i=i+1;
if(i==15)
{
GPBDAT = 0x1e0;
}
}
if ((dwDat & (1<<6))==0) // K4按下
wait(3000000);
if ((dwDat & (1<<6))==0)
{
GPBDAT = GPBDAT+32;
i=i-1;
if(i==0)
{
i=15;
}
}
}
return 0;
}