STM32定时器中断和LED

10 篇文章 3 订阅

之前实验到串口接收命令数据和发送仪器数据,已经串口模拟仪器和Cache数据库做仪器连接测试。这次实验STM32的定时器中断和显示部分。把串口启动后的LED状态显示由以前死循环方法里移到定时器中断里面,借助定时器中断显示发送给外部十六进制数据。

实现目标:
1.串口状态的LED灯闪烁从以前死循环移入定时器中断,这样串口发送数据时间长时候也不会卡主闪烁。
2.按0,1,2号键在显示器显示按的数字
3.按KEY_UP键时候给串口发送数据,且显示发送的十六进制数据

碰到的坑有:
在定时器中断里面如果调用的方法用了正点原则提供的delay_ms延时函数后会导致其他地方延时失效。因为我定时器中断间隔是2ms。每2ms调用delay_ms方法会使SysTick->LOAD重新加载。发现主函数延迟方法不好使后看他实现分析的。这个delay在中断存在时候基本废了。只能后面看着再实现个并发好使的延迟函数。
在这里插入图片描述

代码如下,没列出来的代码文件和上一个博客一样:
timer.h

#ifndef _TIMER
#define _TIMER
#include "sys.h"
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//2ms定时显示
//这里使用的是定时器3!
//InitTimer3(19, 7199); 
void InitTimer3(u16 arr,u16 psc); 

//测试时钟
void TestTimer3(void);
#endif


timer.c

#include "timer.h"
#include "led.h"
#include "smg.h"

//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//2ms定时显示
//这里使用的是定时器3!
//InitTimer3(19, 7199); 
void InitTimer3(u16 arr,u16 psc)
{
		//TIM3时钟使能   
    RCC->APB1ENR|=1<<1;  
	  //设定计数器自动重装值 
		TIM3->ARR=arr;  	
	  //预分频器设置
		TIM3->PSC=psc; 
    //允许更新中断				 	
		TIM3->DIER|=1<<0;   
	  //使能定时器3
		TIM3->CR1|=0x01; 
    //抢占0,子优先级3,组2			
  	MY_NVIC_Init(0,3,TIM3_IRQn,2);
							 
}

//测试时钟
void TestTimer3(void)
{
	//初始化LED灯
	InitLedEnv();
}

//十六进制字符转换为绘制的数据
//c:字符串
u8 GetSMGChar(char c)
{
	if(c=='0')
	{
		return ALL_SMG_CHAR[0];
	}
	else if(c=='1')
	{
		return ALL_SMG_CHAR[1];
	}
	else if(c=='2')
	{
		return ALL_SMG_CHAR[2];
	}
	else if(c=='3')
	{
		return ALL_SMG_CHAR[3];
	}
	else if(c=='4')
	{
		return ALL_SMG_CHAR[4];
	}
	else if(c=='5')
	{
		return ALL_SMG_CHAR[5];
	}
	else if(c=='6')
	{
		return ALL_SMG_CHAR[6];
	}
	else if(c=='7')
	{
		return ALL_SMG_CHAR[7];
	}
	else if(c=='8')
	{
		return ALL_SMG_CHAR[8];
	}
	else if(c=='9')
	{
		return ALL_SMG_CHAR[9];
	}
	else if(c=='A')
	{
		return ALL_SMG_CHAR[10];
	}
	else if(c=='B')
	{
		return ALL_SMG_CHAR[11];
	}
	else if(c=='C')
	{
		return ALL_SMG_CHAR[12];
	}
	else if(c=='D')
	{
		return ALL_SMG_CHAR[13];
	}
	else if(c=='E')
	{
		return ALL_SMG_CHAR[14];
	}
	else if(c=='F')
	{
		return ALL_SMG_CHAR[15];
	}
	return ALL_SMG_CHAR[16];
}

//LED状态
int ledStat = 0;
int times=0;
int curSMGIndex=0;

//时钟三中断实验
void TIM3_IRQHandler(void)
{
	  //溢出中断
    if (TIM3->SR & 0X0001) 
    {
        times++;
				//每50次闪一下灯
				if (times % 100 == 0)
				{
					if (ledStat == 0)
					{
						ledStat = 1;
						GPIOC->ODR &= ~(1 << 0);
					}
					else
					{
						ledStat = 0;
						GPIOC->ODR |= 1 << 0;
					}
				}
				//没有执行锁定缓存时候才执行绘制
				if(SMG_LOCK_BUF==0)
				{
					char oneChar=SMG_SHOW_BUF[curSMGIndex];
					//数码管显示
					SMGWriteData(GetSMGChar(oneChar), curSMGIndex); 
					//刷新显示
					SMGRefresh();
					curSMGIndex++;
					curSMGIndex%=8;
				}
    }
	  //清除中断标志位
    TIM3->SR &= ~(1 << 0); 
}




