在开发板上还有八个按键,用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程序也是不一样的.