⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 STM32综合例程(3.5.0固件库)
💻 C
字号:
#include "stm32f10x.h"
#include <stdio.h>
#include "usart.h"
#include "systick.h"
#include "button.h"
#include "Backlight.h"
#include "adc.h"
#include "tft_lcd.h"
#include "bmp.h"
#include "wave.h"


#define EXAMPLE_NAME	"printf & scanf Testing"
#define EXAMPLE_DATE	"2010-01-02"

#define	DEMO_COUNT	94	/* Demo界面个数 */

static void GPIO_Configuration(void);
static void RCC_Configuration(void);
static void NVIC_Configuration(void);
static void DispTextDemo(void);	      //液晶文本显示界面
static void DispSharpDemo(void);	  //液晶矩形界面
static void DispPicDemo(void);	      //液晶图片界面
static void DispTextOnPic(void);	  //液晶图片文本界面
static void DispWaveDemo(void);	      //夜间波形显示界面
static void DispFirstPage(void);
static void DispAsciiDot(void);
static void DispHZK16(uint8_t _Index);

static void GPIO_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC
			| RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG,
				ENABLE);
	//LED灯配置
	GPIO_SetBits(GPIOF,  GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOF, &GPIO_InitStructure);
    //按键配置
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);	/* PA0 */

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_Init(GPIOC, &GPIO_InitStructure);	/* PC13 */

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
	GPIO_Init(GPIOD, &GPIO_InitStructure);	/* PD3 */

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_13
					  | GPIO_Pin_14 | GPIO_Pin_15;
	GPIO_Init(GPIOG, &GPIO_InitStructure);	/* PG7,8,13,14,15 */
}
static void RCC_Configuration(void)
{
	SystemInit();
}
//系统中断管理
void NVIC_Configuration(void)
{ 
   
	//NVIC_InitTypeDef NVIC_InitStructure;
  	/* Configure the NVIC Preemption Priority Bits */  
  //	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

//	#ifdef  VECT_TAB_RAM  
	  /* Set the Vector Table base location at 0x20000000 */ 
//	  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
//	#else  /* VECT_TAB_FLASH  */
	  /* Set the Vector Table base location at 0x08000000 */ 
//	  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
//	#endif
	/* Enable the USART1 Interrupt */
 /* NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);


  NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  

  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
      
  NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 1, 2);
   */
}

