[STM8] I/O输出寄存器的位操作

[复制链接]
1950|14
 楼主| xwh7010 发表于 2014-9-30 13:42 | 显示全部楼层 |阅读模式
songchenping 发表于 2014-9-30 14:14 | 显示全部楼层
你可以看一下,库里面有专门位操作的函数呢。
 楼主| xwh7010 发表于 2014-9-30 14:20 | 显示全部楼层
songchenping 发表于 2014-9-30 14:14
你可以看一下,库里面有专门位操作的函数呢。

我想单个操作位  不想用函数
 楼主| xwh7010 发表于 2014-9-30 14:21 | 显示全部楼层
songchenping 发表于 2014-9-30 14:14
你可以看一下,库里面有专门位操作的函数呢。

我想单独操作位  不想用库函数   跟51这种 sbit xx=P1^1
hopewise 发表于 2014-9-30 14:44 | 显示全部楼层
#include "stm8s005k6.h"

/*************IO口定义*************/
_Bool time_add_key       @PD_IDR:7;     //40K时间+按键引脚
/*************变量定义*************/
typedef unsigned char uchar;
typedef unsigned int  uint;
_Bool   f_buzon=0;                //蜂鸣器响的标志位

 楼主| xwh7010 发表于 2014-9-30 14:45 | 显示全部楼层
hopewise 发表于 2014-9-30 14:44
#include "stm8s005k6.h"

/*************IO口定义*************/

我用的是IAR 编译器
Leeone 发表于 2014-9-30 15:06 | 显示全部楼层
xwh7010 发表于 2014-9-30 14:21
我想单独操作位  不想用库函数   跟51这种 sbit xx=P1^1

你看下位带操作,应该是你想要的,cortex-m3手册中有详细介绍
myxiaonia 发表于 2014-9-30 16:00 | 显示全部楼层
用bsrr和brr寄存器,手册里推荐用这个
lyc613 发表于 2014-9-30 17:56 | 显示全部楼层
看这里
//------初始化------
PA_DDR|=0x40;//控制方向
PA_CR1|=0x40;//CR1 CR2控制输出模式
//---------------------
用的时候直接
//-----
#define RD      PC_ODR_ODR1
#define WR      PE_ODR_ODR5
#define DATA    PC_ODR_ODR2

这种操作方式和51一样.







zh113214 发表于 2014-9-30 19:04 | 显示全部楼层
我想问一下楼主问的是什么问题!!
Q3698741 发表于 2014-9-30 20:02 | 显示全部楼层
本帖最后由 Q3698741 于 2014-9-30 20:05 编辑

LZ一定是想要这样的
比如PA.0脚输入或输出直接写成 PAout(0)   PAin(0)

这个用位绑定可以实现



#include "stm32f10x.h"

//位绑定操作开始
#define GPIOA_ODR_ADDR (GPIOA_BASE + 0x0C)  //0x0C是ODR的地址偏移,见数据手册,GPIOA_BASE在头文件里
#define GPIOA_IDR_ADDR (GPIOA_BASE + 0x08)    //0x08是IDR的地址偏移
#define GPIOB_ODR_ADDR (GPIOB_BASE + 0x0C)  //0x0C是ODR的地址偏移,见数据手册
#define GPIOB_IDR_ADDR (GPIOB_BASE + 0x08)    //0x08是IDR的地址偏移
//....PC  PD PE  PF IO都按此操作

#define BitBand(Addr,BitNum)  *(volatile unsigned long *)(( Addr & 0xF0000000) + 0x02000000 + ((Addr & 0xFFFFF)<<5) + ( BitNum << 2) )

#define PAout(n)   BitBand(GPIOA_ODR_ADDR,n)
#define PAin(n)    BitBand(GPIOA_IDR_ADDR,n)

#define PBout(n)   BitBand(GPIOB_ODR_ADDR,n)
#define PBin(n)    BitBand(GPIOB_IDR_ADDR,n)


//位绑定结束,如要绑定其他IO口,只需把GPIOA换成GPIOB  GPIOC.....GPIOF即可,n(0~31)表示第几个IO

int main(void)
{
   //之前要对GPIO的输入输出定义
    GPIOA ->CRL = 0xC3; //这里的C是把PA.1当输入, 3是把PA.0当输出,CRL控制PA.0-PA.7脚
    GPIOA ->CRH = 0xC3; //这里的C是把PA.1当输入, 3是把PA.0当输出,CRH控制PA.8-PA.15脚
    //这里定义要是不明白,那就要好好看数据手册了

    PAout(0)=1;  //GPIOA  0 脚输出高电平,这里和C51差不多,sbit xx=P1^1   , xx=1
    PAin(1)=1;   // GPIOA  1 脚输入高电平

    returned(1);
}


mmuuss586 发表于 2014-9-30 20:53 | 显示全部楼层
楼上的方法不错
aleckleo 发表于 2014-9-30 22:06 | 显示全部楼层
调用函数吧,函数很方便‘
a2b3c4ddd 发表于 2014-10-10 20:53 | 显示全部楼层
直接拿IAR  或是 STVD 的头文件   都是结构体或是联合体方式  并将已经将各定义定位到了相应的寄存器地址
学生0时代 发表于 2014-10-14 15:37 | 显示全部楼层
手册里都有啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

51

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部