分别用汇编语言、C语言编程实现LED流水灯

2023-05-16

一、C语言编程

1.先创建一个新的工程

2.文件名

3.右键Source Group创建一个.c文件

 

4.在.c文件中放入以下代码

//--------------APB2使能时钟寄存器------------------------
#define RCC_AP2ENR	*((unsigned volatile int*)0x40021018)
	//----------------GPIOA配置寄存器 ------------------------
#define GPIOA_CRL	*((unsigned volatile int*)0x40010800)
#define	GPIOA_ORD	*((unsigned volatile int*)0x4001080C)
//----------------GPIOB配置寄存器 ------------------------
#define GPIOB_CRH	*((unsigned volatile int*)0x40010C04)
#define	GPIOB_ORD	*((unsigned volatile int*)0x40010C0C)
//----------------GPIOC配置寄存器 ------------------------
#define GPIOC_CRH	*((unsigned volatile int*)0x40011004)
#define	GPIOC_ORD	*((unsigned volatile int*)0x4001100C)
//-------------------简单的延时函数-----------------------
void  Delay_ms( volatile  unsigned  int  t)
{
     unsigned  int  i;
     while(t--)
         for (i=0;i<800;i++);
}
void A_LED_LIGHT(){
	GPIOA_ORD=0x0<<7;		//PA7低电平
	GPIOB_ORD=0x1<<9;		//PB9高电平
	GPIOC_ORD=0x1<<15;		//PC15高电平
}
void B_LED_LIGHT(){
	GPIOA_ORD=0x1<<7;		//PA7高电平
	GPIOB_ORD=0x0<<9;		//PB9低电平
	GPIOC_ORD=0x1<<15;		//PC15高电平
}
void C_LED_LIGHT(){
	GPIOA_ORD=0x1<<7;		//PA7高电平
	GPIOB_ORD=0x1<<9;		//PB9高电平
	GPIOC_ORD=0x0<<15;		//PC15低电平	
}
//------------------------主函数--------------------------
int main()
{
	int j=100;
	RCC_AP2ENR|=1<<2;			//APB2-GPIOA外设时钟使能
	RCC_AP2ENR|=1<<3;			//APB2-GPIOB外设时钟使能	
	RCC_AP2ENR|=1<<4;			//APB2-GPIOC外设时钟使能
	//这两行代码可以合为 RCC_APB2ENR|=1<<3|1<<4;
	GPIOA_CRL&=0x0FFFFFFF;		//设置位 清零	
	GPIOA_CRL|=0x20000000;		//PA7推挽输出
	GPIOA_ORD|=1<<7;			//设置PA7初始灯为灭
	
	GPIOB_CRH&=0xFFFFFF0F;		//设置位 清零	
	GPIOB_CRH|=0x00000020;		//PB9推挽输出
	GPIOB_ORD|=1<<9;			//设置初始灯为灭
	
	GPIOC_CRH&=0x0FFFFFFF;		//设置位 清零
	GPIOC_CRH|=0x30000000;   	//PC15推挽输出
	GPIOC_ORD|=0x1<<15;			//设置初始灯为灭	
	while(j)
	{	
		A_LED_LIGHT();	
		Delay_ms(10000000);
		B_LED_LIGHT();
		Delay_ms(10000000);
		C_LED_LIGHT();
		Delay_ms(10000000);
	}
}


 5.点击build,在Objects文件夹中生成一个hex文件,这个是下载到板子中的程序

 6.打开FlyMcu,将bps改为256000,点击检索窜口,选择空闲的,点击开始编程,可以看到命令执行完毕,成功下载到板子里面

7.运行结果

 二、汇编语言

1.新建一个工程,步骤和上面一致,不过只需要勾选CORE,其余步骤与C语言一样

2.代码部分

RCC_APB2ENR EQU 0x40021018;
GPIOC_CRH EQU 0x40011004;
GPIOC_ORD EQU 0x4001100c;
GPIOA_CRL EQU 0x40010800;
GPIOA_ORD EQU 0x4001080C;
GPIOB_CRH EQU 0x40010C04;
GPIOB_ORD EQU 0x40010C0C;
Stack_Size EQU  0x00000400;
                AREA    STACK, NOINIT, READWRITE, ALIGN=3 
Stack_Mem       SPACE   Stack_Size
__initial_sp




                AREA    RESET, DATA, READONLY

__Vectors       DCD     __initial_sp               
                DCD     Reset_Handler              
                    
                    
                AREA    |.text|, CODE, READONLY
                    
                THUMB
                REQUIRE8
                PRESERVE8
                    
                ENTRY
Reset_Handler 
				bl LED_Init
MainLoop        BL LED_ON_C
                BL Delay
                BL LED_OFF_C
                BL Delay
				BL LED_ON_A
                BL Delay
                BL LED_OFF_A
                BL Delay
				BL LED_ON_B
                BL Delay
                BL LED_OFF_B
                BL Delay
                
                B MainLoop