int main(void)
{
	uint8_t KeyCode;
	uint16_t bright;
	uint16_t value;
	uint8_t status = 0;		  //程序执行状态 
	uint8_t fRefresh = 0; 	  // LCD刷新标志 

	
	RCC_Configuration();
	
	GPIO_Configuration();
		
	NVIC_Configuration();
   
	InitButtonVar();

	USART_Configuration();

	SysTick_Config(SystemCoreClock/ 1000);
	   
    DelayMS(100);
	PrintfLogo(EXAMPLE_NAME, EXAMPLE_DATE);
	
	ADC_Configuration();
	StartTimer(0, 300);	/* 定时器0周期 200毫秒 */

	LCD_Init();		

	
	bright = BRIGHT_DEFAULT;	/* 设置为缺省亮度 */
	printf("Open LCD BackLight. bright = % d \r\n", bright);
	SetBackLight(bright);
	printf("Press UP and DOWN key to adjust LCD BackLight.\r\n");

	status = 0;		   //程序状态初始化
	fRefresh = 1;	/* 1表示需要刷新LCD */
	while (1)
    {
		/* 如果需要刷新屏幕 */
		if (fRefresh == 1)
		 {
			fRefresh = 0;  //清除刷新状态变量

			switch (status)	  //根据程序执行的状态,调用不同的显示函数。
			{
				case 0:
				      DispTextDemo();		/* 显示文本Demo */
				      break;
			   case 1:
				     DispSharpDemo();	/* 显示图形Demo */
				     break;
			   case 2:
				     DispPicDemo();		/* 显示图片(240x400) */
				     break;
			   case 3:
				    DispTextOnPic();	/* 在图片上写上文字 */
				    break;
			   case 4:
				    DispWaveDemo();		/* 画一个正弦波形 */
				    break;
		    	case 5:
					DispFirstPage();	/* 显示第1页 */
					break;
				case 6:
					DispAsciiDot();		/* 显示ASCII点阵 */
					break;
				default:	              //缺省状态
					if (status <= 94)
					{
						DispHZK16(status);	/* 显示一个区的94个汉字 */
					}
					break;
			}
		}

	  	KeyCode = GetKey();
		if (KeyCode > 0)
		 {
			switch (KeyCode)
			{
				case KEY_DOWN_USER:			/* User键按下 */
					printf("KEY_DOWN_USER\r\n");
				    GPIO_ResetBits(GPIOF, GPIO_Pin_6);	/* 点亮LED1 */
					break;

				case KEY_UP_USER:			/* User键弹起 */
					printf("KEY_UP_USER\r\n");
					GPIO_ResetBits(GPIOF, GPIO_Pin_7);	/* 点亮LED2 */
					break;

				case KEY_HOLD_USER:			/* User键长按 */
					printf("KEY_HOLD_USER\r\n");
					GPIO_ResetBits(GPIOF, GPIO_Pin_8);	/* 点亮LED3 */
					break;

				case KEY_DOWN_WAKEUP:		/* WakeUp键按下 */
					printf("KEY_DOWN_WAKEUP\r\n");
					GPIO_ResetBits(GPIOF, GPIO_Pin_9);	/* 点亮LED1 */
					break;

				case KEY_DOWN_TAMPER:		/* Tamper键按下 */
					printf("KEY_DOWN_TAMPER\r\n");
					break;

				case KEY_DOWN_JOY_UP:		/* 摇杆UP键按下 */
					printf("KEY_DOWN_JOY_UP\r\n");
					bright += BRIGHT_STEP;
					if (bright > BRIGHT_MAX)
					{
						bright = BRIGHT_MAX;
					}
					SetBackLight(bright);
					printf("Open LCD BackLight. bright = % d \r\n", bright);
					break;

				case KEY_DOWN_JOY_DOWN:		/* 摇杆DOWN键按下 */
					printf("KEY_DOWN_JOY_DOWN\r\n");
				    if (bright < BRIGHT_STEP)
					{
						bright = 0;
					}
					else
					{
						bright -= BRIGHT_STEP;
					}
					SetBackLight(bright);
					printf("Open LCD BackLight. bright = % d \r\n", bright);
					break;

				case KEY_DOWN_JOY_LEFT:		/* 摇杆LEFT键按下 */
					printf("KEY_DOWN_JOY_LEFT\r\n");
				    if (status > 0)		  //如果程序状态不是初始化界面
					{
						status--;		   //则转到前一个界面
					}
					fRefresh = 1;		/* 请求刷新LCD */
					break;

				case KEY_DOWN_JOY_RIGHT:	/* 摇杆RIGHT键按下 */
					printf("KEY_DOWN_JOY_RIGHT\r\n");
				   if (status < DEMO_COUNT - 1)  //如果当前界面不是最后一个显示界面,
					{
						status++;				//则转到后一个显示界面
					} 
					else
					{
					status=0;
					}
					fRefresh = 1;		/* 请求刷新LCD */
					break;

				case KEY_DOWN_JOY_OK:		/* 摇杆OK键按下 */
					printf("KEY_DOWN_JOY_OK\r\n");
					GPIO_SetBits(GPIOF, GPIO_Pin_6);	/* 点亮LED1 */
					GPIO_SetBits(GPIOF, GPIO_Pin_7);	/* 点亮LED1 */
					GPIO_SetBits(GPIOF, GPIO_Pin_8);	/* 点亮LED1 */
					GPIO_SetBits(GPIOF, GPIO_Pin_9);	/* 点亮LED1 */
					break;

				default:
					printf("KEY_DOWN_UNKNOW\r\n");
					break;
					}
  
        }
	 	if (CheckTimer(0))
		{
			StartTimer(0, 300);	/* 启动下个定时周期 */

			value = GetADC();

			{
				static uint8_t pos = 0;

				if (pos == 0)
					printf("|");
				else if (pos == 1)
					printf("/");
				else if (pos == 2)
					printf("-");
				else if (pos == 3)
					printf("\\");		/* 注意:这个特殊字符需要转义 */

				if (++pos >= 4)
				{
					pos = 0;
				}

				printf("ADC(PC4) = %5d voltage = %4dmV\r\n",
					value, ((uint32_t)value * 3300) / 4095);

			}
		}
}
}
/*******************************************************************************
	函数名: DispTextDemo
	输  入:
	输  出:
	功能说明:显示文本Demo
*/
static void DispTextDemo(void)
{
	printf(" Display Text Demo \r\n");

	LCD_Clear(Blue);  		/* 清屏,背景蓝色 */
	LCD_SetBackColor(Blue);	/* 设置文字背景颜色 */

	LCD_SetTextColor(White);	/* 设置文字颜色 */
	LCD_DisplayString(50, Line0, "Display Text Demo");

	LCD_SetTextColor(Yellow);
	LCD_DisplayString(50, Line1, "STM32F103ZE-EK");

	LCD_SetTextColor(Red);
	LCD_DisplayString(50, Line2, "www.armfly.com");

}

