用汇编语言以及c语言实现LED1/LED2/LED3三盏灯点亮

2023-05-16

1:用汇编语言实现LED1/LED2/LED3三盏灯点亮:

程序:

.text 
.global _start
_start: 
	/**********LED1点灯**************/
	/*************Rcc章节***********/
	@1.设置GPIOE组时钟使能,通过RCC_AHB4ENSETR寄存器设置 0x500000A28[4]=1
	ldr r0,=0x50000A28      @准备一块地址空间
	ldr r1,[r0]
	orr r1,r1,#(0x1<<4)
	str r1,[r0]

	/*************GPIO章节*********/
	@1.设置PE10引脚为输出模式

	ldr r0,=0x50006000
	ldr r1,[r0]
	and r1,r1,#(~(0x1<<21))
	orr r1,r1,#(0x1<<20)
	str r1,[r0]
	@2.设置PE10引脚为推挽输出模式
	ldr r0,= 0x50006004
	ldr r1,[r0]
	and r1,r1,#(~(0x1<<10))
	str r1,[r0]
	@1.设置PE10引脚为低速输出模式
	ldr r0,=0x50006008
	ldr r1,[r0]
	and r1,r1,#(~(0x1<<20))
	and r1,r1,#(~(0x1<<21))
	str r1,[r0]
	@1.设置PE10引脚禁止上下拉电阻
	ldr r0,=0x5000600c
	ldr r1,[r0]
	and r1,r1,#(~(0x1<<20))
	and r1,r1,#(~(0x1<<21))
	str r1,[r0]


/******************************led2*********************************/
	ldr r0,=0x50000A28      @准备一块地址空间
	ldr r1,[r0]
	orr r1,r1,#(0x1<<5)
	str r1,[r0]

	/*************GPIO章节*********/
	@1.设置PE10引脚为输出模式

	ldr r0,=0x50007000
	ldr r1,[r0]
	and r1,r1,#(~(0x1<<21))
	orr r1,r1,#(0x1<<20)
	str r1,[r0]
	@2.设置PE10引脚为推挽输出模式
	ldr r0,= 0x50007004
	ldr r1,[r0]
	and r1,r1,#(~(0x1<<10))
	str r1,[r0]
	@1.设置PE10引脚为低速输出模式
	ldr r0,=0x50007008
	ldr r1,[r0]
	and r1,r1,#(~(0x1<<20))
	and r1,r1,#(~(0x1<<21))
	str r1,[r0]
	@1.设置PE10引脚禁止上下拉电阻
	ldr r0,=0x5000700c
	ldr r1,[r0]
	and r1,r1,#(~(0x1<<20))
	and r1,r1,#(~(0x1<<21))
	str r1,[r0]

/***********************LED3*********************/
	@1.设置GPIOE组时钟使能,通过RCC_AHB4ENSETR寄存器设置 0x500000A28[4]=1
	ldr r0,=0x50000A28      @准备一块地址空间
	ldr r1,[r0]
	orr r1,r1,#(0x1<<4)
	str r1,[r0]

	/*************GPIO章节*********/
	@1.设置PE10引脚为输出模式

	ldr r0,=0x50006000
	ldr r1,[r0]
	and r1,r1,#(~(0x1<<17))
	orr r1,r1,#(0x1<<16)
	str r1,[r0]
	@2.设置PE10引脚为推挽输出模式
	ldr r0,= 0x50006004
	ldr r1,[r0]
	and r1,r1,#(~(0x1<<8))
	str r1,[r0]
	@1.设置PE10引脚为低速输出模式
	ldr r0,=0x50006008
	ldr r1,[r0]
	and r1,r1,#(~(0x1<<17))
	and r1,r1,#(~(0x1<<16))
	str r1,[r0]
	@1.设置PE10引脚禁止上下拉电阻                                                
	ldr r0,=0x5000600c
	ldr r1,[r0]
	and r1,r1,#(~(0x1<<17))
	and r1,r1,#(~(0x1<<16))
	str r1,[r0]

