ARM9(S3C2440)的IO口--LED流水灯(2)
- UID
- 1029342
- 性别
- 男
|
ARM9(S3C2440)的IO口--LED流水灯(2)
步骤:
1.IO口初始化,设置GPBCON,GPBUP寄存器。
在这里PB口的GPB5-PGB8作为通用IO口使用,实现输出功能,所以GPBCON的GPB5-PGB8位应分别都为01,即GPBCON[17:10]为 01010101;GPBUP初始状态全为0,即使能上拉电阻功能,可不用设置,此处进行了设置。
I/O口与外围设备连接一般要通过光电隔离或其他隔离器件,直接相连一定要确认负载不能超过4个与非门。光电隔离一是可保护微处理器;二是可进行电平转换;三是可对某些信号进行分配,所以在一般情况下都要加。
2.控制思路比较简单,让PB口的5-8位循环变为低电平(其他时间均为高电平),即可实现流水灯,在两次电平变换中间加入延时。
3.程序
#definerGPBCON (*(volatile unsigned *)0x56000010) //Port Bcontrol
#definerGPBDAT (*(volatile unsigned *)0x56000014) //Port Bdata
#definerGPBUP (*(volatile unsigned *)0x56000018) //Pull-upcontrol B
#define LED1_ON (rGPBDAT&=~(1<<5)) //GPB5位清0
#define LED1_OFF (rGPBDAT|=(1<<5) ) //GPB5位置1
#define LED2_ON (rGPBDAT&=~(1<<6))
#define LED2_OFF (rGPBDAT|=(1<<6))
#define LED3_ON (rGPBDAT&=~(1<<7))
#define LED3_OFF (rGPBDAT|=(1<<7))
#define LED4_ON (rGPBDAT&=~(1<<8))
#define LED4_OFF (rGPBDAT|=(1<<8))
void Delay(void)
{
int i;
for(i=0;i<1000000;i++);
}
int Main()
{
rGPBCON&=~((3<<10)|(3<<12)|(3<<14)|(3<<16)); //对GPBCON[10:17]清零
rGPBCON|=((1<<10)|(1<<12)|(1<<14)|(1<<16)); //设置GPB5~8为输出
rGPBUP&=~((1<<5)|(1<<6)|(1<<7)|(1<<8)); //设置GPB5~8的上拉功能
rGPBDAT|=(1<<5)|(1<<6)|(1<<7)|(1<<8); //关闭LED
while(1)
{
LED1_ON;Delay();LED1_OFF;
LED2_ON;Delay();LED2_OFF;
LED3_ON;Delay();LED3_OFF;
LED4_ON;Delay();LED4_OFF;
}
return 0;
}
4.程序说明,程序中对寄存器的设置采用了#define LED1_ON (rGPBDAT&=~(1<<5))这种方法,相比直接赋值的方法,这种表示方法比较容易观察出是寄存器的哪一位发生了变化,并且保证除了需要改变的位发生变化之外,其他位保持不变! |
|
|
|
|
|