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--) ;
}
}