main.c

#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "usart.h"
#include "hardware.h"
#include "timer.h"
#include "smg.h"

//测试汇编调入非main方法
int zlzmain(void)
{
	//初始化时钟
	Stm32_Clock_Init(9);
	//初始化延时函数
	delay_init(72);	 
	TestLed();
	return 0;
}

//zlz的stm32学习
int main(void)
{
	//初始化时钟
	Stm32_Clock_Init(9);
	//初始化延时函数
	delay_init(72);	 
	
	//测试LED
	//TestLed();
	
	
	//测试蜂鸣器
	//TestBeep();
	
	//测试按键
	//TestKey();
	
	//测试串口
	//TestUsart(72,9600);
	InitSMG();
	InitTimer3(19, 7199); 
	TestTimer3();
	
	//启动串口命令监测
	StartUsartCmdChl(72,9600);
}




smg.h

#ifndef _SMG
#define _SMG
#include "sys.h"
#include "delay.h"

74HC138操作线
//A0地址线
#define LED_A0 PCout(10) 
//A1地址线
#define LED_A1 PCout(11) 
//A2地址线
#define LED_A2 PCout(12) 

74HC595操作线
//数据线
#define LED_DS		PBout(3) 
//锁存时钟线
#define LED_LCLK	PBout(4) 
//时钟线
#define LED_SCK		PBout(5) 

//每个数字亮灯的数组
//0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F, .,全灭
//        1
//       ---
//    6 |   | 2
//       ---
//    5 | 7 | 3
//       ---  .8
//         4
//b对应3e即0011 1110从8位最高位和1-8顺序控制每个灯管是否点亮
extern u8 ALL_SMG_CHAR[];

//SMG的8个位置对应的字符
extern char SMG_SHOW_BUF[];

//锁定缓存
extern int SMG_LOCK_BUF;

//初始化显示屏
void InitSMG(void);
	
//74HC595驱动
//数码管显示
//duan:显示的段码
//wei:要显示的数码管编号 0-7(共8个数码管)
void SMGWriteData(u8 duan,u8 wei);
	
	
//74HC595驱动
//数码管刷新显示
void SMGRefresh(void);


#endif


smg.c

#include "smg.h"

//每个数字亮灯的数组
//0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F, .,全灭
//        1
//       ---
//    6 |   | 2
//       ---
//    5 | 7 | 3
//       ---  .8
//         4
//b对应3e即0011 1110从8位最高位和1-8顺序控制每个灯管是否点亮
u8 ALL_SMG_CHAR[] = {0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0, 0xfe, 0xf6, 0xee, 0x3e, 0x9c, 0x7a, 0x9e, 0x8e, 0x01, 0x00};

//SMG的8个位置对应的字符
char SMG_SHOW_BUF[8]={'5','2','5','7','1','3','1','4'};

//锁定缓存
int SMG_LOCK_BUF=0;

//初始化显示屏
void InitSMG(void)
{
	 //使能PORTB时钟	 
	 RCC->APB2ENR|=1<<3;  
   //使能PORTC时钟  
   RCC->APB2ENR|=1<<4; 
   //使能AFIO时钟	
   RCC->APB2ENR|=1<<0;   
   //关闭jtag,使能SWD,可以用SWD模式调试 PB4做普通IO口使用,否则不能当IO使用
   JTAG_Set(SWD_ENABLE);
   //PB3~5推挽输出
   GPIOB->CRL&=0XFF000FFF; 
   GPIOB->CRL|=0X00333000;
   //PC10~12推挽输出 
   GPIOC->CRH&=0XFFF000FF; 
   GPIOC->CRH|=0X00033300; 
    	
   GPIOB->BRR = 1<<3|1<<5;
   GPIOB->BSRR = 1<<4;
   GPIOC->BSRR = 1<<10|1<<11|1<<12;
}

//74HC138驱动
//数码管位选
//num:要显示的数码管编号 0-7(共8个数码管)
void LED_Wei(u8 num)
{
    LED_A0=num&0x01;
		LED_A1=(num&0x02)>>1;
		LED_A2=(num&0x04)>>2;
}


