#ifndef _IOSTRUCT_H
#define _IOSTRUCT_H
#include "stm32f10x.h"
class IO_InitTypeDefStruct
{
public:
IO_InitTypeDefStruct(void (*IO_Init)(void),void (*IO_put_c)(uint8_t),uint8_t (*IO_get_c)(void));
void Init_IO(void);
void Send_Char(const uint8_t ch);
void Send_String(const uint8_t *Str );
void Send_Num(const uint32_t Num);
uint8_t Receive_Char(void);
void Receive_String(uint8_t *const Str,uint8_t size);
uint32_t Receive_Num(void);
private:
void (*Init)(void);
void (*put_c)(uint8_t ch);
uint8_t (*get_c)(void);
};
//只要在构造函数中给出 IO的初始化函数的指针,发送一个字节的函数的指针,接受一个字节的函数的指针, 就可以用了,
//无论是LCD UART IIC SPI 等等 都可以用这个类
#endif
#include "IOStruct.h"
#include "stm32f10x.h"
IO_InitTypeDefStruct::IO_InitTypeDefStruct(
void (*IO_Init)(void),
void (*IO_put_c)(uint8_t),
uint8_t (*IO_get_c)(void)
):Init(IO_Init),put_c(IO_put_c),get_c(IO_get_c){
}
void IO_InitTypeDefStruct::Init_IO(void)
{
Init();
}
void IO_InitTypeDefStruct::Send_Char(const uint8_t ch)
{
put_c(ch);
}
void IO_InitTypeDefStruct::Send_String(const uint8_t* Str)
{
while(*Str)
{
put_c(*Str++);
}
}
static uint32_t Ex(uint8_t Num)
{
uint32_t length=1;
if(Num==0)
return 1;
while(Num)
{
Num--;
length*=10;
}
return length;
}
void IO_InitTypeDefStruct::Send_Num(const uint32_t Num)
{
if(Num==0)
{
put_c('0');
return;
}
uint8_t length=1;
uint32_t temp=Num;
while(temp)
{
temp/=10;
length++;
}
temp=Num;
for(uint8_t cnt=0;cnt<length;cnt++)
{
put_c('0'+temp/Ex(length-1-cnt));
temp%=Ex(length-1-cnt);
}
}
uint8_t IO_InitTypeDefStruct::Receive_Char(void)
{
return get_c();
}
void IO_InitTypeDefStruct::Receive_String(uint8_t *const Str,uint8_t size)
{
uint8_t *str=Str;
for(uint8_t cnt=0;cnt<size;cnt++)
{
*str=get_c();
str++;
}
}
uint32_t IO_InitTypeDefStruct::Receive_Num(void)
{
uint32_t Num=0;
for(uint8_t cnt=0;cnt<4;cnt++)
{
Num|=get_c();
Num<<=8;
}
return Num;
}
|