首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM9(S3C2440)的IO口--LED流水灯(2)

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))这种方法,相比直接赋值的方法,这种表示方法比较容易观察出是寄存器的哪一位发生了变化,并且保证除了需要改变的位发生变化之外,其他位保持不变!
继承事业,薪火相传
返回列表