loop:
	bl LED1_ON
	bl LED2_ON
	bl LED3_ON	
	bl delay_1s
	bl LED1_OF
	bl LED2_OF
	bl LED3_OF
	bl delay_1s

	b loop

	
LED1_ON:
	ldr r0,=0x50006014
	ldr r1,[r0]
	orr r1,r1,#(0x1<<10)
	str r1,[r0]
	mov pc,lr
LED1_OF:
	ldr r0,=0x50006014
	ldr r1,[r0]	
	and r1,r1,#(~(0x1<<10))
	str r1,[r0]
	mov pc,lr


		
LED2_ON:
	ldr r0,=0x50007014
	ldr r1,[r0]
	orr r1,r1,#(0x1<<10)
	str r1,[r0]
	mov pc,lr

LED2_OF:
	ldr r0,=0x50007014
	ldr r1,[r0]
	and r1,r1,#(~(0x1<<10))
	str r1,[r0]               
	mov pc,lr

LED3_ON:
    ldr r0,=0x50006014
    ldr r1,[r0]
    orr r1,r1,#(0x1<<8)
    str r1,[r0]
    mov pc,lr
LED3_OF:
    ldr r0,=0x50006014
    ldr r1,[r0] 
    and r1,r1,#(~(0x1<<8))           
    str r1,[r0]
    mov pc,lr



@ 大概1s的延时函数
delay_1s:
	mov r3, #0x10000000
	mm:
	cmp r3, #0
	subne r3, r3, #1
	bne mm
	mov pc, lr

.end


运行效果:

 

2: 用C语言实现LED1/LED2/LED3三盏灯点亮

 程序:

led.h:

#ifndef __LED_H__
#define __LED_H__

//寄存器封装

typedef struct{
	volatile unsigned int MODER; //00
	volatile unsigned int OTYPER; //04
	volatile unsigned int OSPEEDR; //08
	volatile unsigned int PUPDR; //0C
	volatile unsigned int IDR; //10
	volatile unsigned int ODR;//14
}gpio_t;


//LED1------->PE10

void led1_init();         

void led1_on();


void led1_off();

                         
void led2_init();        
                         
void led2_on();          
                         
                      

void led2_off();         
                         
                         
void led3_init();        
                         
void led3_on();          
                         
                         
void led3_off();         
                         





#endif

led.c:

#include "led.h"

#define GPIOE (*(gpio_t*)0x50006000)
#define GPIOF (*(gpio_t*)0x50007000)
#define RCC_AHB4_ENSETR  (*(volatile unsigned int*)0x50000A28)
void led1_init()
{
	//设置GPIOE组时钟使能
	
	RCC_AHB4_ENSETR = RCC_AHB4_ENSETR | (0x1 << 4);

	//设置PE10引脚为输出模式
	
	GPIOE.MODER=GPIOE.MODER&(~(0x1<<21));
	GPIOE.MODER=GPIOE.MODER | ((0x1<<20));

	//设置PE10引脚为推挽输出模式
	
	GPIOE.OTYPER &=(~(0x1<<10));

	//设置PE10引脚为低速输出模式
	
	GPIOE.OSPEEDR &=(~(0x1<<20));
	GPIOE.OSPEEDR &=(~(0x1<<21));
	//设置PE10引脚禁止上下拉电阻
	
	GPIOE.PUPDR &= (~(0x1<<20));  
 	GPIOE.PUPDR &= (~(0x1<<21));  

}

void led2_init()
{
    //设置GPIOE组时钟使能

    RCC_AHB4_ENSETR = RCC_AHB4_ENSETR | (0x1 << 5);

    //设置PE10引脚为输出模式

    GPIOF.MODER=GPIOE.MODER&(~(0x1<<21));
    GPIOF.MODER=GPIOE.MODER | ((0x1<<20));

    //设置PE10引脚为推挽输出模式

    GPIOF.OTYPER &=(~(0x1<<10));

    //设置PE10引脚为低速输出模式

    GPIOF.OSPEEDR &=(~(0x1<<20));
    GPIOF.OSPEEDR &=(~(0x1<<21));
    //设置PE10引脚禁止上下拉电阻

    GPIOF.PUPDR &= (~(0x1<<20));
    GPIOF.PUPDR &= (~(0x1<<21));

}

