寄存器跑马灯

news/2024/11/24 20:57:01/

之前看的库函数操作的LED灯,和平常调用读卡器无异。这次读下芯片文档,用空工程模板操作寄存器控制LED灯。

VID_20220322_205657

第一次接触寄存器操作,有点烧脑,烧脑过后感觉比库函数操作还清晰些。APB2ENR,CRL,ODR寄存器,很巧妙,也很符合物理常识。
在这里插入图片描述

我这个是STM32 Nano开发板

首先查LED对应的引脚,LED对应的是PC0-PC7,即GPIOC的0-7引脚
在这里插入图片描述

然后查外设时钟寄存器,GPIOC对应的是APB2ENR的第4位,把这个位置设置为1即开启了GPIOC的时钟。
在这里插入图片描述

然后查CRL寄存器文档(端口配置寄存器),LED的端口是0-7对应的低位寄存器CRL,如果是8-15对应CRH寄存器,这里用32位描述8个端口模式。每4位描述一个端口。比如0-3位描述GPIOC-0的输出模式。其中4位的低两位描述输出模式:输出速率。高两位描述推挽输出这些模式。
在这里插入图片描述

然后查询ODR寄存器文档(端口输出数据寄存器),他的32位高16位保留。低16位对应一组GPIO的16个端口。相应位置为1,则相应端口高电平,相应位置为0则相应端口低电平。
在这里插入图片描述

有以上资料的话就可以通过寄存器实现跑马灯了。
1.首先得到板子LED0-7对应的是GPIOC的时钟
2.通过寄存器设置GPIOC时钟对应的位置为1,让时钟开启
3.由于LED在0-7端口,所以通过CRL寄存器设置每个端口的输出模式。LED采用推挽输出模式。
4.通过控制ODR寄存器的响应端口位置的值控制电平高低

代码用到了位移、与、或、非运行,目的都是操作寄存器特定位置的值。

led.h

//定义宏,防止头文件重复引用
#ifndef __LED
#define __LED
//初始化LED的环境
void InitLedEnv(void);
#endif

led.c

#include "led.h"
#include "sys.h"//初始化LED环境
void InitLedEnv(void)
{//设置ABP2外设时钟第4位位1,即可用,对应GPIOC时钟//1<<4:1左移4位位1000,与APB2ENR寄存器值或运算就是第4位设置1,其他不变的意思RCC->APB2ENR|=1<<4;//设置LED0为推挽输出模式//CRL寄存器和十六进制的值且运行,设置指定位置的电平为指定4位位0000GPIOC->CRL&=0XFFFFFFF0;//CRL寄存器和十六进制的值或运算,设置指定位置的电平为指定4位位0011,四位里面高两位00表示通用推挽输出。低两位11表示输出模式,最大速度50MHzGPIOC->CRL|=0X00000003;//依次设置其他7个LED输出空为推挽输出模式//LED1GPIOC->CRL&=0XFFFFFF0F;GPIOC->CRL|=0X00000030;//LED2GPIOC->CRL&=0XFFFFF0FF;GPIOC->CRL|=0X00000300;//LED3GPIOC->CRL&=0XFFFF0FFF;GPIOC->CRL|=0X00003000;//LED4GPIOC->CRL&=0XFFF0FFFF;GPIOC->CRL|=0X00030000;//LED5GPIOC->CRL&=0XFF0FFFFF;GPIOC->CRL|=0X00300000;//LED6GPIOC->CRL&=0XF0FFFFFF;GPIOC->CRL|=0X03000000;//LED7GPIOC->CRL&=0X0FFFFFFF;GPIOC->CRL|=0X30000000;//通过操作ODR寄存器设置每个LED位置为1即高电平,不亮GPIOC->ODR|=1<<0;GPIOC->ODR|=1<<1;GPIOC->ODR|=1<<2;GPIOC->ODR|=1<<3;GPIOC->ODR|=1<<4;GPIOC->ODR|=1<<5;GPIOC->ODR|=1<<6;GPIOC->ODR|=1<<7;}

mian.c

#include "led.h"
#include "delay.h"//zlz第一个寄存器操作的LED灯
int main(void)
{//初始化时钟Stm32_Clock_Init(9);//初始化延时函数delay_init(72);	 //初始化LED灯InitLedEnv();	//当前该点亮的LED索引int curIndex=0;	//死循环while(1){//改版为点亮所以led做跑马灯for(int i=0;i<8;i++){//当前该亮的灯点亮if(i==curIndex){//1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算//第3位电平设置低,其他不变GPIOC->ODR&=~(1<<i);}//其他熄灭else{//1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算//第3位电平设置高,其他不变GPIOC->ODR|=1<<i;}}//下次点亮下一个灯curIndex++;//8个灯取余数curIndex=curIndex%8;//延迟半秒delay_ms(500); }
}

编译后下载到板子运行的效果就是8个灯轮流亮的跑马灯效果。


http://www.ppmy.cn/news/847996.html

相关文章

代码 动态 设置 跑马灯

代码设置跑马灯&#xff0c;直接上代码 mTitleTv.setMarqueeRepeatLimit(Integer.MAX_VALUE);mTitleTv.setFocusable(true);mTitleTv.setEllipsize(TextUtils.TruncateAt.MARQUEE);mTitleTv.setSingleLine();mTitleTv.setFocusableInTouchMode(true);mTitleTv.setHorizontallyS…

跑马灯源代码

希望对小白有作用&#xff1a;首先献上资料&#xff1a; arqueeRepeatLimit属性是文字滚动起来http://xlover.iteye.com/blog/1443280 android:ellipsiz属性&#xff1a;省略文字http://www.ablanxue.com/prone_9786_1.html 自定义组件http://www.android100.org/html/201506/2…

html跑马灯走马灯效果

演示 <marquee width"100%" scrollamount"5"> <a href"http://www.taobaojp5.tk"><font face"楷体_GB2312" color"#ff0000" size"3"></font><strong>带有超链接的跑马灯!点我试试&…

html制作跑马灯

在body内输入以下内容 <marquee>输入内容 </marquee> 在head内写个style <style>marquee{width:200px;height:200px;bgcolor:red;} </style> 这样简单的跑马灯就出来了。 一下内容要添加在marquee标签内&#xff1a; 指定跑马灯的方向是向上的&am…

第一个跑马灯程序

最近准备转行做嵌入式&#xff0c;随弄来一块S3C44B0X的板子&#xff0c;准备好好研究一下。 板子便宜货&#xff0c;没啥特别完善的资料&#xff0c;都是和网上差不多的ADS环境。 因为平时还要上班&#xff0c;花了几个晚上的时间&#xff0c;总算是把u-boot和uClinux的编译和…

单片机跑马灯源代码+仿真

源代码&#xff1a; #include<reg52.h> //库文件 #define uchar unsigned char//宏定义无符号字符型 #define uint unsigned int //宏定义无符号整型 /********************************************************************初始定义 **********************…

跑马灯效果的代码

http://www.htmleaf.com/jQuery/Text-Link-Effects/201505221881.html

学无止境·MySQL⑦(索引和视图)

索引和视图练习 索引练习1、建立一个utf8编码的数据库test12、建立商品表goods和栏目表category3、删除 goods 表中的 goods_desc 字段及货号字段,并增加 click_count 字段4、在 goods_name 列上加唯一性索引&#xff08;用alter table方式&#xff09;5、在 shop_price 列上加…