JZ2440-按键控制LED

一、电路原理图

 二、阅读芯片手册

由以上可知:GPG3配置为00

三、代码

结合JZ2440-点亮LED文章和以上内容,编写代码如下:

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
	

 

main.c

#include "s3c2440_soc.h"

void delay(volatile int d)
{
	while (d--);
}

int main(void)
{
	int val1, val2;
	
	/* 设置GPFCON让GPF4/5/6配置为输出引脚 */
	GPFCON &= ~((3<<8) | (3<<10) | (3<<12));
	GPFCON |=  ((1<<8) | (1<<10) | (1<<12));

	/* 配置3个按键引脚为输入引脚:
	 * GPF0(S2),GPF2(S3),GPG3(S4)
	 */
	GPFCON &= ~((3<<0) | (3<<4));  /* gpf0,2 */
	GPGCON &= ~((3<<6));  /* gpg3 */

	/* 循环点亮 */
	while (1)
	{
		val1 = GPFDAT;
		val2 = GPGDAT;

		if (val1 & (1<<0)) /* s2 --> gpf6 */
		{
			/* 松开 */
			GPFDAT |= (1<<6);
		}
		else
		{
			/* 按下 */
			GPFDAT &= ~(1<<6);
		}

		if (val1 & (1<<2)) /* s3 --> gpf5 */
		{
			/* 松开 */
			GPFDAT |= (1<<5);
		}
		else
		{
			/* 按下 */
			GPFDAT &= ~(1<<5);
		}

		if (val2 & (1<<3)) /* s4 --> gpf4 */
		{
			/* 松开 */
			GPFDAT |= (1<<4);
		}
		else
		{
			/* 按下 */
			GPFDAT &= ~(1<<4);
		}

		
	}

	return 0;
}

 

 

 

 

 

 

 

以下是一个简单的按键控制阈值的汇编语言代码,它可以通过按下按键来改变阈值的值: ``` ORG 0000h ; 程序从地址0开始执行 MOV P1, #0FFh ; 将P1口设为输入状态,使所有按键都能够被检测到 MOV P2, #0 ; 将P2口设为输出状态,用于控制LED灯 MOV A, #50 ; 设置一个默认的阈值值为50 LOOP: MOV C, P1 ; 将P1口读取到的值存储在C寄存器中 ANL C, #0Fh ; 只保留低4位,用于判断哪个按键被按下 JZ NO_CHANGE ; 如果没有按键被按下,跳过下面的代码 ; 如果有按键被按下,根据按键的不同改变阈值的值 CJNE C, #0Eh, NOT_PLUS ; 如果按键E没有被按下,跳到NOT_PLUS ADD A, #5 ; 如果按键E被按下,将阈值加5 JMP VALUE_CHANGED ; 跳到VALUE_CHANGED NOT_PLUS: CJNE C, #0Dh, NOT_MINUS ; 如果按键D没有被按下,跳到NOT_MINUS SUBB A, #5 ; 如果按键D被按下,将阈值减5 JMP VALUE_CHANGED ; 跳到VALUE_CHANGED NOT_MINUS: CJNE C, #0Bh, NOT_RESET ; 如果按键B没有被按下,跳到NOT_RESET MOV A, #50 ; 如果按键B被按下,将阈值重置为50 JMP VALUE_CHANGED ; 跳到VALUE_CHANGED NOT_RESET: CJNE C, #07h, NO_CHANGE ; 如果按键7没有被按下,跳到NO_CHANGE MOV P2, A ; 如果按键7被按下,将阈值值输出到P2口的LED灯上 JMP NO_CHANGE ; 跳到NO_CHANGE VALUE_CHANGED: MOV P2, A ; 将阈值值输出到P2口的LED灯上 JMP NO_CHANGE ; 跳到NO_CHANGE NO_CHANGE: SJMP LOOP ; 一直循环监测按键状态和改变阈值的值 ``` 以上代码仅供参考,具体实现可能会因硬件平台和需求而有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值