1. start.s
preserve8
area reset, code, readonly
code32
entry
ldr pc, =start
nop
nop
nop
nop
nop
nop
nop
start
ldr sp, =0x40001000
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0x12
msr cpsr_c, r0
ldr sp, =0x40001000
sub sp, sp, #1024
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0x10
msr cpsr_c, r0
ldr sp, =40001000
sub sp, sp, #2048
import main
b main
finished
b finished
end
2. main.c
#include <s3c2440.h>
#include "led.h"
#include "key.h"
void init_wdt(void)//初始化看门狗,禁止启动,关闭看门狗
{
WTCON &= ~(1 << 0);
}
void dalay(unsigned int n)
{
while (n--);
}
int main(void)
{
init_wdt();
init_led();
init_key();
while (1)
{
// ledAllNor();
// dalay(0xfff);
// int i = 0;
// for (i = 0; i < 4; i++)
// {
// lenOn(i);
// dalay(0xfff);
// lenOff(i);
// }
//
// for (i = 4; i > 0; i--)
// {
// lenOn(i);
// dalay(0xfff);
// lenOff(i);
// }
int key = key_pressed();
if (key != 0)
{
ledOn(key);
}
else
{
ledAllOff();
}
}
}
3. led.h
#ifndef _LED_H_
#define _LED_H_
extern void init_led(void);
extern void ledOn(unsigned int n);
extern void ledOff(unsigned int n);
extern void ledAllOn(void);
extern void ledAllOff(void);
extern void ledAllNor(void);
#endif
4. led.c
#include <s3c2440.h>
#include "led.h"
void init_led(void)
{
GPBCON &= ~((3 << 10) | (3 << 12) | (3 << 14) | (3 << 16));
GPBCON |= ((1 << 10) | (1 << 12) | (1 << 14) | (1 << 16));
GPBDAT |= ((1 << 5) | (1 << 6) | (1 << 7) | (1 << 8));
}
void ledOn(unsigned int n)
{
if (n < 1 || n > 4)
{
return;
}
GPBDAT &= ~((1 << (n + 4)));
}
void ledOff(unsigned int n)
{
if (n < 1 || n > 4)
{
return;
}
GPBDAT |= ((1 << (n + 4)));
}
void ledAllOn(void)
{
GPBDAT &= ~((1 << 5) | (1 << 6) | (1 << 7) | (1 << 8));
}
void ledAllOff(void)
{
GPBDAT |= ((1 << 5) | (1 << 6) | (1 << 7) | (1 << 8));
}
void ledAllNor(void)
{
GPBDAT ^= (0x0f << 5);
}
5. key.h
#ifndef _KEY_H_
#define _KEY_H_
extern void init_key(void);
extern int key_pressed(void);
#endif
6. key.c
#include <s3c2440.h>
#include "key.h"
void init_key(void)
{
GPGCON &= ~((1 << 0) | (1 << 3) | (1 << 5) | (1 << 6) | (1 << 7) | (1 << 11));
GPGDAT |= ((1 << 0) | (1 << 3) | (1 << 5) | (1 << 6) | (1 << 7) | (1 << 11));
GPGUP |= ((1 << 0) | (1 << 11));
GPGUP &= ~((1 << 3) | (1 << 5) | (1 << 6) | (1 << 7));
}
int key_pressed(void)
{
int n = 0;
if (0 == (GPGDAT & (1 << 0)))
{
n = 1;
}
else if (0 == (GPGDAT & (1 << 3)))
{
n = 2;
}
else if (0 == (GPGDAT & (1 << 5)))
{
n = 3;
}
else if (0 == (GPGDAT & (1 << 6)))
{
n = 4;
}
return n;
}