4942|8

25

帖子

3

TA的资源

一粒金砂(中级)

楼主
 

ATmega16a 芯片端口相关操作的库封装 [复制链接]

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

最新回复

学习了............  详情 回复 发表于 2016-7-6 20:19

赞赏

1

查看全部赞赏

点赞 关注
 

回复
举报

1万

帖子

25

TA的资源

版主

推荐
 
WKfirst 发表于 2015-5-21 11:24
我用的开发环境是 IAR,也是刚开始使用这个开发平台!还不是太清楚里面有自带的封装库。谢谢~~

在ASF中,IO可以这样用,也比较方便:

//定义IO
#define SCK                IOPORT_CREATE_PIN(PORTB, PORTB5)

//设置输出模式
ioport_configure_pin(SCK, IOPORT_DIR_OUTPUT|IOPORT_INIT_LOW);
//翻转输出

ioport_set_pin_level(SCK, !ioport_get_pin_level(SCK));

其它模块也有类似用法。

点评

两种方式都不错,不过 “#define SCK IOPORT_CREATE_PIN(PORTB, PORTB5)” 这种的话引脚过于单一了,如果要改的话得到宏定义那里改 “#define WK_SetOut(DDRx) (DDRx = 0xf  详情 回复 发表于 2015-5-23 09:25
 
 
 

回复

994

帖子

3

TA的资源

一粒金砂(高级)

沙发
 
嗯,基础很重要
 
 
 

回复

1万

帖子

25

TA的资源

版主

板凳
 
其实avrgcc已经不少这样的定义了。还有avr的lib,以及asf。

点评

我用的开发环境是 IAR,也是刚开始使用这个开发平台!还不是太清楚里面有自带的封装库。谢谢~~  详情 回复 发表于 2015-5-21 11:24
 
 
 

回复

25

帖子

3

TA的资源

一粒金砂(中级)

4
 
dcexpert 发表于 2015-5-20 21:39
其实avrgcc已经不少这样的定义了。还有avr的lib,以及asf。

我用的开发环境是 IAR,也是刚开始使用这个开发平台!还不是太清楚里面有自带的封装库。谢谢~~

点评

在ASF中,IO可以这样用,也比较方便: #define SCK IOPORT_CREATE_PIN(PORTB, PORTB5) ioport_configure_pin(SCK, IOPORT_DIR_OUTPUT|IOPORT_INIT_LOW); ioport_set_  详情 回复 发表于 2015-5-21 11:58
 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

6
 
赞一个,期待楼主的更多分享哦
 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

7
 
本帖最后由 dj狂人 于 2015-5-23 15:20 编辑
dcexpert 发表于 2015-5-21 11:58
在ASF中,IO可以这样用,也比较方便:

//定义IO
#define SCK                IOPORT_CREATE_PIN(PORTB, PORTB5)

//设置输出模式
ioport_configure_pin(SCK, IOPORT_DIR_OUTPUT|IOPORT_INIT_LOW);
//翻转输出

ioport_set_pin_level(SCK, !ioport_get_pin_level(SCK));

其它模块也有类似用法。

两种方式都不错,不过

“#define SCK                IOPORT_CREATE_PIN(PORTB, PORTB5)”  这种的话引脚过于单一了,如果要改的话得到宏定义那里改

“#define WK_SetOut(DDRx)               (DDRx = 0xff)”    像这种的话可以面对一组 I/O ,比如WK_SetOut(0) 是设置引脚0,WK_SetOu(1) 是设置引脚1

个人还是比较喜欢后面这种风格的

点评

嗯,对于编程来说,重要的是找到自己用着比较方便的方式,希望以后多多交流~~~  详情 回复 发表于 2015-5-23 13:17
 
 
 

回复

25

帖子

3

TA的资源

一粒金砂(中级)

8
 
dj狂人 发表于 2015-5-23 09:25
两种方式都不错,不过

“#define SCK                IOPORT_CREATE_PIN(PORTB, PORTB5)”  这种的话引脚过于单一了,如果要改的话得到宏定义那里改

“#define WK_SetOut(DDRx)               (DDRx = 0xff)”    像这种的话可以面对一组 I/O ,比如WK_SetOut(0) 是设置引脚0,WK_SetOu(1) 是设置引脚1

个人还死比较喜欢后面这种风格的

嗯,对于编程来说,重要的是找到自己用着比较方便的方式,希望以后多多交流~~~


 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

9
 
学习了............
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表