main.c
/*
程序说明: 蓝桥杯大赛嵌入式-第十届省赛-电压检测仪
软件环境: Keil uVision 4.11
硬件环境: CT117E嵌入式竞赛板(代码兼容ILI932X系列、uc8230液晶控制器)
日 期: 2020年10月14日
作 者: lishan
*/
#include "stm32f10x.h"
#include "lcd.h"
#include "stdio.h"
#include "led.h"
#include "timer.h"
#include "adc.h"
#include "key.h"
#include "led.h"
#include "i2c.h"
//设为1,先将默认值保存到eeprom存储器,再读取
//设为0,直接读取eeprom存储器保存的值
# define first_dowload 0
u32 TimingDelay = 0;
u8 data_buf[20];
u16 data = 0;
u16 adc_value = 0;
float volt_value = 3.22;
u8 Status = 0;
float max_volt_value = 2.4;
float min_volt_value = 1.2;
u8 upper_led = 1;
u8 lower_led = 2;
u8 upper_led_flag = 0;
u8 lower_led_flag = 0;
void Delay_Ms(u32 nTime);
void Show_Data(void);
void Show_Setting(void);
void LED_Status(void);
void Time_Polling(void);
void Save_Data(void);
void Load_Data(void);
//Main Body
int main(void)
{
SysTick_Config(SystemCoreClock/1000);
Delay_Ms(200);
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
LED_Init();
TIM4_Init();
ADC_Channel_8_Init();
KEY_Init();
i2c_init();
Load_Data();
while(1)
{
if(Set)
{
Show_Setting();
}
else
{
Show_Data();
}
Time_Polling();
LED_Status();
Save_Data();
}
}
//
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
void Load_Data(void)
{
if(first_dowload)
{
Write_AT24c02(0x01,(u16)(max_volt_value*100) / 256 );
Delay_Ms(5);
Write_AT24c02(0x02,(u16)(max_volt_value*100) % 256);
Delay_Ms(5);
Write_AT24c02(0x03,(u16)(min_volt_value*100) / 256);
Delay_Ms(5);
Write_AT24c02(0x04,(u16)(min_volt_value*100) % 256);
Delay_Ms(5);
Write_AT24c02(0x05,upper_led);
Delay_Ms(5);
Write_AT24c02(0x06,lower_led);
Delay_Ms(5);
}
max_volt_value = (Read_AT24c02(0x01) * 256 + Read_AT24c02(0x02))/100.f;
min_volt_value = (Read_AT24c02(0x03) * 256 + Read_AT24c02(0x04))/100.f;
upper_led = Read_AT24c02(0x05);
lower_led = Read_AT24c02(0x06);
}
void Save_Data(void)
{
if(Save)
{
Save = 0;
Write_AT24c02(0x01,(u16)(max_volt_value*100) / 256 );
Delay_Ms(5);
Write_AT24c02(0x02,(u16)(max_volt_value*100) % 256);
Delay_Ms(5);
Write_AT24c02(0x03,(u16)(min_volt_value*100) / 256);
Delay_Ms(5);
Write_AT24c02(0x04,(u16)(min_volt_value*100) % 256);
Delay_Ms(5);
Write_AT24c02(0x05,upper_led);
Delay_Ms(5);
Write_AT24c02(0x06,lower_led);
Delay_Ms(5);
}
}
void Time_Polling(void)
{
if(flag_200ms)
{
flag_200ms = 0;
if(upper_led_flag)
{
LED_Toggling(1<<(7+upper_led));
}
else if(lower_led_flag)
{
LED_Toggling(1<<(7+lower_led));
}
}
if(flag_100ms)
{
flag_100ms = 0;
adc_value = ADC_GetConversionValue(ADC1);
volt_value = adc_value * 3.3 / 4095;
}
if(flag_10ms)
{
flag_10ms = 0;
KEY_Read();
KEY_Process();
Status_Update();
}
}
void LED_Status(void)
{
if(volt_value > max_volt_value)
{
upper_led_flag = 1;
Status = 2;
}
else if(volt_value < min_volt_value)
{
lower_led_flag = 1;
Status = 1;
}
else
{
upper_led_flag = 0;
lower_led_flag = 0;
LED_COntrol(0xFF00,0);
Status = 0;
}
}
void Show_Data(void)
{
sprintf((char*)data_buf, " Main ");
LCD_DisplayStringLine(Line2, data_buf);
sprintf((char*)data_buf, " Volt: %.2fV ", volt_value);
LCD_DisplayStringLine(Line4, data_buf);
if(Status == 0)
{
LCD_DisplayStringLine(Line5, " Status: Normal ");
}
else if(Status == 1)
{
LCD_DisplayStringLine(Line5, " Status: Lower ");
}
else if(Status == 2)
{
LCD_DisplayStringLine(Line5, " Status: Upper ");
}
}
void Show_Setting(void)
{
sprintf((char*)data_buf, " Setting ");
LCD_DisplayStringLine(Line2, data_buf);
if(Choose == 0)
{
LCD_SetBackColor(Green);
LCD_SetTextColor(Red);
sprintf((char*)data_buf, " Max Volt: %.2fV ", max_volt_value);
LCD_DisplayStringLine(Line4, data_buf);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
sprintf((char*)data_buf, " Min Volt: %.2fV ", min_volt_value);
LCD_DisplayStringLine(Line5, data_buf);
sprintf((char*)data_buf, " Upper: LD%d ", upper_led);
LCD_DisplayStringLine(Line6, data_buf);
sprintf((char*)data_buf, " Lower: LD%d ", lower_led);
LCD_DisplayStringLine(Line7, data_buf);
}
else if(Choose == 1)
{
sprintf((char*)data_buf, " Max Volt: %.2fV ", max_volt_value);
LCD_DisplayStringLine(Line4, data_buf);
LCD_SetBackColor(Green);
LCD_SetTextColor(Red);
sprintf((char*)data_buf, " Min Volt: %.2fV ", min_volt_value);
LCD_DisplayStringLine(Line5, data_buf);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
sprintf((char*)data_buf, " Upper: LD%d ", upper_led);
LCD_DisplayStringLine(Line6, data_buf);
sprintf((char*)data_buf, " Lower: LD%d ", lower_led);
LCD_DisplayStringLine(Line7, data_buf);
}
else if(Choose == 2)
{
sprintf((char*)data_buf, " Max Volt: %.2fV ", max_volt_value);
LCD_DisplayStringLine(Line4, data_buf);
sprintf((char*)data_buf, " Min Volt: %.2fV ", min_volt_value);
LCD_DisplayStringLine(Line5, data_buf);
LCD_SetBackColor(Green);
LCD_SetTextColor(Red);
sprintf((char*)data_buf, " Upper: LD%d ", upper_led);
LCD_DisplayStringLine(Line6, data_buf);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
sprintf((char*)data_buf, " Lower: LD%d ", lower_led);
LCD_DisplayStringLine(Line7, data_buf);
}
else if(Choose == 3)
{
sprintf((char*)data_buf, " Max Volt: %.2fV ", max_volt_value);
LCD_DisplayStringLine(Line4, data_buf);
sprintf((char*)data_buf, " Min Volt: %.2fV ", min_volt_value);
LCD_DisplayStringLine(Line5, data_buf);
sprintf((char*)data_buf, " Upper: LD%d ", upper_led);
LCD_DisplayStringLine(Line6, data_buf);
LCD_SetBackColor(Green);
LCD_SetTextColor(Red);
sprintf((char*)data_buf, " Lower: LD%d ", lower_led);
LCD_DisplayStringLine(Line7, data_buf);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
}
}
key.c
/*
程序说明: CT117E嵌入式竞赛板KEY驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT117E嵌入式竞赛板(代码兼容ILI932X系列、uc8230液晶控制器)
日 期: 2013-10-9
*/
#include "key.h"
#include "lcd.h"
#include "led.h"
u8 Trg = 0;
u8 Cont = 0;
u8 Set = 0;
u8 Choose = 0;
u8 key1_time = 0;
u8 key2_time = 0;
u8 key3_time = 0;
u8 key4_time = 0;
u8 key1_press = 0;
u8 key2_press = 0;
u8 key3_press = 0;
u8 key4_press = 0;
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void KEY_Read(void)
{
u8 ReadData = ~(KEYPORT);
Trg = ReadData & (ReadData ^ Cont);
Cont = ReadData;
}
void KEY_Process(void)
{
if(Cont == 0x01){++key1_time;}
else if(Cont == 0x02){++key2_time;}
else if(Cont == 0x04){++key3_time;}
else if(Cont == 0x08){++key4_time;}
if(Trg == 0 && Cont == 0)
{
if(key1_time > 0){key1_press = 1;}
else if(key2_time > 0){key2_press = 1;}
else if(key3_time > 0){key3_press = 1;}
else if(key4_time > 0){key4_press = 1;}
}
}
void Status_Update(void)
{
if(key1_press) //设置
{
Set = (Set + 1) % 2;
Choose = 0;
LCD_Clear(Blue);
}
else if(Set && key2_press) //选择
{
Choose = (Choose + 1) % 4;
}
else if(Set && key3_press) //加
{
if(Choose == 0)
{
max_volt_value += 0.3;
if(max_volt_value >= 3.3)
{
max_volt_value = 3.3;
}
}
else if(Choose == 1)
{
min_volt_value += 0.3;
if(min_volt_value >= max_volt_value)
{
min_volt_value -= 0.3;
}
if(min_volt_value >= 3.3)
{
min_volt_value = 3.3;
}
}
else if(Choose == 2)
{
LED_COntrol(0xFF00,0);
if(++upper_led >= 8){upper_led = 8;} //正常加
if(upper_led == lower_led) //正常加后两个指示灯相等,再加1
{
if(++upper_led >= 8){upper_led = 8;}
}
if(upper_led == lower_led) //再加1后两个指示灯依然相等,减1
{
upper_led --;
}
}
else if(Choose == 3)
{
LED_COntrol(0xFF00,0);
if(++lower_led >= 8){lower_led = 8;} //正常加
if(upper_led == lower_led) //正常加后两个指示灯相等,再加1
{
if(++lower_led >= 8){lower_led = 8;}
}
if(upper_led == lower_led) //再加1后两个指示灯依然相等,减1
{
lower_led --;
}
}
}
else if(Set && key4_press) //减
{
if(Choose == 0)
{
max_volt_value -= 0.3;
if(min_volt_value >= max_volt_value)
{
max_volt_value += 0.3;
}
if(max_volt_value <= 0)
{
max_volt_value = 0;
}
}
else if(Choose == 1)
{
min_volt_value -= 0.3;
if(min_volt_value <= 0)
{
min_volt_value = 0;
}
}
else if(Choose == 2)
{
LED_COntrol(0xFF00,0);
if(--upper_led <= 1){upper_led = 1;} //正常减
if(upper_led == lower_led) //正常减后两个指示灯相等,再减1
{
if(--upper_led <= 1){upper_led = 1;}
}
if(upper_led == lower_led) //再减1后两个指示灯依然相等,加1
{
upper_led ++;
}
}
else if(Choose == 3)
{
LED_COntrol(0xFF00,0);
if(--lower_led <= 1){lower_led = 1;} //正常减
if(upper_led == lower_led) //正常减后两个指示灯相等,再减1
{
if(--lower_led <= 1){lower_led = 1;}
}
if(upper_led == lower_led) //再减1后两个指示灯依然相等,加1
{
lower_led ++;
}
}
}
if(Trg == 0 && Cont == 0)
{
key1_time = 0; key2_time = 0; key3_time = 0; key4_time = 0;
key1_press = 0; key2_press = 0; key3_press = 0; key4_press = 0;
}
}