AVR与STC等一些不跑操作系统的单片机,我们要想对其进行编程,首先需要了解其内部寄存器的配置,例如:做串口通信时,需要了解串口波特率、字长、校验位等相关信息的寄存器配置。芯片中各个寄存器所代表的信息不要求你能背下来,只需要你能理解,当用其做项目时,你只需要会查芯片手册进行配置就行了!但如果这样的话,每次做项目时,你都需要查阅相关的文档。虽然这样能帮助你熟悉单片机的寄存器配置,但这样重复的劳动难免让人不痛快!
最近用 ATmega16A芯片做个几个项目,于是就想着能不能把针对这款芯片相关寄存器的配置封装成一个库,这样一来进行项目开发时就减少查阅芯片手册的次数了,只需要理解相关函数就行了!
不足之处,请多多批评!!!
要进行端口的相关操作,首先需要指定端口的方向(输入或输出),例:
要指定某个端口为输出端口,可以这样写:DDRx = 0xff. (x = A、B、C、D等);
设置某个端口的所有位为高电平,可以为:PORTx = 0xFF(x = A、B、C、D等)。
设置某个端口的位4为输出:DDRx |= 0x10;
设置某个端口的位3为高电平:PORTx |= 0x08。
如此这样操作,不能说有多么麻烦,但我们可以换一种思路。
指定某个端口为输出端口:WK_SetOut(DDRx);
指定某个端口位为输出:WK_SetBitOut(DDRx, BITn);
设置某个端口位1、位2为高电平:WK_SetBits(PORTn, BIT1 | BIT2);
设置某个端口的位2、位3为低电平:WK_ResetBits(PORTn,BIT2 | BIT3);
不敢说那种方式好,贴下代码仅供参考!!!
#ifndef __AVR_PORT_H__
#define __AVR_PORT_H__
#include "iom16.h"
#define BIT0 0x01 // 端口 0
#define BIT1 0x02 // 端口 1
#define BIT2 0x04
#define BIT3 0x08
#define BIT4 0x10
#define BIT5 0x20
#define BIT6 0x40
#define BIT7 0x80
#define BIT 0xff // 所有端口
#define WK_SetOut(DDRx) (DDRx = 0xff) // 设置整个端口为输出
#define WK_SetIn(DDRx) (DDRx = 0x00) // 设置整个端口为输入
#define WK_SetBitOut(DDRx, BITn) (DDRx |= BITn) // 设置某个端口的位为输出
#define WK_SetBitIn(DDRx, BITn) (DDRx &= ~BITn) // 设置整个端口的位为输入
#define WK_SetBits(PORTx, BITn) (PORTx |= BITn) // 设置某个端口的位为 高电平
#define WK_ResetBits(PORTx, BITn) (PORTx &= ~BITn) // 设置某个端口的位为 低电平
#define WK_TakeBackBits(PORTx, BITn) (PORTx ^= BITn) // 某个端口的位 电平值取反
#define WK_ReadBits(PINx, BITn) (return (PINx & BITn)) // 读取某个位的电平值
#define WK_SetPort(PORTx, data) (PORTx = data) // 设置某个端口的值
#endif
|