8051汇编 8个按键分别控制8个LED

前段时间一直用的C语言编写8051程序,但要更深入的了解单片机的底层原理,还是得使用汇编

以下是我写的练习,8个按键分别控制8个LED

LED是高电平点亮,接在P1口

按键是低电平表示触发,接在P0口


		ORG 0000H
			JMP INIT
		ORG 0030H
INIT:		MOV P1, #00H	;初始化LED IO,高电平有效
			MOV P0, #0FFH	;初始化按键IO,低电平有效
			MOV A, #01H		
MAIN:		MOV R0, A 		;保存A的状态
			ADD A, P0		;将A的值与P0相加
			CJNE A, #0FFH, NO_PRESS ;如果相加后的结果不为FFH,跳转
            ACALL DELAY     ;调用延时,防抖
            MOV A, R0
            ADD A, P0
            CJNE A, #0FFH, NO_PRESS
			MOV P1, R0		;如果相加后的结果为FFH,设置LED
NO_PRESS:	MOV A, R0		;还原A的状态
			RL A			;A向左位移
			JMP MAIN		;跳转到MAIN,循环执行
            
DELAY:      MOV R7, #26H    ;10ms延时
LOOP1:      MOV R6, #82H
            DJNZ R6, $
            DJNZ R7, LOOP1
			RET
            
		END




汇编语言中的按键操作通常涉及到中断处理和GPIO(通用输入/输出)管理,用于控制LED的开关。如果你想要用汇编语言编写一个程序来独立控制多个LED,你需要做以下步骤: 1. **初始化GPIO**:首先,需要设置GPIO口为输出模式,并将LED对应的GPIO管脚配置为输出。 2. **检测按键**:通过读取特定的按键输入端口(比如P0、P1等),利用中断机制监控按键的状态变化。当按键按下时,会触发中断响应。 3. **处理中断**:在中断服务函数(ISR)中,检查按键状态并相应地控制LED。如果按键按下,就切换到点LED的状态;如果松开,就切换回熄状态。 4. **LED操作**:通过设置GPIO口的状态(高电平代表,低电平代表),控制每个LED。 5. **循环等待**:主程序进入循环,不断检查按键和处理LED状态的改变。 下面是一个简单的示例代码片段,展示了如何用汇编语言控制一个LED的基本结构,注意实际应用中需要替换为具体的硬件地址: ```assembly ; 省略了头文件和全局变量声明 ; 设置GPIO口为输出 mov P0, #0x00 ;假设P0口控制LED ldi R16, HIGH(LED_PORT) ; LED_PORT是GPIO口的寄存器地址 out P0, R16 ; 设置中断处理函数 ISR(KEY_BUTTON_vect) { in R16, KEY_BUTTON_PORT ;读取按键输入 cpi R16, LOW(KEY_DOWN) ;比较是否按下 brne LED_ON ;若按下,则跳转到LED打开部分 ; 如果按键未按,这里可以添加其他操作,如LED关闭 LED_OFF: mov P0, #0x00 ;关闭LED rjmp END_ISR ;结束中断处理 } LED_ON: mov P0, #0xFF ;点LED END_ISR: reti ;返回中断上下文 ; 主程序循环 main_loop: cli ;禁止全局中断,防止干扰 sei ;启用全局中断 jmp main_loop ;无限循环,持续监听按键 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值