1、单片机寄存器就是单片机片内存储器(片内RAM)一部分,每一个都有地址。只不过这几个寄存器有特殊的作用,比如指令:MUL AB,这条指令用到两个寄存器A,B进行乘法,结果存到BA里面,这条指令必须用这两个寄存器。
2、单片机寄存器其实就相当于一个变量,只不过这个变量在固定的地址,有一个特殊的名称(当然也不强制)。
寄存器是单片机内部的基本存储单元, 由触发器构成, 一个触发器就是1位寄存器。图1-15所示是一种由D触发器构成的4位寄存器
触发器是一种具有记忆存储功能的电路, 由门电路组成。 常见的触发器包括: RS 触发器、 D 触发器和 JK触发器等, 其中D触发器最为常用。 D触发器的逻辑符号如图1-14所示
1 .可以对寄存器中的数据进行算术运算和逻辑运算。
2 .寄存器内保存的地址可用于存储器所在的位置,即寻址。
3 .可用于向电脑读写数据的外围设备。
1、并行方式
将凡位二进制数一次存人寄存器或从寄存器中读出的方式。将n位二进制数以每次l位,分成n次存人寄存器并从寄存器读出。并行方式只需一个时钟脉冲就可以完成数据操作,工作速度快,但需要n根输入和输出数据线。
2、串行方式
数码从一个输入端逐位输入到寄存器中。要使用几个时钟脉冲完成输入或输出操作,工作速度慢,但只需要一根输入或输出数据线,传输线少,适用于远距离传输。
寄存器单片机寄存器就是单片机片内存储器(片内RAM)一部分,每一个都有地址。参考下存储器就知道寄存器是啥了,存储器介绍https://editor.csdn.net/md/?articleId=128726818
寄存器的每一位都可以控制硬件的变化(高低电平、开关断通,通道选择或者数据寄存),寄存器相当于cpu和硬件的桥梁,cpu通过寄存器来控制硬件,
oid Delay(unsigned int Time) while(Time --) ) #define GPX2C0N (*(unsigned int*)0x11000c40) #define GPX2DAT (*(unsigned int*)0x11000c44) int main() { GPX2C0N =0x10000000; whtle(1) { GPX2DAT =0x80;//转换成16进制 Delay(1000000); GPX2DAT =0x00; Delay(1000000); } Return 0; }
最一般的实现跑马灯的电路如下
四个GPIO口与电阻和LED灯连接,共同连接在接地端。
如果想实现1亮234灭,2亮134灭,类似这样的跑马灯功能,该如何实现呢?
如果是我来做这些事,首先我会把第一个电路接在VCC上,然后其他电路都接在地上,这样一路电路有了压降LED亮了,其他没有,就灭了,然后我再把一路接地,二路接VCC,就实现了一个跑马灯的动画效果。
好像下图这样
但是这样好麻烦,我不想一直不断的机械做这些事,可以花更多的时间在散步读书上才对。
所以我特别希望改进这个电路,仔细观察,找到规律
如果用1 代表导线接入VCC , 用0代表接地,那么顺序应该是
1000 -> 0100 -> 0010 -> 0001 ->1000
能不能有什么设备帮助我们换连导线呢?
这里有两个思路,第一个使用经典的数字电路,移位寄存器,用逻辑门啥的,在时钟信号的驱动下帮我们切换导线连接方法。
那么第二个思路就是用单片机啦!单片机那可比简单的数字电路厉害多了。
单片机的GPIO设备有好几种工作方式,按照其工作的特点来看可以分为 输出/输入两种模式。
当我们需要单片机去感应外部电平的时候,我们会把它设置在输入模式,当然现在在我们希望他能输出特定的电压,所以设置他为输出模式。
单片机是一个大黑盒子,里面的原理很深奥很复杂,但是幸运的是,设计单片机的人,给我们提出了寄存器的概念,这样我们就不需要理解复杂的电路原理,就可以完成特定的功能操作了!
例如,选择GPIO口为输出还是输入,其切换电路可以抽象成这样
值得高兴的是在GPIO一系列的寄存器里,我找到了切换输出电平的寄存器 P0OUT寄存器,我抽象的思考这样寄存器应该是这样的。
于是我惊喜的发现,单片机可以帮助我实现切换导线连接这样的事情。
于是我用了MSP430单片机,把P0.0 P0.1 P0.2 P0.3 接在了上述的电路上。
写下了这样的C代码
int main(void){ unsigned char led_flash_pos=0x01; Basic_init(); //基础配置 P0SEL = 0x0f;//确保P0SEL寄存器低四位是1,使得硬件电路与输出相关电路相连 Loop: if(led_flash_pos == 0x10) led_flash_pos = 0x01; //限制左移范围 P0OUT = led_flash_pos; DELAY_S(1); // 延时1S让眼睛看到现象 led_flash_pos <<= 1; //计算机算法,左移操作 goto Loop;//跳转 循环 }
可以有非常花哨的写法,但是最底层的操作就是配置P0OUT这个寄存器,单片机编程所有对硬件的操作都是对寄存器的操作,我们无需对底层硬件有太多深奥的理解,就可以完成操作!
作者思考:
分工的时代,如果认真深入的去了解学习单片机最底层的硬件原理的话,那会消耗大量的时间和精力,成为一名优秀的软件开发工程师的话,对底层硬件有一定的理解就好,更多精力花费在对代码数据结构,算法的优化,例如对P0OUT这个寄存器,何时写他,怎么写他,写多少比较合适,这都是需要考虑的事情,还有就是延时的时间是否过长,用定时器延时比较好,还是用阻塞延时比较好?另外,怎样的跑马灯动画更好看?很多可以编程的花样!
记得笔者第一次跑起跑马灯程序,兴奋的写了好多衍生代码,例如隔着一个灯闪烁,快速闪烁,等等,好像往你手上塞了好多好多乐高积木(寄存器),你可以任意的搭接,描绘出自己心中完美的模样!
参考文章
如有侵权,请联系作者删除。
联系客服