MiniSTM32函数

1、按键控制函数

#include "stm32f10x.h"

#define KEY_ON  0
#define KEY_OFF 1

static void KeyDelay( uint32_t nCounter ) // 延时函数
{
    while ( nCounter-- );
}

void ConfigKey( void ) // 按键的配置
{
    GPIO_InitTypeDef GPIO_InitStructure;   // 定义初始化端口的结构体变量
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); // 开启GPIOA的时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; // 管脚15

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //浮空输入
    GPIO_Init( GPIOA, &GPIO_InitStructure ); // 调用库函数初始化引脚
}

uint8_t KeyScan( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin_x )
{
    if ( GPIO_ReadInputDataBit( GPIOx, GPIO_Pin_x ) == KEY_ON )  // 检测是否有按键按下
    {
        KeyDelay(0x57E40); // 延时消抖
        if ( GPIO_ReadInputDataBit( GPIOx, GPIO_Pin_x ) == KEY_ON )
        {
            while ( GPIO_ReadInputDataBit( GPIOx, GPIO_Pin_x ) == KEY_ON );  // 等待按键释放
            return KEY_ON;
        }
        else
        {
            return KEY_OFF;
        }
    }
    return KEY_OFF;
}

2、LCD

显示整型数字:

void L1602_DispNum(uchar row, uchar column, uint num) 
{
	char str[32];
	sprintf(str,"%d", num ); // num格式化为str
		
	L1602_string(row, column, str); // 在lcd的row行,column列显示str
}

显示浮点型数字:

void L1602_DispFloatNum(uchar row, uchar column, double num)
{
	char str[32];
  sprintf(str,"%.2f", num );  // num格式化为str
	L1602_string(row, column, str); // 在lcd的row行,column列显示str
}

显示字符串函数:

void L1602_string(uchar row, uchar column,char *p) 
{
	uchar a;
	if (row==1) a=0x80;
	if (row==2) a=0xc0;
	a = a + column - 1;
	enable(a);
	while(*p!='\0') 
	{
		write(*p);
		p++;
	}
	/*while(1)
	{
		if (*p==';') break; 
		write(*p);
		p++;
	}*/
}

总代码:

#include "lcd_1602.h"
#include "stm32f10x_gpio.h"
#include "stdio.h"

#define lcm_ce_LOW()			GPIO_ResetBits(GPIOB, GPIO_Pin_0) // E-----LCD-Pin6 -----STM32-PB0
#define lcm_ce_HIGH()			GPIO_SetBits(GPIOB, GPIO_Pin_0)

#define lcm_rst_LOW()			GPIO_ResetBits(GPIOB, GPIO_Pin_1) // RS----LCD-Pin4-----STM32-PB1
#define lcm_rst_HIGH()		GPIO_SetBits(GPIOB, GPIO_Pin_1)


#define lcm_wr_LOW()			GPIO_ResetBits(GPIOB, GPIO_Pin_2) // WR----LCD-Pin5-----STM32-PB2
#define lcm_wr_HIGH()			GPIO_SetBits(GPIOB, GPIO_Pin_2)


#define DATA_0_LOW()			GPIO_ResetBits(GPIOB, GPIO_Pin_8)  //置0
#define DATA_0_HIGH()			GPIO_SetBits(GPIOB, GPIO_Pin_8)   // 置1

#define DATA_1_LOW()			GPIO_ResetBits(GPIOB, GPIO_Pin_9)
#define DATA_1_HIGH()			GPIO_SetBits(GPIOB, GPIO_Pin_9) 

#define DATA_2_LOW()			GPIO_ResetBits(GPIOB, GPIO_Pin_10)
#define DATA_2_HIGH()			GPIO_SetBits(GPIOB, GPIO_Pin_10) 

#define DATA_3_LOW()			GPIO_ResetBits(GPIOB, GPIO_Pin_11)
#define DATA_3_HIGH()			GPIO_SetBits(GPIOB, GPIO_Pin_11) 

