//键盘控制LED灯程序
//定义LED的IO引脚
#define rGPMCON (*(volatile unsigned *)(0x7f008820))
#define rGPMDAT (*(volatile unsigned *)(0x7f008824))
#define rGPMPUD (*(volatile unsigned *)(0x7f008828))
//定义按键的IO引脚
#define rGPNCON (*(volatile unsigned *)(0x7f008830))
#define rGPNDAT (*(volatile unsigned *)(0x7f008834))
#define rGPNPUD (*(volatile unsigned *)(0x7f008838))
void msDelay(int time)
{
volatile unsigned int i,j;
for(i = 0; i < 50000; i++)
for(j=0; j<time; j++);
}
void GPIO_Init(void)
{
rGPMCON = 0x11111;
rGPMPUD = 0x00;
rGPMDAT = 0X1F;
}
void LedTest1(void) //按下亮,再按下灭,一个按键对应一个灯
{
volatile unsigned int i;
while(1)
{
if((1<<0) & rGPNDAT)
{
}
else //如果按键1按下
{
msDelay(20);
if((rGPMDAT & (1<<0)) == 0 ) //如果灯1亮
{
rGPMDAT = 0x1f; //关闭灯1
msDelay(20);
}
else
{
rGPMDAT = ~(1<<0); //打开灯1
msDelay(20);
}
}
if((1<<1) & rGPNDAT)
{
}
else //如果按键2按下
{
msDelay(20);
if((rGPMDAT & (1<<1)) == 0 ) //如果灯2亮
{
rGPMDAT = 0x1f; //关闭灯2
msDelay(20);
}
else
{
rGPMDAT = ~(1<<1); //打开灯2
msDelay(20);
}
}
if((1<<2) & rGPNDAT)
{
}
else //如果按键3按下
{
msDelay(20);
if((rGPMDAT & (1<<2)) == 0 ) //如果灯3亮
{
rGPMDAT = 0x1f; //关闭灯3
msDelay(20);
}
else
{
rGPMDAT = ~(1<<2); //打开灯3
msDelay(20);
}
}
if((1<<3) & rGPNDAT)
{
}
else //如果按键4按下
{
msDelay(20);
if((rGPMDAT & (1<<3)) == 0 ) //如果灯4亮
{
rGPMDAT = 0x1f; //关闭灯4
msDelay(20);
}
else
{
rGPMDAT = ~(1<<3); //打开灯4
msDelay(20);
}
}
}
}
void LedTest2(void) //按下亮,松开灭,一个按键对应一个灯
{
volatile unsigned int i;
while(1)
{
if((1<<0) & rGPNDAT)
{
rGPMDAT = 0xf;
}
else
{
rGPMDAT = ~(1<<0);
}
if((1<<1) & rGPNDAT)
{
rGPMDAT = 0xf;
}
else
{
rGPMDAT = ~(1<<1);
}
if((1<<2) & rGPNDAT)
{
rGPMDAT = 0xf;
}
else
{
rGPMDAT = ~(1<<2);
}
if((1<<3) & rGPNDAT)
{
rGPMDAT = 0xf;
}
else
{
rGPMDAT = ~(1<<3);
}
}
}
void main(void)
{
GPIO_Init();
LedTest1(); //按下亮,再按下灭,一个按键对应一个灯
// LedTest2(); //按下亮,松开灭,一个按键对应一个灯
}