OK6410:按键驱动

  如果玩过单片机,写过按键驱动,那么在OK6410上写裸板按键驱动也是同样的原理。只不过OK6410要对IO进行配置。

  在写裸板程序的时候,常常会看到C代码上定义的寄存器地址要有关键字volatile修饰。这个关键字比较少见,这是什么意思呢?看了韦东山老师的S3C6410裸板程序视频教学后,我明白了。

  在编写C代码的时候,由于寄存器的地址定义了却有时没有被使用,会被编译器优化掉。这么一来,定义好的寄存器地址就没有了。所以要加上volatile关键字,防止寄存器地址定义被编译器优化掉。

  写按键驱动代码,一样的,要看原理图。

底板按键原理图:

OK6410:按键驱动_第1张图片

核心板原理图:

OK6410:按键驱动_第2张图片

  由上可知,开发板的四个按键和S3C6410的GPN0~GPN5连在一起的。

  根据S3C6410的手册,配置GPNCON寄存器对应位设置为输入功能。

  编写代码实现按键控制LED灯,下面直接贴代码。

#define rGPMCON (*(volatile unsigned *)(0x7F008820)) #define rGPNCON (*(volatile unsigned *)(0x7F008830)) //按键的IO口的配置寄存器 #define rGPMDAT (*(volatile unsigned *)(0x7F008824)) #define rGPNDAT (*(volatile unsigned *)(0x7F008834)) //按键的IO口的数据寄存器 #define GPN0_in ~(3<<(0*2)) //定义四个按键的输入,方便配置GPNCON #define GPN1_in ~(3<<(1*2)) #define GPN2_in ~(3<<(2*2)) #define GPN3_in ~(3<<(3*2)) void msDelay(int time) //延时 { volatile unsigned int i,j; for(i = 0; i < 2000000; i++) for(j=0; j<time; j++); } void GPIO_Init(void) { rGPMCON = 0x11111; //GPM配置成输出用 rGPMDAT = 0X1F; rGPNCON = GPN0_in & GPN1_in & GPN2_in & GPN3_in; //配置GPNCON } void go(void) { unsigned long dwDat; while(1) //循环判断那个按键被按下,并点亮相应的LED灯 { dwDat = rGPNDAT; //先读取GPNDAT的值,按键按下后,对应的GPNDAT位就会变成低电平 if(dwDat & (1<<0)) //判断相应的位的值,如果为1则按键弹起,相应LED熄灭,为0,则相应LED灯点亮 rGPMDAT |= (1<<0); else rGPMDAT &= ~(1<<0); if(dwDat & (1<<1)) rGPMDAT |= (1<<1); else rGPMDAT &= ~(1<<1); if(dwDat & (1<<2)) rGPMDAT |= (1<<2); else rGPMDAT &= ~(1<<2); if(dwDat & (1<<3)) rGPMDAT |= (1<<3); else rGPMDAT &= ~(1<<3); } } void main(void) { GPIO_Init(); go(); }

你可能感兴趣的:(OK6410:按键驱动)