S3C2440裸机之用查询方式按键控制LED


前言

本文基于JZ2440开发板


一、思维导图

在这里插入图片描述

二、代码

1.key_led.c

代码如下(示例):

/************************************************************************
*
* 文件名:key_led.c
*
* 功能:  用EINT0(GPF0)按键控制D12(GPF6),
		 用EINT2(GPF2)按键控制D11(GPF5),
		 用EINT11(GPG3)按键控制D10(GPF4)
*
* 创建人:LiZhenhao
*
* 时间:2021年10月9日16:49:52
*
* 版本号:1.0
*
* 修改记录:无
*
************************************************************************/
#include "S3C2440.h"

int main(int argc, char const *argv[])
{
	
	//LED
	/* GPFCON配置成输出模式      GPF4(bit9~bit8)、GPF5(bit11~bit10)、GPF6(bit13~bit12)置为01 */
	GPFCON &= ~( (3 << 8) | ( 3 << 10 ) | ( 3 << 12) );	//清零
	GPFCON |= ( ( 1 << 8 ) | ( 1 << 10 ) | ( 1 << 12 ) );	//置1

	//按键
	/* GPGCON配置成输入模式  GPG3(bit7~bit6)置为00 */
	GPGCON &= ~( ( 3 << 6 )  );
	/* GPFCON配置成输入模式  GPF0(bit1~bit0)、GPF2(bit5~bit4)置为00 */
	GPFCON &= ~( (3 << 0) | ( 3 << 4 ) );	//清零

	while(1) {
		//控制D12
		if ((GPFDAT & ( 1 << 0 )) ) {   //if(GPDAT & (1<<0) ==0 )
			//D12(GPF6)灯亮
			GPFDAT &= ~( 1 << 6 );
		} else {
			//D12(GPF6)灯灭
			GPFDAT |= ( 1 << 6 );
		}

		//控制D11
		if ((GPFDAT & ( 1 << 2 )) ) {
			//D11(GPF5)灯亮
			GPFDAT &= ~( 1 << 5 );
		} else {
			//D11(GPF5)灯灭
			GPFDAT |= ( 1 << 5 );
		}

		//控制D10
		if ((GPGDAT & ( 1 << 3 )) ) {
			//D10(GPF4)灯亮
			GPFDAT &= ~( 1 << 4 );
		} else {
			//D10(GPF4)灯灭
			GPFDAT |= ( 1 << 4 );
		}
	}
	

	return 0;
}


2.头文件S3C2440.h

代码如下(示例):

#ifndef __S3C2440_H__
#define __S3C2440_H__

#define GPFCON (*(volatile unsigned int*)0x56000050)
#define GPFDAT (*(volatile unsigned int*)0X56000054)
#define GPGCON (*(volatile unsigned int*)0x56000060)
#define GPGDAT (*(volatile unsigned int*)0x56000064)

#endif


3.汇编start.S

代码如下(示例):


.text
.global _start

_start:

	/* 关闭看门狗 */
	ldr r0, =0x53000000
	ldr r1, =0
	str r1, [r0]

	/* 设置内存: sp 栈 */
	/* 分辨是nor/nand启动
	 * 写0到0地址, 再读出来
	 * 如果得到0, 表示0地址上的内容被修改了, 它对应ram, 这就是nand启动
	 * 否则就是nor启动
	 */
	mov r1, #0
	ldr r0, [r1] /* 读出原来的值备份 */
	str r1, [r1] /* 0->[0] */ 
	ldr r2, [r1] /* r2=[0] */
	cmp r1, r2   /* r1==r2? 如果相等表示是NAND启动 */
	ldr sp, =0x40000000+4096 /* 先假设是nor启动 */
	moveq sp, #4096  /* nand启动 */
	streq r0, [r1]   /* 恢复原来的值 */
	

	bl main

halt:
	b halt
	

4.Makefile

代码如下(示例):

all:
	arm-linux-gcc -c -o key_led.o key_led.c
	arm-linux-gcc -c -o start.o start.S
	arm-linux-ld -Ttext 0 start.o key_led.o -o key_led.elf
	arm-linux-objcopy -O binary -S key_led.elf key_led.bin
	arm-linux-objdump -D key_led.elf > key_led.dis
clean:
	rm *.bin *.o *.elf *.dis

总结

先学会把LED点亮,然后在LED灯点亮基础上的代码进行修改,这样会比较好上手。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

free(me)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值