//74HC595驱动
//数码管显示
//duan:显示的段码
//wei:要显示的数码管编号 0-7(共8个数码管)
void SMGWriteData(u8 duan,u8 wei)
{
	u8 i;
	//先送段
	for( i=0;i<8;i++)
	{
		LED_DS=(duan>>i)&0x01;
		LED_SCK=0;
		//delay_us(5);
		LED_SCK=1;
	}
	//后选中位
  LED_Wei(wei);
}


//74HC595驱动
//数码管刷新显示
void SMGRefresh(void)
{
	LED_LCLK=1;
	//delay_us(5);
	LED_LCLK=0;
}





hardware.h

//定义操作硬件的基本方法,供外部调用
//定义宏,防止头文件重复引用
#ifndef __HARDWARE
#define __HARDWARE

//把十六进制字符串转换数组
//c:字符串
int HexToInt(char c);

//把字符串按u8发送
//str:字符串
void U8Send(const char * str);

//启动串口命令通道
//pclk2:pclk2的时钟频率
//bound:波特率
void StartUsartCmdChl(int pclk2, int bound);

//打开LED0
void LED0Open(void);

//关闭LED0
void LED0Close(void);

//打开LED1
void LED1Open(void);

//关闭LED1
void LED1Close(void);

//打开LED2
void LED2Open(void);

//关闭LED2
void LED2Close(void);

//打开LED3
void LED3Open(void);

//关闭LED3
void LED3Close(void);

//打开LED4
void LED4Open(void);

//关闭LED4
void LED4Close(void);

//打开LED5
void LED5Open(void);

//关闭LED5
void LED5Close(void);

//打开LED6
void LED6Open(void);

//关闭LED6
void LED6Close(void);

//打开LED7
void LED7Open(void);

//关闭LED7
void LED7Close(void);

//打开fengmingq
void BeepOpen(void);

//关闭蜂鸣器
void BeepClose(void);

//显示十六进制串
//str:要显示的十六进制串
void ShowHexStr(const char * str);

//显示十六进制串
//c:要显示的十六进制字符
void ShowHexChar(const char c);

#endif


hardware.c

#include "sys.h"
#include "delay.h"
#include "stdio.h"	
#include "led.h"
#include "beep.h"
#include "key.h"
#include "usart.h"
#include "smg.h"
#include "hardware.h"
#include "string.h"


