GPIO编程(三)键盘控制led灯

在开发板上还有八个按键,用1234分别把1234灯点亮,5678把1234灯灭掉.

我们通过向寄存器写入数据来控制led灯的亮灭,而键盘是我们不断从中读取数据来获取状态。

在看代码之前,把GPIO编程的知识进行一次总结。

1.GPxCON寄存器,选择引脚功能

a.某位为01 output,输出引脚,GPxDAT写入0/1,引脚输出低电平或高电平

b.某位为00 input,输入引脚,引脚为地址线或用于地址控制,GPxDAT无用。我们就可以获取寄存器的状态即相应引脚的电平状态是高是低,比如键盘。

2.GPxDAT寄存器,用于读写引脚数据

3.GPxUP寄存器,是否使用内部上拉电阻

当GPIO引脚不是低电平也不是高电平的时候,状态由上拉电阻、下拉电阻确定。

当把这些理论知识都弄懂了,再写程序就简单许多了,和我下面的两遍篇led和键盘的驱动程序这些就都能很容易的明白了。

这时候再上代码就没有问题了吧!

#define GPMCON (*(volatile int*)0x7f008820)
#define GPMDAT (*(volatile int*)0x7f008824)
#define GPMPUD (*(volatile int*)0x7f008828)

#define GPNCON (*(volatile int*)0x7f008830)
#define GPNDAT (*(volatile int*)0x7f008834)
#define GPNPUD (*(volatile int*)ox7f008838)

void init();
void delay(int);
void led(int, int);

void myentry()
{
    init();	
    while(1)
    {
        for (int i = 0; i < 4; i++)
        {
            if ((GPNDAT>>i)&0x1U)
            {
                led(i, 1);
            }
            else
            {
                led(i, 0);
            }
        }
    }
}

void init()
{
    GPMCON = (GPMCON && ~(0xffffU))|0x1111U;
    GPMPUD = GPMPUD && ~(0xffU);

    GPNCON = GPNCON && ~(0xfffU);
    GPNPUD = GPNPUD && ~(0xfffU);
}


void led(int num, int light)
{
    if (light)
    {
        GPKDAT |= 1 << num;
    }
    else
    {
        GPKDAT &= ~(1 << num);
    }
}
这里并没有使用前面说的用1234分别把1234灯点亮,5678把1234灯灭掉,因为这个程序是在ok6410上写的,它只有六个button,led的寄存器与上一篇led程序也是不一样的.
这里并不局限在什么开发板上,无论是tiny6410,还是ok6410.还是在板子上看下效果吧,如果按到某一个键,相应的灯就亮,松开就不亮了.

你可能感兴趣的:(编程,input,button,output,delay)