📄 main.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 + -