//启动串口命令通道
//pclk2:pclk2的时钟频率
//bound:波特率
void StartUsartCmdChl(int pclk2, int bound)
{
	//初始化串口
	InitUsart(pclk2, bound);
	//初始化LED灯
	InitLedEnv();
	//初始化按键
	InitKeyEnv();
	//初始化蜂鸣器
	InitBeepEnv();
	//命令开始
	u8 ENQ = 0x05;
	//命令结束
	u8 EOT = 0x04;
	//循环次数
	u16 times = 0;
	//命令约定从Asscii码15开始
	u8 Key0OpenCmd = 0x0F;
	u8 Key0CloseCmd = 0x10;
	u8 Key1OpenCmd = 0x11;
	u8 Key1CloseCmd = 0x12;
	u8 Key2OpenCmd = 0x13;
	u8 Key2CloseCmd = 0x14;
	u8 Key3OpenCmd = 0x15;
	u8 Key3CloseCmd = 0x16;
	u8 Key4OpenCmd = 0x17;
	u8 Key4CloseCmd = 0x18;
	u8 Key5OpenCmd = 0x19;
	u8 Key5CloseCmd = 0x1A;
	u8 Key6OpenCmd = 0x1B;
	u8 Key6CloseCmd = 0x1C;
	u8 Key7OpenCmd = 0x1D;
	u8 Key7CloseCmd = 0x1E;
	u8 BeepOpenCmd = 0x1F;
	u8 BeepCloseCmd = 0x20;
	
	//检验仪器数据
	const char* machData="02 30 36 30 33 32 0D FF 20 52 45 53 55 4C 54 20 20 0D 21 20 30 31 31 2E 39 53 68 20 20 20 0D 22 20 30 32 2E 37 31 53 20 20 20 20 0D 23 20 30 32 32 2E 38 53 20 20 20 20 0D 24 20 30 30 2E 34 35 53 20 20 20 20 0D 25 20 30 30 33 2E 38 53 20 20 20 20 0D 28 20 30 38 2E 34 35 53 48 20 20 20 0D 29 20 30 37 31 2E 30 53 20 20 20 20 0D 2A 20 30 30 2E 31 33 53 20 20 20 20 0D 2B 20 30 30 31 2E 31 53 20 20 20 20 0D 2C 20 30 30 2E 31 35 53 20 20 20 20 0D 2D 20 30 30 31 2E 33 53 20 20 20 20 0D 2E 20 30 30 2E 30 34 53 20 20 20 20 0D 2F 20 30 30 30 2E 33 53 20 20 20 20 0D 30 20 30 30 2E 30 34 53 20 20 20 20 0D 31 20 30 30 30 2E 33 53 20 20 20 20 0D 32 20 30 34 2E 35 36 20 20 20 20 20 0D 33 20 30 31 33 2E 31 20 20 20 20 20 0D 34 20 30 33 39 2E 38 20 20 20 20 20 0D 35 20 30 30 30 38 37 20 20 20 20 20 0D 36 20 30 32 38 2E 37 20 20 20 20 20 0D 37 20 30 33 33 2E 30 20 20 20 20 20 0D 38 20 30 31 36 2E 31 20 68 20 20 20 0D 3A 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 40 20 30 30 32 36 33 20 20 20 20 20 0D 41 20 30 30 37 2E 39 20 20 20 20 20 0D 42 20 30 2E 32 30 39 20 20 20 20 20 0D 43 20 30 31 32 2E 35 20 20 20 20 20 0D 50 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 52 20 20 20 20 20 0D 53 20 20 20 20 20 20 20 0D 54 20 4E 45 55 2B 0D 55 20 0D 56 20 0D 57 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27 3D 66 AE F0 FF E5 B7 89 75 6B 64 60 5E 60 5E 5E 5F 5D 51 43 3B 35 33 31 2F 2D 2C 2A 29 28 27 26 26 25 25 25 24 24 24 23 23 23 23 23 22 21 21 21 21 21 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 58 20 20 20 20 20 20 20 20 20 20 20 20 21 20 20 20 20 20 20 20 20 20 21 24 29 30 3D 4B 5F 7C 98 B2 CD DF F2 FB FD FF F8 E9 DA CA B5 9D 8B 80 73 67 5B 51 4C 47 41 3B 38 34 2F 2D 2D 2A 27 26 24 23 22 22 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 59 20 20 20 20 20 20 20 20 20 20 20 26 34 48 63 7E A0 C2 E3 F8 FF FF FF F8 F1 EA E3 D6 CF C8 BB B4 A7 A0 92 8C 85 7E 77 77 71 6A 63 63 5C 56 56 4F 4F 48 3B 3B 34 34 2D 2D 26 26 26 26 26 26 26 26 26 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 5A 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 3D 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 3F 38 35 32 31 30 2E 2C 2A 2B 29 27 27 26 26 26 25 27 23 25 24 23 24 24 23 22 23 21 22 22 22 21 22 21 21 22 21 21 20 20 21 20 21 20 20 21 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 0D 5B 20 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 38 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 42 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 31 31 34 31 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 36 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 36 31 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 42 32 38 38 38 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 38 35 34 46 43 31 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 41 44 35 35 38 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 35 31 46 31 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 33 42 46 33 46 33 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 44 46 36 38 34 30 38 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 38 42 43 45 39 30 30 34 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 31 45 42 46 46 45 41 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 43 37 46 46 46 46 34 30 32 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 38 37 46 46 46 39 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 36 37 46 46 46 46 44 32 30 30 30 30 30 30 30 30 30 30 33 30 30 30 30 30 30 30 30 30 30 30 30 31 35 46 44 46 46 46 44 41 34 30 38 30 30 34 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 32 33 46 46 46 46 46 44 32 30 30 30 30 30 30 30 32 30 38 30 30 30 30 30 30 30 30 30 32 30 30 30 31 42 46 46 46 46 46 44 34 34 32 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 46 46 46 46 46 42 45 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 35 46 46 46 46 44 41 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 35 41 46 46 46 46 45 46 31 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 44 46 46 46 46 46 34 45 38 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 46 46 46 46 46 45 33 30 30 30 38 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 46 46 46 46 46 46 39 31 34 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 42 46 46 46 46 46 38 30 30 30 32 30 30 30 32 31 38 30 30 30 30 30 30 30 30 30 30 30 30 30 32 37 46 46 46 46 46 46 41 36 38 30 30 30 34 30 30 31 30 30 30 30 30 30 30 30 30 31 30 30 30 30 31 42 36 46 46 46 46 44 41 43 43 30 32 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 37 46 46 46 46 46 45 30 30 32 30 38 30 30 30 38 31 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 37 46 46 46 46 46 44 36 30 30 30 32 30 30 30 30 34 30 30 30 30 30 30 30 30 30 31 30 30 30 30 33 37 46 46 46 46 46 46 38 34 30 30 30 30 30 38 30 30 43 34 30 31 30 30 30 30 30 30 38 30 30 30 31 33 46 46 46 46 46 42 43 30 30 30 30 34 30 30 38 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 32 46 46 46 46 46 46 46 41 34 30 30 30 34 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 39 46 46 46 46 46 46 45 30 37 46 30 32 30 30 30 33 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 42 46 46 46 46 46 44 43 34 39 36 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 46 46 46 46 46 43 39 30 30 30 30 32 41 41 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 33 46 46 46 46 46 43 43 41 30 34 34 43 36 31 30 32 31 30 30 34 30 30 30 30 30 30 30 30 30 30 32 31 46 46 46 46 46 35 39 39 31 32 34 31 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 46 46 46 46 43 37 34 30 39 31 41 35 34 30 30 30 34 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 46 44 46 42 46 46 39 36 32 31 36 31 33 31 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 32 46 45 46 45 46 45 36 43 44 42 35 32 32 34 41 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 45 36 46 44 45 45 39 36 32 42 46 32 38 34 31 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 32 41 33 37 46 33 45 34 45 35 46 31 37 45 34 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 32 32 34 42 41 35 32 46 45 35 44 43 34 41 41 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 37 32 30 42 37 44 31 37 39 31 45 45 38 45 36 30 38 30 30 30 30 30 30 31 30 30 30 30 30 30 31 30 30 39 44 45 37 41 43 46 37 39 34 43 36 33 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 36 32 37 45 36 45 37 36 45 35 39 37 35 33 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 32 46 37 37 45 46 45 38 46 43 39 34 36 30 31 30 31 34 30 30 30 30 30 30 30 30 30 30 30 32 33 37 46 46 46 46 46 36 45 42 45 33 35 31 31 38 30 30 32 30 30 30 30 30 31 30 30 30 30 30 32 31 31 46 46 46 46 46 46 44 44 46 34 43 34 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 33 46 46 46 46 46 46 44 45 41 34 30 30 34 30 30 30 30 30 38 30 31 30 30 30 30 30 30 30 30 30 33 46 37 46 46 46 46 46 41 35 44 30 30 30 34 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 46 46 46 46 46 46 46 45 38 36 34 31 30 32 31 30 32 30 30 38 30 30 30 30 30 30 30 30 30 30 30 39 42 46 46 46 46 46 46 36 38 44 30 32 38 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 35 46 46 46 46 46 46 32 36 39 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 42 46 46 46 44 44 42 30 45 30 30 31 30 32 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 31 34 44 46 37 46 46 46 33 30 38 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 37 46 42 46 46 31 43 30 34 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 35 30 33 46 39 37 31 32 33 31 30 34 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 30 30 34 31 31 41 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 38 31 38 36 36 42 32 30 41 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 30 30 38 30 42 43 34 30 33 39 42 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 41 32 38 30 34 32 31 35 38 34 31 30 30 30 34 30 30 31 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 31 30 30 38 30 30 30 30 31 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0D 5D 20 30 31 32 20 30 36 37 20 31 32 30 20 30 30 30 20 30 30 30 0D 5E 20 30 32 34 20 30 34 39 0D 5F 20 30 39 38 0D 60 20 30 31 32 20 30 36 37 20 31 32 30 0D 61 20 30 32 34 20 30 32 37 20 30 35 30 20 30 33 35 20 31 31 38 20 30 33 31 20 30 37 32 20 30 37 33 20 31 30 30 20 30 37 32 20 31 30 30 20 31 31 38 20 30 32 37 20 30 36 37 20 30 35 31 20 30 30 32 20 30 30 32 20 30 30 32 0D 66 20 20 20 20 20 4C 6D 6E 65 2D 20 20 20 20 20 0D 70 20 30 31 0D 71 20 31 39 2F 31 31 2F 31 34 20 31 30 68 33 39 6D 6E 34 39 73 0D 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 73 20 30 30 30 30 0D 75 20 31 30 32 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 77 20 20 20 20 20 20 20 20 20 0D 78 20 20 20 20 0D 79 20 30 0D 7B 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 7C 20 20 20 20 20 20 20 20 20 20 20 0D 7D 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 7F 20 41 42 58 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 80 20 42 0D 83 20 41 42 58 0D 8B 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 90 20 30 31 33 38 32 20 30 31 33 30 37 20 30 31 33 39 36 20 30 31 33 37 37 20 30 31 34 32 31 20 30 31 34 36 33 20 30 31 33 31 38 20 30 31 33 39 33 20 30 31 33 37 37 20 30 31 33 39 39 20 30 31 34 34 34 20 30 31 33 34 35 20 30 38 33 34 37 20 30 38 32 37 37 0D 91 20 30 33 35 34 37 20 30 33 35 33 38 20 30 33 36 36 36 20 30 33 36 30 33 20 30 33 36 34 34 20 30 33 35 39 33 20 30 33 36 34 35 20 30 33 37 32 30 20 30 33 36 31 31 20 30 33 35 36 32 20 30 33 35 32 32 20 30 33 35 37 39 20 32 31 35 39 32 20 32 31 36 34 30 0D 92 20 30 32 30 31 35 20 30 32 30 31 35 20 30 32 30 31 35 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 32 30 31 35 20 30 33 36 33 36 0D 93 20 30 32 37 37 39 31 32 20 30 32 37 37 34 37 35 20 30 32 38 35 34 31 35 20 30 32 37 37 34 33 36 20 30 32 38 30 39 36 34 20 30 32 37 36 39 34 31 20 30 32 38 30 34 34 32 20 30 32 38 34 34 35 30 20 30 32 37 39 31 31 36 20 30 32 37 33 33 35 33 20 30 32 36 39 38 36 32 20 30 32 37 35 32 31 39 20 31 36 37 36 31 34 34 20 31 36 36 32 34 34 33 0D 94 20 30 32 36 31 31 20 30 32 36 36 37 20 30 32 37 31 38 20 30 32 36 34 30 20 30 32 36 36 37 20 30 32 35 39 31 20 30 32 36 32 33 20 30 32 36 36 34 20 30 32 36 30 34 20 30 32 35 39 31 20 30 32 36 32 31 20 30 32 36 34 34 20 31 35 38 39 35 20 31 35 37 34 38 0D 95 20 30 31 33 38 32 20 30 31 33 30 37 20 30 31 33 39 36 20 30 31 33 37 37 20 30 31 34 32 31 20 30 31 34 36 33 20 30 31 33 31 38 20 30 31 33 39 33 20 30 31 33 37 37 20 30 31 33 39 39 20 30 31 34 34 34 20 30 31 33 34 35 20 30 38 33 34 37 20 30 38 32 37 37 0D 96 20 30 36 30 33 38 20 30 30 30 39 33 0D A3 20 56 0D A4 20 31 0D A5 20 31 0D A6 20 31 0D A7 20 31 0D FD 20 38 38 62 38 0D 03\r\n";
	//死循环监听串口消息
	while (1)
	{
		//数据已经读取完到缓冲区了
		if (USART_RX_BUF_HASDATA == 1)
		{
			//得到此次接收到的数据长度
			u8 len = USART_RX_BUF_CUTINDEX;
			//printf("\r\nzlz-stm32:您发送的消息为:\r\n\r\n");
			//是否开始命令
			int cmdStart = 0;
			//开始命令的为
			int cmdStartIndex = 0;
			//当前命令
			u8 cmd;
			//循环发生数据
			for (u8 t = 0; t < len; t++)
			{
				//ENQ开始命令
				if (USART_RX_BUF[t] == ENQ)
				{
					cmdStart = 1;
					cmdStartIndex = t;
					continue;
				}
				//第2位命令
				if (cmdStart == 1)
				{
					cmd = USART_RX_BUF[t];
					cmdStart = 0;
				}
				//EOT开始命令
				if (USART_RX_BUF[t] == EOT && (t - cmdStartIndex) == 2)
				{
					//执行命令
					//开启LED0
					if (cmd == Key0OpenCmd)
					{
						LED0Open();
					}
					//关闭LED0
					else if (cmd == Key0CloseCmd)
					{
						LED0Close();
					}
					//开启LED1
					else if (cmd == Key1OpenCmd)
					{
						LED1Open();
					}
					//关闭LED1
					else if (cmd == Key1CloseCmd)
					{
						LED1Close();
					}
					//开启LED2
					else if (cmd == Key2OpenCmd)
					{
						LED2Open();
					}
					//关闭LED2
					else if (cmd == Key2CloseCmd)
					{
						LED2Close();
					}
					//开启LED3
					else if (cmd == Key3OpenCmd)
					{
						LED3Open();
					}
					//关闭LED3
					else if (cmd == Key3CloseCmd)
					{
						LED3Close();
					}
					//开启LED4
					else if (cmd == Key4OpenCmd)
					{
						LED4Open();
					}
					//关闭LED4
					else if (cmd == Key4CloseCmd)
					{
						LED4Close();
					}
					//开启LED5
					else if (cmd == Key5OpenCmd)
					{
						LED5Open();
					}
					//关闭LED5
					else if (cmd == Key5CloseCmd)
					{
						LED5Close();
					}
					//开启LED6
					else if (cmd == Key6OpenCmd)
					{
						LED6Open();
					}
					//关闭LED6
					else if (cmd == Key6CloseCmd)
					{
						LED6Close();
					}
					//开启LED7
					else if (cmd == Key7OpenCmd)
					{
						LED7Open();
					}
					//关闭LED7
					else if (cmd == Key7CloseCmd)
					{
						LED7Close();
					}
					//开启蜂鸣器
					else if (cmd == BeepOpenCmd)
					{
						BeepOpen();
					}
					//关闭蜂鸣器
					else if (cmd == BeepCloseCmd)
					{
						BeepClose();
					}
					printf("收到命令:");
					USART1->DR = cmd;
					//等待发送结束
					while ((USART1->SR & 0X40) == 0);
					printf("\r\n");
				}
			}
			//设置为读取完成状态
			USART_RX_BUF_HASDATA = 0;
		}
		//得到按键值
		int key = GetPressKey(0);
		//按了KEY
		if (key >= 0)
		{
			if (key == 0)
			{
				ShowHexChar('0');
				printf("KEY0\r\n");
			}
			else if (key == 1)
			{
				ShowHexChar('1');
				printf("KEY1\r\n");
			}
			else if (key == 2)
			{
				ShowHexChar('2');
				printf("KEY2\r\n");
			}
			else if (key == 3)
			{
				GPIOC->ODR |= 1 << 0;
				//响一声
				BeepOpen();
				//延迟
				delay_ms(100);
				BeepClose();
				//用用u8格式发送字符串
				U8Send(machData);
				delay_ms(10);
				//发送仪器数据
				//printf(machData);
				printf("zlz\r\n");
			}
		}
		times++;
		//延迟
		delay_ms(10);
	}
}