LED_Init
                PUSH {R0,R1, LR}
                
                LDR R0,=RCC_APB2ENR
                ORR R0,R0,#0x1c
                LDR R1,=RCC_APB2ENR
                STR R0,[R1]
				
				
				
               
                LDR R0,=GPIOA_CRL
                BIC R0,R0,#0x0fffffff
                LDR R1,=GPIOA_CRL
                STR R0,[R1]
                
                LDR R0,=GPIOA_CRL
                ORR R0,#0x20000000
                LDR R1,=GPIOA_CRL
                STR R0,[R1]
				
                MOV R0,#0x80
                LDR R1,=GPIOA_ORD 
                STR R0,[R1]
				
				 ;初始化GPIOB部分
                LDR R0,=GPIOB_CRH
                BIC R0,R0,#0xffffff0f
                LDR R1,=GPIOB_CRH
                STR R0,[R1]
                
                LDR R0,=GPIOB_CRH
                ORR R0,#0x00000020
                LDR R1,=GPIOB_CRH
                STR R0,[R1]
				
                MOV R0,#0x200
                LDR R1,=GPIOB_ORD 
                STR R0,[R1] 
				
				
                LDR R0,=GPIOC_CRH
                BIC R0,R0,#0x0fffffff
                LDR R1,=GPIOC_CRH
                STR R0,[R1]
              
                LDR R0,=GPIOC_CRH
                ORR R0,#0x20000000
                LDR R1,=GPIOC_CRH
                STR R0,[R1]
				
                MOV R0,#0x8000
                LDR R1,=GPIOC_ORD 
                STR R0,[R1] 
             
                POP {R0,R1,PC}
LED_ON_A
                PUSH {R0,R1, LR}    
                
                MOV R0,#0x00 
                LDR R1,=GPIOA_ORD 
                STR R0,[R1]
             
                POP {R0,R1,PC}
             
LED_OFF_A
                PUSH {R0,R1, LR}    
                
                MOV R0,#0x80
                LDR R1,=GPIOA_ORD 
                STR R0,[R1]
             
                POP {R0,R1,PC}  
LED_ON_B
                PUSH {R0,R1, LR}    
                
                MOV R0,#0x000 
                LDR R1,=GPIOB_ORD 
                STR R0,[R1]
             
                POP {R0,R1,PC}
             
LED_OFF_B;熄灯
                PUSH {R0,R1, LR}    
                
                MOV R0,#0x200 
                LDR R1,=GPIOB_ORD 
                STR R0,[R1]
             
                POP {R0,R1,PC}  
LED_ON_C;亮灯
                PUSH {R0,R1, LR}    
                
                MOV R0,#0x0000 
                LDR R1,=GPIOC_ORD 
                STR R0,[R1]
             
                POP {R0,R1,PC}
             
LED_OFF_C;熄灯
                PUSH {R0,R1, LR}    
                
                MOV R0,#0x8000 
                LDR R1,=GPIOC_ORD 
                STR R0,[R1] 
             
                POP {R0,R1,PC}             
             
Delay
                PUSH {R0,R1, LR}
                
                MOVS R0,#0
                MOVS R1,#0
                MOVS R2,#0
                
DelayLoop0        
                ADDS R0,R0,#1

                CMP R0,#330
                BCC DelayLoop0
                
                MOVS R0,#0
                ADDS R1,R1,#1
                CMP R1,#330
                BCC DelayLoop0 

                MOVS R0,#0
                MOVS R1,#0
                ADDS R2,R2,#1
                CMP R2,#15
                BCC DelayLoop0
                
                
                POP {R0,R1,PC}    
                NOP
				END

3.运行结果

 三、总结

通过这次实验,我学会了如何使用汇编语言和C语言来点亮led流水灯,在经过这两次实验之后,对keil的使用也更加的熟练和熟悉了。在用FlyMcu烧录的时候,由于port没选对,一直没烧录成功,因为选到了已被占用的port,在这个地方卡了好久。

五、参考

伊始不觉

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