void led3_init()
{
    //设置GPIOE组时钟使能

    RCC_AHB4_ENSETR = RCC_AHB4_ENSETR | (0x1 << 4);

    //设置PE10引脚为输出模式

    GPIOE.MODER=GPIOE.MODER&(~(0x1<<17));
    GPIOE.MODER=GPIOE.MODER | ((0x1<<16));

    //设置PE10引脚为推挽输出模式

    GPIOE.OTYPER &=(~(0x1<<8));

    //设置PE10引脚为低速输出模式

    GPIOE.OSPEEDR &=(~(0x1<<17));
    GPIOE.OSPEEDR &=(~(0x1<<16));
    //设置PE10引脚禁止上下拉电阻

    GPIOE.PUPDR &= (~(0x1<<17));
    GPIOE.PUPDR &= (~(0x1<<16));

}


/***************led1_on/off*******************/
void led1_on()
{
	GPIOE.ODR |= (0x1<<10);

}

void led1_off()
{

	GPIOE.ODR &= (~(0x1<<10));

}

/******************led2_on/off*****************/
void led2_on()                          
{                                       
    GPIOF.ODR |= (0x1<<10);             
                                        
}                                       
                                        
void led2_off()                         
{                                       
                                        
    GPIOF.ODR &= (~(0x1<<10));          
                                        
}                                       
       
/*****************led3_on/off*********************/
void led3_on()                          
{                                       
    GPIOE.ODR |= (0x1<<8);             
                                        
}                                       
                                        
void led3_off()                         
{                                       
                                        
    GPIOE.ODR &= (~(0x1<<8));          
                                        
}                              

main.c:

#include "led.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
	int i,j;
	for(i = 0; i < ms;i++)
		for (j = 0; j < 1800; j++);
}


int main()
{
	led1_init(); // LED灯初始化
	led2_init();
	led3_init();
	while(1)
	{
		led1_on();
		led2_on();
		led3_on();
		delay_ms(500);
		led1_off();
		led2_off();
		led3_off();
		
		delay_ms(500);
	}
	return 0;
}