//把字符串按u8发送
//str:字符串
void U8Send(const char * str)
{
	int len=strlen(str);
	for(int i=0;i<len;i+=3)
	{
		if(i+1<len)
		{
			char one=str[i];
			char tow=str[i+1];
			u8 oneHex=HexToInt(one)*16+HexToInt(tow);
			USART1->DR = oneHex;
			//等待发送结束
			while ((USART1->SR & 0X40) == 0);
			ShowHexChar(one);
			ShowHexChar(tow);
			delay_ms(5);
		}
	}
}

//把十六进制字符串转换数组
//c:字符串
int HexToInt(char c)
{
	if(c=='0')
	{
		return 0;
	}
	else if(c=='1')
	{
		return 1;
	}
	else if(c=='2')
	{
		return 2;
	}
	else if(c=='3')
	{
		return 3;
	}
	else if(c=='4')
	{
		return 4;
	}
	else if(c=='5')
	{
		return 5;
	}
	else if(c=='6')
	{
		return 6;
	}
	else if(c=='7')
	{
		return 7;
	}
	else if(c=='8')
	{
		return 8;
	}
	else if(c=='9')
	{
		return 9;
	}
	else if(c=='A')
	{
		return 10;
	}
	else if(c=='B')
	{
		return 11;
	}
	else if(c=='C')
	{
		return 12;
	}
	else if(c=='D')
	{
		return 13;
	}
	else if(c=='E')
	{
		return 14;
	}
	else if(c=='F')
	{
		return 15;
	}
	return 16;
}


