前言
大家应该使用过很多IO模拟的协议常见的有SPI、IIC,也有些不常见的比如8080,但是一般8080端口的模拟的协议中,传送并口数据的都是连续的IO口,例如从A0-A7,8个连续的IO口,但是连线真的烦,还有就是布线的时候更烦,那么为啥不把这8个IO口也模拟一下呢????
原理
说道这个原理那确实是很简单的,例如PA=0xffff,就学那相当于把它的IO口全部置1,所以我们可以按照这个特性来模拟它,也就是按照16进制数的每一个位的高低来依次将指定的IO口置0或者1。
代码实现
#include “parallel_soft.h”
//全局IO并口数组
struct pin_info_s pin_ary[IO_ARY_LEN];
int parallel_i;
GPIO_type GPIO_info[IO_ARY_LEN]=
{
GPIOA,
GPIOA,
GPIOA,
GPIOA,
GPIOA,
GPIOA,
GPIOA,
GPIOA
};//GPIO_x
GPIO_PIN_type GPIO_PIN_info[IO_ARY_LEN]=
{
GPIO_Pin_0,
GPIO_Pin_1,
GPIO_Pin_2,
GPIO_Pin_3,
GPIO_Pin_4,
GPIO_Pin_5,
GPIO_Pin_6,
GPIO_Pin_7
}; //GPIO_PIN
/*
硬件初始化IO
*/
void Init_Config_IO()
{
//printf(“硬件初始化OKrn”);
}
void Init_IO()
{
int i;
/*需要先初始化每一个IO口*/
Init_Config_IO();
/*初始化模拟并口,可定义所有IO口的顺序*/
for (i = 0; i 《 IO_ARY_LEN; i++)
{
GPIO(i) = GPIO_info[i];
GPIO_PIN(i) = GPIO_PIN_info[i];
}
}
#ifndef __PARALLEL_SOFT_H
#define __PARALLEL_SOFT_H
/*所需包含的头文件,一般为gpio相关的*/
#include “stm32f10x_gpio.h”
/*并口长度,可以为 8 16,只需要修改为对应的线数即可*/
#define IO_ARY_LEN 8 //8 16
/*定义GPIO相关的类型方便修改*/
#define GPIO_type GPIO_TypeDef*
#define GPIO_PIN_type uint16_t
/*配置高低电平函数,建议使用寄存器*/
#define HIGHT_level(GPIOx,GPIO_Pin) GPIOx-》BSRR = GPIO_Pin//高电平
#define LOW_level(GPIOx,GPIO_Pin) GPIOx-》BRR = GPIO_Pin//低电平
struct pin_info_s
{
GPIO_type GPIO_x;
GPIO_PIN_type GPIO_PIN_x;
};
#define GPIO(i) pin_ary[i].GPIO_x
#define GPIO_PIN(i) pin_ary[i].GPIO_PIN_x
#define BIT(num, n) ((num & (1 《《 n)) 》 0) // 直接用一个宏就行了(兼容8位16位)
extern int parallel_i;//数组循环变量
#define parallel_write_data(data) for (parallel_i = 0; parallel_i 《 IO_ARY_LEN; parallel_i++)
{
if (BIT(data, parallel_i))
HIGHT_level(GPIO(parallel_i), GPIO_PIN(parallel_i));
else
LOW_level(GPIO(parallel_i), GPIO_PIN(parallel_i));
}
extern void Init_IO(void);
extern struct pin_info_s pin_ary[IO_ARY_LEN];
#endif
以上就是C、H文件了。
使用方法
使用方法很简单,
(1)需要先将H文件中的
#ifndef __PARALLEL_SOFT_H
#define __PARALLEL_SOFT_H
/*所需包含的头文件,一般为gpio相关的*/
#include “stm32f10x_gpio.h”
/*并口长度,可以为 8 16,只需要修改为对应的线数即可*/
#define IO_ARY_LEN 8 //8 16
/*定义GPIO相关的类型方便修改*/
#define GPIO_type GPIO_TypeDef*
#define GPIO_PIN_type uint16_t
/*配置高低电平函数,建议使用寄存器*/
#define HIGHT_level(GPIOx,GPIO_Pin) GPIOx-》BSRR = GPIO_Pin//高电平
#define LOW_level(GPIOx,GPIO_Pin) GPIOx-》BRR = GPIO_Pin//低电平
需要修改相应的头文件,GPIO 定义类型,不同的单片机是不一样的,这里使用stm32做例子的,还需要修改 对IO口拉高拉低的宏定义。
修改完以上的就OK了。
(2)初始化
初始化的时候需要先将所用的IO口
GPIO_type GPIO_info[IO_ARY_LEN]=
{
GPIOA,
GPIOA,
GPIOA,
GPIOA,
GPIOA,
GPIOA,
GPIOA,
GPIOA
};//GPIO_x
GPIO_PIN_type GPIO_PIN_info[IO_ARY_LEN]=
{
GPIO_Pin_0,
GPIO_Pin_1,
GPIO_Pin_2,
GPIO_Pin_3,
GPIO_Pin_4,
GPIO_Pin_5,
GPIO_Pin_6,
GPIO_Pin_7
}; //GPIO_PIN
对应的填在这里就好。
最重要的是需要按照使用的单片机初始化IO口的方式先将数组里面的IO口全部初始化一边。不初始化是不能用的(相关的可以看代码注释。)
前言
大家应该使用过很多IO模拟的协议常见的有SPI、IIC,也有些不常见的比如8080,但是一般8080端口的模拟的协议中,传送并口数据的都是连续的IO口,例如从A0-A7,8个连续的IO口,但是连线真的烦,还有就是布线的时候更烦,那么为啥不把这8个IO口也模拟一下呢????
原理
说道这个原理那确实是很简单的,例如PA=0xffff,就学那相当于把它的IO口全部置1,所以我们可以按照这个特性来模拟它,也就是按照16进制数的每一个位的高低来依次将指定的IO口置0或者1。
代码实现
#include “parallel_soft.h”
//全局IO并口数组
struct pin_info_s pin_ary[IO_ARY_LEN];
int parallel_i;
GPIO_type GPIO_info[IO_ARY_LEN]=
{
GPIOA,
GPIOA,
GPIOA,
GPIOA,
GPIOA,
GPIOA,
GPIOA,
GPIOA
};//GPIO_x
GPIO_PIN_type GPIO_PIN_info[IO_ARY_LEN]=
{
GPIO_Pin_0,
GPIO_Pin_1,
GPIO_Pin_2,
GPIO_Pin_3,
GPIO_Pin_4,
GPIO_Pin_5,
GPIO_Pin_6,
GPIO_Pin_7
}; //GPIO_PIN
/*
硬件初始化IO
*/
void Init_Config_IO()
{
//printf(“硬件初始化OKrn”);
}
void Init_IO()
{
int i;
/*需要先初始化每一个IO口*/
Init_Config_IO();
/*初始化模拟并口,可定义所有IO口的顺序*/
for (i = 0; i 《 IO_ARY_LEN; i++)
{
GPIO(i) = GPIO_info[i];
GPIO_PIN(i) = GPIO_PIN_info[i];
}
}
#ifndef __PARALLEL_SOFT_H
#define __PARALLEL_SOFT_H
/*所需包含的头文件,一般为gpio相关的*/
#include “stm32f10x_gpio.h”
/*并口长度,可以为 8 16,只需要修改为对应的线数即可*/
#define IO_ARY_LEN 8 //8 16
/*定义GPIO相关的类型方便修改*/
#define GPIO_type GPIO_TypeDef*
#define GPIO_PIN_type uint16_t
/*配置高低电平函数,建议使用寄存器*/
#define HIGHT_level(GPIOx,GPIO_Pin) GPIOx-》BSRR = GPIO_Pin//高电平
#define LOW_level(GPIOx,GPIO_Pin) GPIOx-》BRR = GPIO_Pin//低电平
struct pin_info_s
{
GPIO_type GPIO_x;
GPIO_PIN_type GPIO_PIN_x;
};
#define GPIO(i) pin_ary[i].GPIO_x
#define GPIO_PIN(i) pin_ary[i].GPIO_PIN_x
#define BIT(num, n) ((num & (1 《《 n)) 》 0) // 直接用一个宏就行了(兼容8位16位)
extern int parallel_i;//数组循环变量
#define parallel_write_data(data) for (parallel_i = 0; parallel_i 《 IO_ARY_LEN; parallel_i++)
{
if (BIT(data, parallel_i))
HIGHT_level(GPIO(parallel_i), GPIO_PIN(parallel_i));
else
LOW_level(GPIO(parallel_i), GPIO_PIN(parallel_i));
}
extern void Init_IO(void);
extern struct pin_info_s pin_ary[IO_ARY_LEN];
#endif
以上就是C、H文件了。
使用方法
使用方法很简单,
(1)需要先将H文件中的
#ifndef __PARALLEL_SOFT_H
#define __PARALLEL_SOFT_H
/*所需包含的头文件,一般为gpio相关的*/
#include “stm32f10x_gpio.h”
/*并口长度,可以为 8 16,只需要修改为对应的线数即可*/
#define IO_ARY_LEN 8 //8 16
/*定义GPIO相关的类型方便修改*/
#define GPIO_type GPIO_TypeDef*
#define GPIO_PIN_type uint16_t
/*配置高低电平函数,建议使用寄存器*/
#define HIGHT_level(GPIOx,GPIO_Pin) GPIOx-》BSRR = GPIO_Pin//高电平
#define LOW_level(GPIOx,GPIO_Pin) GPIOx-》BRR = GPIO_Pin//低电平
需要修改相应的头文件,GPIO 定义类型,不同的单片机是不一样的,这里使用stm32做例子的,还需要修改 对IO口拉高拉低的宏定义。
修改完以上的就OK了。
(2)初始化
初始化的时候需要先将所用的IO口
GPIO_type GPIO_info[IO_ARY_LEN]=
{
GPIOA,
GPIOA,
GPIOA,
GPIOA,
GPIOA,
GPIOA,
GPIOA,
GPIOA
};//GPIO_x
GPIO_PIN_type GPIO_PIN_info[IO_ARY_LEN]=
{
GPIO_Pin_0,
GPIO_Pin_1,
GPIO_Pin_2,
GPIO_Pin_3,
GPIO_Pin_4,
GPIO_Pin_5,
GPIO_Pin_6,
GPIO_Pin_7
}; //GPIO_PIN
对应的填在这里就好。
最重要的是需要按照使用的单片机初始化IO口的方式先将数组里面的IO口全部初始化一边。不初始化是不能用的(相关的可以看代码注释。)
举报