《arm电子相册项目——led模块篇led.c》
工具:keil4 , arm开发板(Mini2451)(s3c2451) , 串口线
功能:显示照片(自动切换 / 手动切换 / 暂停切换 / 可设置)
显示时钟(精确显示 / 可设置)
进度:第3篇——led.c(led灯)
描述:拿到开发板的第一个程序,就是如何点亮一个led->点亮所有的led->led流水灯
本篇会从点亮一个led程序开始,一直讲到如何在arm电子相册中应用led不断闪烁
;/*****************************************************
;Author:Ivan Version:0.1 Date:
;File name:startup.s
;Description:启动代码
;*****************************************************/
AREA Init , CODE , READONLY ;定义一代码段,只读
ENTRY ;入口
start
ldr r0,=0x53000000
ldr r1,=0x0
str r1,[r0] ;在0x53000000地址中放入0的值
IMPORT Main ;声明,汇编中可以调用main函数
bl Main ;跳转到main
EXPORT delay ;声明,c函数中可以调用汇编delay
delay
ldr r0,=0x1000000 ;赋初值(若c函数中delay(2000000),则初值变为0x2000000)
delay_loop
cmp r0,#0 ;是否==0
sub r0,r0,#1 ;r0--
bne delay_loop ;b=跳转,n=不,e=相等,若前面cmp比较不相等就跳转,继续循环
mov pc,lr ;回到之前的位置
END
/*****************************************************
Author:Ivan Version:0.1 Date:
File name:led.h
Description:led相关寄存器地址
*****************************************************/
#ifndef LED_H_
#define LED_H_
//GPA25,26端口 / GPB5,6端口分别控制Mini2451上的4个led,所以要对这几个端口相关的寄存器初始化
#define GPACON (*(volatile unsigned long *)0x56000000)
#define GPADAT (*(volatile unsigned long *)0x56000004)
#define GPBCON (*(volatile unsigned long *)0x56000010)
#define GPBDAT (*(volatile unsigned long *)0x56000014)
#define GPBSEL (*(volatile unsigned long *)0x5600001C)
extern void led_init(void);
#endif
/*****************************************************
Author:Ivan Version:0.1 Date:
File name:led.c
Description:led模块初始化
*****************************************************/
#include "led.c"
void led_init(void)
{
GPACON &= ~(0x3<<25); //将GPA25,GPA26设置为output模式
GPBCON = (0x5<<10); //将GPB5,GPB6设置为output模式
GPBSEL = 0x0; //将GPBSEL设置为0(有GPB6相关位)
}
/*****************************************************
Author:Ivan Version:0.1 Date:
File name:main.h
Description:将多个头文件整合方便调用
*****************************************************/
#ifndef MAIN_H_
#define MAIN_H_
#include "led.h"
#endif
/*****************************************************
Author:Ivan Version:0.1 Date:
File name:main.c
Description:主函数(用按键点亮一盏led)
*****************************************************/
#include "main.h"
extern void delay(unsigned int t); //声明,可以使用汇编delay
void Main()
{
while(1)
{
GPADAT &= ~(0x1<<25); //只开启GPA25号led
delay(0x1000000);
GPADAT |= (0x1<<25); //只关闭GPA25号led
delay(0x1000000);
}
}
上面是一段完整的代码,功能是点亮一个led灯,想要开启 / 关闭其他部分的led,只需将该端口的数据位置0 / 1就行。
GPACON &= ~(0x3<<25); //将GPA25,GPA26设置为output模式
GPBCON = (0x5<<10); //将GPB5,GPB6设置为output模式
GPBSEL = 0x0; //将GPBSEL设置为0(有GPB6相关位)
while(1)
{
GPADAT &= ~(0x1<<25); //只开启GPA25号led
delay(0x1000000);
GPADAT |= (0x1<<25); //只关闭GPA25号led
delay(0x1000000);
GPADAT &= ~(0x1<<26); //GPA26号led
delay(0x1000000);
GPADAT |= (0x1<<26);
delay(0x1000000);
GPBDAT &= ~(0x1<<5); //GPB5号led
delay(0x1000000);
GPBDAT |= (0x1<<5);
delay(0x1000000);
GPBDAT &= ~(0x1<<6); //GPB6号led
delay(0x1000000);
GPBDAT |= (0x1<<6);
delay(0x1000000);
}
上面是一段流水灯代码。
GPACON &= ~(0x3<<25); //将GPA25,GPA26设置为output模式
GPBCON = (0x5<<10); //将GPB5,GPB6设置为output模式
GPBSEL = 0x0; //将GPBSEL设置为0(有GPB6相关位)
while(1)
{
GPADAT = 0x0;
GPBDAT = 0x0;
delay(0x100000);
GPADAT = 0xffffffff;
GPBDAT = 0xffffffff;
delay(0x100000);
}
arm电子相册中,led灯闪烁,表示机器正常运行