//是否已经初始化LED
int LED_IS_INIT = 0;

//是否已经初始化蜂鸣器
int BEEP_IS_INIT = 0;

//是否已经初始化显示器
int SMG_IS_INIT = 0;

//打开LED0
void LED0Open(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算
	//第3位电平设置低,其他不变
	GPIOC->ODR &= ~(1 << 0);
}

//关闭LED0
void LED0Close(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算
	//第3位电平设置高,其他不变
	GPIOC->ODR |= 1 << 0;
}

//打开LED1
void LED1Open(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算
	//第3位电平设置低,其他不变
	GPIOC->ODR &= ~(1 << 1);
}

//关闭LED1
void LED1Close(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算
	//第3位电平设置高,其他不变
	GPIOC->ODR |= 1 << 1;
}

//打开LED2
void LED2Open(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算
	//第3位电平设置低,其他不变
	GPIOC->ODR &= ~(1 << 2);
}

//关闭LED2
void LED2Close(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算
	//第3位电平设置高,其他不变
	GPIOC->ODR |= 1 << 2;
}

//打开LED3
void LED3Open(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算
	//第3位电平设置低,其他不变
	GPIOC->ODR &= ~(1 << 3);
}

//关闭LED3
void LED3Close(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算
	//第3位电平设置高,其他不变
	GPIOC->ODR |= 1 << 3;
}