运行效果:

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用汇编语言以及c语言实现LED1/LED2/LED3三盏灯点亮 的相关文章

  • 编译华硕路由器ACRH17源代码小记

    源码包中有说明 xff1a The GPL source is created for ASUS wireless router related products Please visit the ASUS support site htt
  • win10 1709 华为ensp ar1启动失败 代码40 处理小记

    1 xff0c 重新覆盖安装ensp xff0c 安装时选择安装配套版本virtualbox xff0c 因为我以前安装过virtualbox版本和这个不同 xff0c 可能有不兼容问题 2 xff0c 删除C Users XXXXX Vi
  • 新硬盘装win10 uefi(又非uefi)弃坑小记

    无风扇小主机不能内置硬盘 xff0c 是内置的那种msata卡 xff0c 那种卡太贵了 xff0c 还是用硬盘盒装了硬盘接usb3 0 用diskgenius xff0c 将分区表转换成gpt xff0c 第一个分区会提示建esp分区 x
  • java两个List的交集,并集

    使用apache的CollectionUtils工具类 推荐 public static void main String args String arrayA 61 new String 34 1 34 34 2 34 34 3 34 3
  • 浅谈SPN

    SPN 切片分组网络 xff0c 它是PTN的演进 xff0c 更多的是为5G传输网量身打造 5G中所谓的网络切片 是核心网网元的灵活组合 xff0c 构成适用于各种业务场景的切片网络 xff0c 例如无人驾驶对于高可靠低时延网络的需求 x
  • 【C语言】排序详解——冒泡排序

    前言 xff1a 冒泡排序可以说是排序系列中最简单也最基础的一种排序的方式 xff0c 尽管它十分的简单易懂 xff0c 但依旧会有一些小问题是大家可能忽略的 xff0c 因此我打算将不同排序分成单独的文章进行讲解 xff0c 这样既不会显
  • Android设备的各种唯一标识符 ID

    IMEI 只有Android手机才有 xff0c IMEI号是一串15位的号码 xff0c 比如像这样 359881030314356 span class token class name TelephonyManager span sp
  • R语言-管道函数

    符号 xff1a gt 这是管道操作 xff0c 其意思是将 gt 左边的对象传递给右边的函数 说明 xff1a xff05 gt xff05 来自dplyr包的管道函数 xff0c 其作用是将前一步的结果直接传参给下一步的函数 xff0c
  • NFS启动出错Restarting nfs-kernel-server (via systemctl): failed!

    之前NFS已经安装完毕 xff0c 并且能够正常运行 xff0c 今天运行时出现一下错误 sudo etc init d nfs kernel server restart Restarting nfs kernel server via
  • Uncaught TypeError: upload is not a function at HTMLInputElement.onchange

    js 中标签的id名称不能和方法名一样 xff0c lt input type 61 34 file 34 id 61 34 upload 34 onchange 61 34 upload 34 gt 改为 lt input type 61
  • 【COMSOLX光纤仿真学习笔记】

    COMSOLX光纤仿真学习笔记 一根光纤的建模仿真过程绘制几何结构添加材料添加物理场网格模式分析参数化扫描绘制图表一些常用命令和公式 一根光纤的建模仿真过程 首先要定义光纤的参数 xff0c 结构参数 xff0c 材料参数等等 xff0c
  • python-pip镜像源永久指定安装源

    每次临时指定源地址比较麻烦 xff0c 可以通过以下方式配置永久源 在主目录创建 pip文件夹 mkdir span class token operator span span class token operator span span
  • windows系统下搭建cloudreve网盘系统

    最近博主想搭建属于自己的网盘系统 xff0c 去github上看了一些开源项目 xff0c 比较对cloudreve感兴趣 xff0c 但是github的搭建步骤不全以及网上没有完整的搭建博文 xff0c 于是 xff0c 博主想自己搭建c
  • OpenStack----多节点部署安装,实操演示!!

    xff08 本地源 xff09 OpenStack多节点部署安装 xff0c 实操演示 xff01 xff01 文章目录 前言一 xff1a 实验环境1 1 xff1a 环境介绍1 2 xff1a 实验拓扑图1 3 xff1a 实验目的 二
  • mysql同一个事务中先插入再查询与先删除再查询结果分析

    一 xff0c 现象展示 1 先插入再查询 BEGIN INSERT INTO video CREATE TIME UPDATE TIME VERSION VID VIDEO NAME SPEED RATE HORIZONTAL VERTI
  • WebAssembly 与 Rust 编程系列06 Rust模块与JavaScript交互

    WebAssembly 与 Rust 编程系列06 Rust模块与JavaScript交互 About 简介 上一篇文章 WebAssembly 与 Rust 编程系列05 Rust编写wasm模块 我们介绍了最简单的 Rust 导出was
  • POI 实现合并单元格以及列自适应宽度

    POI是apache提供的一个读写Excel文档的开源组件 xff0c 在操作excel时常要合并单元格 xff0c 合并单元格的方法是 xff1a sheet addMergedRegion new CellRangeAddress 1
  • 信息学奥赛一本通 1049:晶晶赴约会 | OpenJudge NOI 1.4 11

    题目链接 ybt 1049 xff1a 晶晶赴约会 OpenJudge NOI 1 4 11 晶晶赴约会 题目考点 1 逻辑运算符 xff1a 或 2 if else语句 3 三目运算符 解题思路 如果看展览那天的星期是周一 周三或周五 x
  • OpenStack Ussuri在Ubuntu20.04LTS、Ubuntu18.04LTS上GA

    紧跟OpenStack新版本Ussuri的发布 xff0c Canonical宣布了OpenStack Ussuri在Ubuntu20 04LTS和Ubuntu18 04LTS上GA 新的OpenStack上游版本最显著的增强是围绕Open
  • kali各种攻击手法笔记

    kali Linux笔记 xff1a 1 攻击mac flood 命令 xff1a macof 2 攻击DOS xff08 dhcp food xff09 命令 xff1a yersinia G 3 DOS攻击 TCP SYN flood

随机推荐