/*******************************************************************************
	函数名: DispSharpDemo
	输  入:
	输  出:
	功能说明:显示图形Demo
*/
static void DispSharpDemo(void)
{
	printf(" Display Sharp Demo \r\n");

	LCD_Clear(Blue);  		/* 清屏,背景蓝色 */

	LCD_SetTextColor(White);	/* 设置文字颜色 */
	LCD_DisplayString(50, Line0, "Display Sharp Demo");

	/* 在 (100,100)处画个半径45的园 */
	LCD_DrawCircle(100,150, 50);

	/* 在 (50,100)处画个高20,宽40的矩形 */
	LCD_DrawRect(50,100, 20, 40);
}

/*******************************************************************************
	函数名: DispPicDemo
	输  入:
	输  出:
	功能说明:显示Flash中的位图
*/
static void DispPicDemo(void)
{
	printf(" Display BMP Demo \r\n");

	/* 设置起始坐标 */
	LCD_SetCursor(0, 0);

	/* 装载图片数据到显存 */
	LCD_WriteBMP((const uint16_t *)gImage_1);
}

/*******************************************************************************
	函数名: DispTextOnPic
	输  入:
	输  出:
	功能说明:在位图上叠加文字
*/
static void DispTextOnPic(void)
{
	printf(" Display Text 1 on the picture\r\n");

	/* 设置起始坐标 */
	LCD_SetCursor(0, 0);

	/* 装载北京图片数据到显存 */
	LCD_WriteBMP((const uint16_t *)gImage_1);

	LCD_SetTransparent(1);	/* 设置文字背景透明 */

	LCD_SetTextColor(White);	/* 设置文字颜色 */
	LCD_DisplayString(10, Line0, "Display Text On Picture");
	LCD_DisplayString(50, Line2, "www.armfly.com");

	LCD_SetTransparent(0); /* 设置文字背景不透明 */
}