//打开LED4
void LED4Open(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算
	//第3位电平设置低,其他不变
	GPIOC->ODR &= ~(1 << 4);
}

//关闭LED4
void LED4Close(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算
	//第3位电平设置高,其他不变
	GPIOC->ODR |= 1 << 4;
}

//打开LED5
void LED5Open(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算
	//第3位电平设置低,其他不变
	GPIOC->ODR &= ~(1 << 5);
}

//关闭LED5
void LED5Close(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算
	//第3位电平设置高,其他不变
	GPIOC->ODR |= 1 << 5;
}

//打开LED6
void LED6Open(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算
	//第3位电平设置低,其他不变
	GPIOC->ODR &= ~(1 << 6);
}

//关闭LED6
void LED6Close(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算
	//第3位电平设置高,其他不变
	GPIOC->ODR |= 1 << 6;
}

//打开LED7
void LED7Open(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算
	//第3位电平设置低,其他不变
	GPIOC->ODR &= ~(1 << 7);
}

//关闭LED7
void LED7Close(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算
	//第3位电平设置高,其他不变
	GPIOC->ODR |= 1 << 7;
}

//打开fengmingq
void BeepOpen(void)
{
	//检查并初始化
	if (BEEP_IS_INIT == 0)
	{
		//初始化蜂鸣器
		InitBeepEnv();
		BEEP_IS_INIT = 1;
	}
	//通过操作ODR寄存器设置9位置为0即低电平,响
	GPIOB->ODR &= ~(1 << 8);
}

