TQ2440裸机实验(键盘和LED结合)
来源:互联网 发布:js对象添加属性及方法 编辑:程序博客网 时间:2024/05/20 08:41
IMPORT main
AREA Init,CODE,READONLY ;程序入口的地方
ENTRY
START
ldr r0, =0x56000010 ; @ WATCHDOG寄存器地址
mov r1, #0x0
str r1, [r0] ; @ 写入0,禁止WATCHDOG,否则CPU会不断重启
ldr sp, =1024*4 ; @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
; @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
bl main ; @ 调用C程序中的main函数
halt_loop
b halt_loop
这是开始一点初始化使用汇编写的,下面是功能函数:
#define GPB5_out (1<<(5*2)) //GPB5位[11:10]=01就可以把对应端口设为输出
#define GPB6_out (1<<(6*2))
#define GPB7_out (1<<(7*2))
#define GPB8_out (1<<(8*2))
#define GPF4_in ~(3<<(4*2)) //把GPF4位[9:8]设为0:0就可以把按键设为输入,具体对应关可以看芯片手册
#define GPF1_in ~(3<<(1*2))
#define GPF2_in ~(3<<(2*2))
#define GPF0_in ~(3<<(0*2))
int main()
{
unsigned long dwDat;
// LED1-LED4对应的4根引脚设为输出
GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out ;
// K1-K2对应的2根引脚设为输入
GPFCON = GPF0_in & GPF1_in & GPF2_in & GPF4_in;
while(1){
//若Kn为0(表示按下),则令LEDn为0(表示点亮)
dwDat = GPFDAT; // 读取GPG管脚电平状态
if (dwDat & (1<<0)) // K1没有按下
GPBDAT |= (1<<5); // LED1熄灭
else
GPBDAT &= ~(1<<5); // LED1点亮
if (dwDat & (1<<1)) // K2没有按下
GPBDAT |= (1<<6); // LED2熄灭
else