#define DATA_4_LOW()			GPIO_ResetBits(GPIOB, GPIO_Pin_12)
#define DATA_4_HIGH()			GPIO_SetBits(GPIOB, GPIO_Pin_12) 

#define DATA_5_LOW()			GPIO_ResetBits(GPIOB, GPIO_Pin_13)
#define DATA_5_HIGH()			GPIO_SetBits(GPIOB, GPIO_Pin_13) 

#define DATA_6_LOW()			GPIO_ResetBits(GPIOB, GPIO_Pin_14)
#define DATA_6_HIGH()			GPIO_SetBits(GPIOB, GPIO_Pin_14) 

#define DATA_7_LOW()			GPIO_ResetBits(GPIOB, GPIO_Pin_15)
#define DATA_7_HIGH()			GPIO_SetBits(GPIOB, GPIO_Pin_15) 

void DATA(unsigned int d)
{
	if (d&0x01) {DATA_0_HIGH();}	else {DATA_0_LOW();}
	if (d&0x02) {DATA_1_HIGH();}	else {DATA_1_LOW();}
	if (d&0x04) {DATA_2_HIGH();}	else {DATA_2_LOW();}
	if (d&0x08) {DATA_3_HIGH();}	else {DATA_3_LOW();}
	if (d&0x10) {DATA_4_HIGH();}	else {DATA_4_LOW();}
	if (d&0x20) {DATA_5_HIGH();}	else {DATA_5_LOW();}
	if (d&0x40) {DATA_6_HIGH();}	else {DATA_6_LOW();}
	if (d&0x80) {DATA_7_HIGH();}	else {DATA_7_LOW();}
}

void E(unsigned char i) 
{
	if(i) {lcm_ce_HIGH();} else {lcm_ce_LOW();}
}

void RS(unsigned char i) 
{
	if(i) {lcm_rst_HIGH();} else {lcm_rst_LOW();}
}

void RW(unsigned char i) 
{
	if(i) {lcm_wr_HIGH();} else {lcm_wr_LOW();}
}

void delay(uint a) 
{
u16 i=0;  
	while(a--)
	{	i=12000;  
		while(i--) ;    
	}
}

void delay_us(uint time)
{    u16 i=0;  
	while(time--)
	{	i=10;  
		while(i--) ;    
	}
}


void delay_ms(uint time) 
{	u16 i=0;  
	while(time--)
	{	i=12000;  
		while(i--) ;    
	}
}

void enable(uchar del)
{
	DATA(del);
	RS(0); 
	RW(0); 
	E(0);  
	delay_ms(10);
	E(1); 
	delay_ms(10);
	E(0); 
	
}

void write(uchar del) 
{
	DATA(del);
	RS(1); 
	RW(0); 
	E(0); 
	delay_ms(10);
	E(1); 
	delay_ms(10);
	E(0); 
}

void L1602_init(void)
{
	delay_ms(10);
	enable(0x38); 
	delay_ms(10);
	enable(0x06);
	delay_ms(10);
	enable(0x0C); 
	delay_ms(10);
	enable(0x01);	
	delay_ms(10);
}

void L1602_Clear(void) 
{
	delay_ms(10);
	enable(0x01);
	delay_ms(10);
}

void L1602_char(uchar row, uchar column,char sign) 
{
	uchar a;
	if (row==1) a=0x80;
	if (row==2) a=0xc0;
	a = a + column - 1;
	enable(a);
	write(sign);
}

void L1602_string(uchar row, uchar column,char *p) 
{
	uchar a;
	if (row==1) a=0x80;
	if (row==2) a=0xc0;
	a = a + column - 1;
	enable(a);
	while(*p!='\0') 
	{
		write(*p);
		p++;
	}
	/*while(1)
	{
		if (*p==';') break; 
		write(*p);
		p++;
	}*/
}


void L1602_DispNum(uchar row, uchar column, uint num) 
{
	char str[32];
	sprintf(str,"%d", num ); // num格式化转化为str
		
	L1602_string(row, column, str); // 在lcd的row行,column列显示str
}