//关闭蜂鸣器
void BeepClose(void)
{
	//检查并初始化
	if (BEEP_IS_INIT == 0)
	{
		//初始化蜂鸣器
		InitBeepEnv();
		BEEP_IS_INIT = 1;
	}
	//通过操作ODR寄存器设置9位置为1即高电平,不响
	GPIOB->ODR |= 1 << 8;
}

//显示十六进制串
//str:要显示的十六进制串
void ShowHexStr(const char * str)
{
	//检查并初始化
	if (SMG_IS_INIT == 0)
	{
		//初始化显示屏
		InitSMG();
		SMG_IS_INIT = 1;
	}
	int len=strlen(str);
	for(int i=0;i<len;i++)
	{
		char one=str[i];
		ShowHexChar(one);
		delay_ms(50); 
	}
}

//显示十六进制串
//c:要显示的十六进制字符
void ShowHexChar(const char c)
{
	//锁定缓存,锁定缓存时候先不绘制
	SMG_LOCK_BUF=1;
	for(int i=0;i<7;i++)
	{
		SMG_SHOW_BUF[i]=SMG_SHOW_BUF[i+1];
	}
	SMG_SHOW_BUF[7]=c;
	//释放缓存锁
	SMG_LOCK_BUF=0;
}






在这里插入图片描述

工程一点点庞大了,哈哈

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,下面给您提供一个使用STM32定时器控制LED的基本示例代码,您可以根据您的具体需求进行修改: ```c #include "stm32f10x.h" void GPIO_Configuration(void); void TIM_Configuration(void); int main(void) { GPIO_Configuration(); TIM_Configuration(); while(1) { // 空循环 } } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能GPIOB时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 配置PB5为推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } void TIM_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; // 使能TIM3时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // TIM3的中断优先级为0 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 设置TIM3的时间基准 TIM_TimeBaseStructure.TIM_Period = 999; // 计数周期为1000 TIM_TimeBaseStructure.TIM_Prescaler = 71; // 预分频器为72 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 使能TIM3更新中断 TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 启动TIM3 TIM_Cmd(TIM3, ENABLE); } void TIM3_IRQHandler(void) { if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { // 翻转LED状态 GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5))); TIM_ClearITPendingBit(TIM3, TIM_IT_Update); } } ``` 上述代码中使用了STM32F10x的TIM3定时器控制LED的闪烁,定时器中断的频率为1kHz,也就是每隔1ms中断一次,翻转LED状态。您可以根据需要修改定时器的计数周期和预分频器的值来改变定时器中断的频率。同时,也可以通过修改GPIO的配置来控制其他的LED或者IO口。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小乌鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值