闲来没事,将自己以前学习AVR单片机的一些笔记给大家整理出来,方便大家来一起学习。也争取每周能整理几篇出来。
此处我使用的单片机是AVR系列的,芯片为Atmega328p,具体资源请查看官网上的该芯片的datasheet。
好的,闲话就不说了,直接上正题,对于单片机来说,可能对io口的操作是最基本的能力了。
首先我们来看一下位的操作
按位或
其实就是置位
例如:PORTA |= 0x80;
只要有一个为1就为1了,是不是最高位置位了
按位取反
其实就是清位
例如:PORTA &= ~0x80;
两个全为1才为1 ,是不是最高位清位了
按位异或
其实就是实现位的翻转
例子:PORTA ^= 0x80
相同为0,不同为1, 是不是最高位翻转了
按位与
其实可以用来检测某一位是不是为1
例子:if(PINA & 0x80)
就可以用来检测PA.7是不是为1了
下面来看几个简单的程序例子:
哦,在写demo程序之前,可能还需要来讲一点别的,
我用的开发环境时winavr,然后使用usbasp将hex烧写进板子里面,不同的开发环境,可能使用的头文件有一些出入,后期我可能只展示一些核心代码了。
可能还要讲一下控制io的寄存器
atmega328p 这个mcu的io口都是标准的双向口,这个和51是有区别的。
在复位时,所有的端口都是高阻态,啥是高阻态,不知道可以度娘了。
每一个端口,都对应3个寄存器,分别是:DDRx PORTx PINx
来看看这三个寄存器的控制作用:
DDR : 选择引脚是输入还是输出
PORT : 当io口是输入的时候,它控制有无上拉电阻,当io口是输出的时候,它控制的输出的电平情况。
PIN :读管脚的电平
总结一下:io口初始化三部曲:
使用DDR来设置端口是输入还是输入
要是输出的话,使用PORT来设置输出的是高电平还是低电平
要是输入的话,使用PINx来读取管脚的输入值,同时可使用PORT来设置管脚是不是有上来电阻。不清楚上、下拉电阻的,以后我再出一个教程。