/*******************************************************************************
	函数名: DispWaveDemo
	输  入: 无
	输  出: 无
	功能说明: 显示波形的Demo
*/
static void DispWaveDemo(void)
{
	POINT_T offset;	/* 波形偏移坐标 */

	printf(" Display Wave Demo\r\n");

	LCD_Clear(Black);  			/* 清屏,背景蓝色 */

	LCD_SetTextColor(White);	/* 设置文字颜色 */
	LCD_DisplayString(100, Line0, "Display Wave");

	offset.x = 0;
	offset.y = 50;
	LCD_DrawPoints(offset, (POINT_T *)g_SineWave, sizeof(g_SineWave) / sizeof(POINT_T), Yellow);

	offset.x = 128;
	offset.y = 50;
	LCD_DrawPoints(offset, (POINT_T *)g_SineWave, sizeof(g_SineWave) / sizeof(POINT_T), Yellow);

	offset.x = 128 + 128;
	offset.y = 50;
	LCD_DrawPoints(offset, (POINT_T *)g_SineWave, sizeof(g_SineWave) / sizeof(POINT_T), Yellow);
}
static void DispFirstPage(void)
{
	uint16_t y;
	uint16_t LineCap;

	printf(" Display Chinese Demo \r\n");

	LCD_Clear(Blue);  		/* 清屏,背景蓝色 */
	LCD_SetBackColor(Blue);	/* 设置文字背景颜色 */

	LCD_SetTextColor(White);	/* 设置文字颜色 */
	y = 0;
	LineCap = 18; /* 行间距 */
	LCD_DisplayString(20, y, "安富莱STM32F103ZE-EK开发板  www.armfly.com");
	y += LineCap;
	LCD_SetTextColor(Yellow);
	LCD_DisplayString(30, y, "QQ:1285744630     Email:armfly@qq.com");
	y += LineCap;
	
	y += LineCap;

	LCD_DisplayString(30, y, "操作提示:");
	y += LineCap;
	LCD_DisplayString(50, y, "摇杆上键 = 增加背光亮度");
	y += LineCap;
	LCD_DisplayString(50, y, "摇杆下键 = 降低背光亮度");
	y += LineCap;
	LCD_DisplayString(50, y, "摇杆左键 = 向前翻页");
	y += LineCap;
	LCD_DisplayString(50, y, "摇杆右键 = 向后翻页");
	y += LineCap;
	LCD_DisplayString(50, y, "摇杆OK键 = 返回首页");
	y += LineCap;

	y += LineCap;
	LCD_SetTextColor(Yellow);
	LCD_DisplayString(5, y, "显示器分辨率 :400x240");
	y += LineCap;
	LCD_DisplayString(5, y, "每行可以显示25个汉字,或50个字符");
}
static void DispAsciiDot(void)
{
	uint8_t i,k;
	uint16_t x,y;
	uint8_t buf[32 + 1];
	uint8_t ascii;

	LCD_Clear(Blue);  		/* 清屏,背景蓝色 */
	LCD_SetBackColor(Blue);	/* 设置文字背景颜色 */

	LCD_SetTextColor(White);	/* 设置文字颜色 */

	printf(" Display ASCII Dot\r\n");
	LCD_DisplayString(50, Line0, "16点阵ASCII码字库,代码1-127");

	LCD_SetTextColor(Yellow);	/* 设置文字颜色 */
	x = 50;
	y = 40;
	ascii = 0;
	for (i = 0; i < 4; i++)
	{
		for (k = 0; k < 32; k++)
		{
			buf[k] = ascii++;
		}
		buf[32] = 0;
		if (buf[0] == 0)
		{
			buf[0] = ' ';
		}
		LCD_DisplayString(x, y, buf);
		y += 20;
	}
}
static void DispHZK16(uint8_t _Index)
{
	uint8_t i,k;
	uint16_t x,y;
	uint8_t buf[50 + 1];
	uint8_t code1,code2;	/* 汉字内码 */
	uint8_t LineCap = 20;

	printf(" Display HZK Area Code = %d\r\n", _Index - 1);

	if (_Index == 2)
	{
		/* 第1次清屏,以后显示位置不变,可以不清屏,避免闪烁 */
		LCD_Clear(Blue);  		/* 清屏,背景蓝色 */
	}
	LCD_SetBackColor(Blue);	/* 设置文字背景颜色 */
	LCD_SetTextColor(White);	/* 设置文字颜色 */

	y = 0;
	LCD_DisplayString(20, y, "国标GB2312 16点阵汉字库(区码1-87,位码1-94)");

	code1 = _Index - 1; /* 得到区码 */
	code2 = 1;	/* 位码从1开始 */

	y += LineCap;
	sprintf((char *)buf, (char *)"当前区码: %2d, 本页位码:1-94", code1);
	LCD_DisplayString(20, y, buf);
	y += (2 * LineCap);

	/*
		机内码高位 = 区码 + 0xA0
		机内码低位 = 位码 + 0xA0

		区码范围 :1 - 87
		位码范围 : 1 - 94

		每行显示20个汉字,一个区是94个汉字,需要5行显示,第5行显示14个汉字
	*/

	LCD_SetTextColor(Yellow);	/* 设置文字颜色 */
	x = 40;
	code1 += 0xA0;	/* 换算到内码高位 */
	code2 = 0xA1;	/* 内码低位起始 */
	for (i = 0; i < 5; i++)
	{
		for (k = 0; k < 20; k++)
		{
			buf[2 * k] = code1;
			buf[2 * k + 1] = code2;
			code2++;
			if ((i == 4) && (k == 13))
			{
				k++;
				break;
			}
		}
		buf[2 * k] = 0;
		LCD_DisplayString(x, y, buf);
		y += LineCap;
	}
}

#ifdef  USE_FULL_ASSERT

void assert_failed(uint8_t* file, uint32_t line)
{ 

  while (1)
  {
  }
}

#endif
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -