①、库文件
②、中断服务函数
void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
{
/* Clear the RTC Second interrupt */
RTC_ClearITPendingBit(RTC_IT_SEC);
/* Enable time update */
TimeDisplay = 1;
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Reset RTC Counter when Time is 23:59:59 本程序中 需将该句从主函数中移过来,否则rtc无
法显示00:00:00,至今尚未知道原因何在*/
if (RTC_GetCounter() == 0x0001517F)
{
RTC_SetCounter(0x0);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
}
}
}
u8 key=0,count=0;
void USART2_IRQHandler(void)
{
u8 temp;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
temp = USART_ReceiveData(USART2);
if(temp == 'k'||temp == 'K')
{
count++;
key=1;
}
else if(key==1)
{
count++;
if(count==4)
{
Receive=1;
Receive_Buff=temp;
key=0;
count=0;
}
}
}
}
③、主函数
#include "stm32f10x.h"
#include "lcd.h"
#include <stdio.h>
#include "init.h"
#include "i2c.h"
#define RB1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define RB2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)
#define RB3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)
#define RB4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)
u32 TimingDelay = 0;
u8 TimeDisplay=0;
u8 string[20];
u8 k;
extern u8 Receive,Receive_Buff;
uint32_t BHH = 0, BMM = 0, BSS = 0;
float ADC_Value;
u8 TX_Buff[20];
u8 LED1_Flag=1;
u8 shezhi=0;
u8 baojing=0;
u8 qie=0;
void Delay_Ms(u32 nTime);
void LCD_Init(void);
void GPIO_Int(void);
void KEY_Scan(void);
void Time_Display(uint32_t TimeVar);
void AD_Read(void);
unsigned char IIC_Read(unsigned char address);
void IIC_Write(unsigned add,unsigned char dat);
void USART_Send(u8 *str);
void LED1_Run(void);
int main(void)
{
LCD_Init();
GPIO_Int();
i2c_init();
if(IIC_Read(0x20)!=20)
{
Delay_Ms(5);
IIC_Write(0x00,1);
Delay_Ms(5);
IIC_Write(0x20,20);
}
Delay_Ms(5);
k=IIC_Read(0x00);
sprintf((char*)string," k : 0.%1d",k);
LCD_DisplayStringLine(Line3,string);
while (1)
{
KEY_Scan();
if(shezhi==0)
{
if(TimeDisplay==1)
{
TimeDisplay=0;
Time_Display(RTC_GetCounter());
AD_Read();
}
if(Receive==1)
{
Receive=0;
k=Receive_Buff-48;
sprintf((char*)string," k : 0.%1d",k);
LCD_DisplayStringLine(Line3,string);
Delay_Ms(5);
IIC_Write(0x00,k);
USART_Send("ok\n");
}
LCD_DisplayStringLine(Line9," 1");
}
if(baojing==1)
{
if(LED1_Flag==1)
{
LED1_Run();
}
else
{
GPIO_SetBits(GPIOC,GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_11 | GPIO_Pin_12| GPIO_Pin_13 | GPIO_Pin_14|GPIO_Pin_15);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
}
else if(baojing==0)
{
GPIO_SetBits(GPIOC,GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_11 | GPIO_Pin_12| GPIO_Pin_13 | GPIO_Pin_14|GPIO_Pin_15);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
}
}
void LED1_Run(void)
{
GPIO_SetBits(GPIOC,GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_11 | GPIO_Pin_12| GPIO_Pin_13 | GPIO_Pin_14|GPIO_Pin_15);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
Delay_Ms(200);
GPIO_SetBits(GPIOC,GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_11 | GPIO_Pin_12| GPIO_Pin_13 | GPIO_Pin_14|GPIO_Pin_15);
GPIO_ResetBits(GPIOC,GPIO_Pin_8);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
Delay_Ms(200);
}
void USART_Send(u8 *str)
{
u8 index=0;
do
{
USART_SendData(USART2,str[index++]);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
}while(str[index]!=0);
}
void KEY_Scan(void)
{
if(RB1==0)
{
Delay_Ms(10);
if(RB1==0)
{
if(shezhi==0)
{
if(LED1_Flag==1)
{
LED1_Flag=0;
LCD_DisplayStringLine(Line5," LED: OFF ");
}
else if(LED1_Flag==0)
{
LED1_Flag=1;
LCD_DisplayStringLine(Line5," LED: ON ");
}
}
}
while(!RB1);
}
else if(RB2==0)
{
Delay_Ms(10);
if(RB2==0)
{
if(shezhi==0)
{
shezhi=1;
LCD_DisplayStringLine(Line1,(unsigned char *)" ");
LCD_DisplayStringLine(Line6,(unsigned char *)" ");
LCD_DisplayStringLine(Line7,(unsigned char *)" ");
LCD_DisplayStringLine(Line3," Setting ");
sprintf((char*)string," %.2d-%.2d-%.2d",BHH,BMM,BSS);
LCD_DisplayStringLine(Line5,string);
LCD_DisplayStringLine(Line9," 2");
}
else if(shezhi==1)
{
shezhi=0;
LCD_DisplayStringLine(Line6,(unsigned char *)" ");
sprintf((char*)string," k : 0.%1d",k);
LCD_DisplayStringLine(Line3,string);
if(LED1_Flag==1)
{
LCD_DisplayStringLine(Line5," LED: ON ");
}
else if(LED1_Flag==0)
{
LCD_DisplayStringLine(Line5," LED: OFF ");
}
}
}
while(!RB2);
}
else if(R3==0)
{
Delay_Ms(10);
if(RB3==0)
{
if(shezhi==1)
{
if(qie==0|qie==3)
{
qie=1;
LCD_DisplayStringLine(Line6," ~~ ");
}
else if(qie==1)
{
qie=2;
LCD_DisplayStringLine(Line6," ~~ ");
}
else if(qie==2)
{
qie=3;
LCD_DisplayStringLine(Line6," ~~ ");
}
}
}
while(!RB3);
}
else if(RB4==0)
{
Delay_Ms(10);
if(RB4==0)
{
if(shezhi==1)
{
if(qie==1)
{
BHH+=1;
if(BHH==24) //注意时间的特殊格式
BHH=0;
}
else if(qie==2)
{
BMM+=1;
if(BMM==60)
BMM=0;
}
else if(qie==3)
{
BSS+=1;
if(BSS==60)
BSS=0;
}
sprintf((char*)string," %.2d-%.2d-%.2d",BHH,BMM,BSS);
LCD_DisplayStringLine(Line5,string);
}
}
while(!RB4);
}
}
void Time_Display(uint32_t TimeVar)
{
uint32_t THH = 0, TMM = 0, TSS = 0;
/* Compute hours */
THH = TimeVar / 3600;
/* Compute minutes */
TMM = (TimeVar % 3600) / 60;
/* Compute seconds */
TSS = (TimeVar % 3600) % 60;
if(THH==BHH)
{
if(TMM==BMM)
{
if(TSS==BSS)
{
sprintf((char*)TX_Buff,"%s%.2f+0.%0.1d+%0.2d%0.2d%0.2d\n","",ADC_Value,k,THH, TMM, TSS);//2.21+0.1+123030\n
USART_Send(TX_Buff);
}
}
}
sprintf((char*)string," T: %0.2d-%0.2d-%0.2d", THH, TMM, TSS);
LCD_DisplayStringLine(Line7,string);
}
void AD_Read(void)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
ADC_Value=ADC_GetConversionValue(ADC1)*3.3/0xfff;
sprintf((char*)string," V1: %.2fV",ADC_Value);
LCD_DisplayStringLine(Line1,string);
if(ADC_Value>k*3.3*0.1)
{
baojing=1 ;
}
else if(ADC_Value<k*3.3*0.1)
{
baojing=0 ;
}
}
unsigned char IIC_Read(unsigned char address)
{
unsigned char temp;
I2CStart();
I2CSendByte(0xa0);
I2CSendAck();
I2CSendByte(address);
I2CSendAck();
I2CStart();
I2CSendByte(0xa1);
I2CSendAck();
temp=I2CReceiveByte();
I2CSendAck();
I2CStop();
return temp;
}
void IIC_Write(unsigned add,unsigned char dat)
{
I2CStart();
I2CSendByte(0xa0);
I2CSendAck();
I2CSendByte(add);
I2CSendAck();
I2CSendByte(dat);
I2CSendAck();
I2CStop();
}
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
④、初始化函数
通常一个试题写下来往往会有700左右,为了回头修改函数的方便,提高效率,故特地兴建init.c与init.h函数从而使代码简洁
init.c
#include "stm32f10x.h"
#include "lcd.h"
#include <stdio.h>
#include "init.h"
#include "i2c.h"
void GPIO_Int(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
//LED
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_11 | GPIO_Pin_12| GPIO_Pin_13 | GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
//KEY
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_11 | GPIO_Pin_12| GPIO_Pin_13 | GPIO_Pin_14|GPIO_Pin_15);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
//RTC
PWR_BackupAccessCmd(ENABLE);
BKP_DeInit();
RCC_LSICmd(ENABLE); //注意
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();
RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_SEC, ENABLE);
RTC_WaitForLastTask();
RTC_SetPrescaler(39999);
RTC_WaitForLastTask();
RTC_SetCounter(3600*HH+60*MM+SS);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
NVIC_Configuration();
//ADC
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
/* ADC1 regular channel14 configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_13Cycles5); //对应PB0
/* Enable AWD interrupt */
ADC_ITConfig(ADC1, ADC_IT_AWD, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Enable ADC1 reset calibration register */
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));
/* Start ADC1 calibration */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//usart
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2, &USART_InitStructure);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
USART_Cmd(USART2, ENABLE);
GPIO_InitStructure.GPIO_Pin = USARTz_RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = USARTz_TxPin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void LCD_Init(void)
{
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
SysTick_Config(SystemCoreClock/1000);
LCD_DisplayStringLine(Line0," ");
LCD_DisplayStringLine(Line1," V1: 1.84V ");
LCD_DisplayStringLine(Line2," ");
LCD_DisplayStringLine(Line3," k : 0.1 ");
LCD_DisplayStringLine(Line4," ");
LCD_DisplayStringLine(Line5," LED: ON ");
LCD_DisplayStringLine(Line6," ");
LCD_DisplayStringLine(Line7," T:23-59-55 ");
LCD_DisplayStringLine(Line8," ");
LCD_DisplayStringLine(Line9," ");
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Enable the RTC Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the USART2 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
init.h
#ifndef __INIT_H
#define __INIT_H
#define HH 23
#define MM 59
#define SS 55
#define USARTz_RxPin GPIO_Pin_3
#define USARTz_TxPin GPIO_Pin_2
void GPIO_Int(void);
void LCD_Init(void);
void NVIC_Configuration(void);
#endif