void L1602_DispFloatNum(uchar row, uchar column, double num)
{
	char str[32];
  sprintf(str,"%.2f", num );  // num转化str格式
	L1602_string(row, column, str); // lcd的row行,colunm列,显示str
}


3、串口的使用

/*
	基本的USART代码
	通过USART1发送数据、PC机上运行串口调试助手软件接收字符
	如果串口没有显示正确的输出,检查Target/Code Generation中的Use MicroLIB项是否被选中
*/
#include "stm32f10x.h"
#include <stdio.h>

void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
int fputc(int ch, FILE *f);/*重定向,修改一下选中Use MicroLIB ,
							需要在 Target/Code Generation??Use MicroLIB
							才能使用printf	*/
void delay_nms(u16 time);//延时子程序

int main(void)
{
	RCC_Configuration();
	GPIO_Configuration();
	USART_Configuration();
	USART_ClearFlag(USART1,USART_FLAG_TC);// 清发送结束位
	USART_SendData(USART1, 'A'); // 向发送数据寄存器写一个字节
	while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
	USART_SendData(USART1,'B');
	while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
	printf("\r\n");
	while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
	printf("zzzz\n");
	
	while(1)
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_8);//PA8置位,LED1灯灭
		delay_nms(200);
		GPIO_ResetBits(GPIOA,GPIO_Pin_8);//PA8清零,LED1灯亮
		delay_nms(200);
		while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
		printf("齐鲁工业大学!\n");
	}
}

void RCC_Configuration(void)
{ 
	SystemInit();
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1的时钟, USART1挂接到APB2上
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
}

void GPIO_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;//声明GPIO初始化结构变量
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //配置管脚PA10/USART1_RX
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;// 浮空输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA10
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; //配置管脚PA9/USART1_TX
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //IO配置为复用输出口
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; //配置管脚8
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //IO口配置为复用输出口
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //工作频率50MHz
	GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA8口
}

void USART_Configuration(void)
{
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate = 115200;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b; //USART_WordLength_8b; //8 数据 //USART_WordLength_9b; //9 位数据
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	//USART_StopBits_1 ;//在帧结尾传输1个停止位
	//USART_StopBits_0.5;//在帧结尾传输0.5个停止位
	//USART_StopBits_2 ;//在帧结尾传输2个停止位
	//USART_StopBits_1.5;//在帧结尾传输1.5个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;
	//USART_Parity_No ;//奇偶失能
	//USART_Parity_Even;//偶模式
	//USART_Parity_Odd ;//奇模式
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	//USART_HardwareFlowControl_None; //硬件流控制失能
	//USART_HardwareFlowControl_RTS; //发送请求 RTS使能
	//USART_HardwareFlowControl_CTS; //清除请求 CTS使能
	//USART_HardwareFlowControl_RTS_CTS;//RTS和 CTS使能
	USART_InitStructure.USART_Mode = USART_Mode_Tx;
	//USART_Mode_Tx;//发送使能
	//USART_Mode_Rx;//接收使能
	USART_Init(USART1, &USART_InitStructure);//初始化串口
	//USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启接收中断,接收寄存器不空(RXNE=1)时产生中断
	//USART_ITConfig(USART1, USART_IT_TXE, ENABLE); // 开启发送中断,发送寄存器空(TXE=1)时使能产生中断
	/*串口的发送中断有两个,分别是:
			l、发送数据寄存器空中断(TXE)
			2、发送完成中断(TC)*/
	USART_Cmd(USART1, ENABLE); //启动USART
}

int fputc(int ch,FILE *f)
{
	if(ch=='\n')
	{
		while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
		USART_SendData(USART1,'\r');
	}
	while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET)
	;
	USART_SendData(USART1,ch);
	return ch;
}

void delay_nms(u16 time)//延时子程序
{ 
	u16 i=0;
	while(time--)
	{ 
		i=12000; 
		while(i--) ;
	}
}










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值