分别用汇编语言、C语言编程实现LED流水灯 的相关文章

  • Windows 10安装 WSL2 (Ubuntu 20.04)

    条件 对于 x64 系统 xff1a 版本 1903 或更高版本 xff0c 采用 内部版本 18362 或更高版本 对于 ARM64 系统 xff1a 版本 2004 或更高版本 xff0c 采用 内部版本 19041 或更高版本 低于
  • Ubuntu 20.04 server 切换中文语言

    1 安装区域设置 locales Ubuntu 一般是预装了的 Kali Linux 和 Debian可能没有 就需要安装 更新索引 sudo apt update span class token comment 安装locales sp
  • 全新安装的Termux配置Ubuntu环境

    基于 Termux 0 101 测试 换国内源 默认官方源在国外速度慢 有梯子的话也可以不换 这里换清华源为例 更多 执行命令 span class token function sed span i span class token st
  • 1g 路由器使用

    前言 xff08 1 xff09 首次使用以及断网后配置都可参看本文 xff08 2 xff09 简谈 xff0c 创翼实际登录拨号的账号其实并不是 电话 64 cqit xff0c 而是在这个账号前面根据拨号时间生成一个随机字符串 xff
  • 基于随机森林的手写数字识别 (OpenCV)

    OpenCV 4 5 1 C 43 43 20 Ubuntu 20 04 素材 来源 基于 K近邻博文 中原5000个手写数字得到的按行排列的手写数字数据以及对应行的标签 保存为图片后直接放到这里使用 避免重复数据处理 右键图片另存为 行数
  • 使用支持向量机分类 (OpenCV)

    OpenCV 4 5 1 C 43 43 20 Ubuntu 20 04 素材 像素点和分类标签 组态档 设置用于构建该项目的最低cmake版本 cmake minimum required VERSION 3 1 设置项目名称和编程语言
  • 退出该博客平台声明

    试用c s d n快三个月了 xff0c 最不满的就是审核的问题 1 我自己写的东西因为有误修改了一下再提交就说我的博文已有相似的 xff0c 审核不通过 xff0c 不止一次 2 反而好奇有人抄了我的却发出去了 这应该是最后一次在这里发文
  • CMake Error at CMakeLists.txt:11 (find_package): Found package configuration file: /home/luw

    参考资料 xff1a https www cnblogs com newneul p 8364924 html CMake Error at CMakeLists txt 11 find package Found package conf
  • LPC1768学习笔记

    LPC1768学习笔记 xff1a IAP升级 1 需求 xff1a 通过串口给主机升级 xff0c 主机的通信串口与升级串口相同 2 方法 xff1a 要完成APP与IAP程序的切换判断 xff0c 我们需要一个flag update单独
  • 手把手教你如何实现一个简单的数据加密算法

    0 前言 之前写过一篇关于MD5摘要算法的文章 xff0c 很多老铁说能否出一篇关于加密的文章吗 xff1f C语言实现MD5 xff0c 竟如此简单 xff01 一口君的字典里没有 34 不行 34 这两个字 xff01 必须安排 xff
  • python压缩包安装方式

    下载压缩包 从python官网下载embed package xff08 嵌入式包 xff09 解压并进入到解压目录 xff0c 看到python exe为止 下载pip依赖 下载https bootstrap pypa io get pi
  • setup写在script标签中

    快捷键 vb3s 父组件 xff1a span class token tag span class token tag span class token punctuation lt span template span span cla
  • Ubuntu20.04开启SSH连接filezilla的教程【仅供参考】

    前提 xff1a 本人初学者 xff0c 想用filezilla xff08 去官网下载即可 xff09 实现Ubuntu与windows之间的文件传输 xff0c 没想到在开启SSH时遇到了好多坑 xff0c 最后虽解决了问题 xff0c
  • systemverilog学习 --- DPI和结构体(语法完结)

    DPI systemverilog提供DPI xff08 Direct Programming Interface xff09 xff0c 这是一个直接编程接口 xff0c 可以使得SV和其它的外部语言进行交互 xff0c 外部的语言包括C
  • CentOS下搭建Nginx服务器

    目录 一 CentOS系统及Nginx服务器的介绍1 CentOS系统2 Nginx服务器 二 Xshell与Xftp1 Xshell与Xftp的作用2 获取Xshell与Xftp3 Xshell的安装与使用4 Xftp的安装与使用 三 安
  • PyCharm敲代码光标变黑框

    出现的问题 xff1a 敲代码时出现光标变黑框问题 该模式下难以进行删除操作 xff0c 会对黑框内容进行替换 xff0c 不习惯这种模式的人很难适应 问题出现原因 xff1a 误触Insert键 解决方案 xff1a 再点击一次Inser
  • 关闭(取消)conda命令行提示符base的解决方案——关闭conda的环境名提示(转载——实操好用)

    今天第一次玩 Python xff0c 当装完 conda 后 xff0c 命令行提示符前就多一个极不搭调 base 字符 xff1b 一直追求完美的我是绝对不会允许这种事情发生的 xff1b 于是就开始了探索之旅 xff1b 先是上网上找
  • java编译出现——错误: 非法字符: ‘\uff1b‘ 的解决方法

    将该行代码中文分号改为英文分号 xff1b
  • 函数的定义和调用

    1 函数 xff1a 函数就是可以重复使用的代码块 xff0c 使用关键字function定义函数 2 函数调用 xff1a 函数调用就是函数名加小括号 xff0c 比如 xff1a 函数名 xff08 参数 参数可选 xff09 3 定义
  • Ubuntu下无法输入中文问题解决

    1 首先先下载一个中文输入法包 xff0c 例如搜狗输入法 官网 xff1a 搜狗输入法 for linux 例如下载的包是 xff1a sogoupinyin 2 4 0 3469 amd64 deb 2 xff0c 安装搜狗命令 xff

随机推荐