MSP430cc2530简单万年历设计
`
msp430cc2530的简单万年历设计
主函数
二、使用步骤
1.主要代码
代码如下(示例):
#include "rtc.h"
#include "ioCC2530.h"
#include "stdarg.h"
#include "sys_init.h"
#include <string.h>
#include <stdio.h>
#include "DHT11.h"
#include "bmp280.h"
unsigned char time_data_alarm[2] = {0};
unsigned char time_data[10] = {0};
unsigned char time_data_set[2] = {0}; //存储时间
int data_weather[2] = {0}; //存天气的湿度和温度数
char data_weather_char[2]={0};//字符
char oled_show_data[30] = {0};
#define S1 (1 << 0)
#define S2 (1 << 1)
#define S3 (1 << 4)
#define S4 (1 << 5)
#define S5 (1 << 0)
#define S6 (1 << 1)
#define KEI1 P0_0 //设置按键
#define KEI2 P0_1 //确定按键
#define KEI3 P0_4 //+1
#define KEI4 P0_5 //+10
#define KEI5 P1_0
#define KEI6 P1_1
static void key_delay_us(void)
{
volatile unsigned short i;
for (i = 0; i < 1; i++)
{
asm("NOP");
}
}
void key_io_config_init(void)
{
P0SEL &= ~(S1 | S2 | S3 | S4);
P0DIR &= ~(S1 | S2 | S3 | S4);
P0INP &= ~(S1 | S2 | S3 | S4); // 0:上拉、1:下拉
P1SEL &= ~(S5 | S6);
P1DIR &= ~(S5 | S6);
P1INP &= ~(S5 | S6); // 0:上拉、1:下拉
}
unsigned int counter = 0;
unsigned char set_flag = 0;
unsigned char set_context = 0;
unsigned char set_tmp = 0;
unsigned char ID_data[] = "19401180111/106";//第九页显示ID
void main(void)
{
uchar temp[2];
uchar temp1[2];
xtal_init();
time1_init();
// led_init();
uart0_init(0x00, 0x00); //初始化串口:无奇偶校验,停止位为1位
key_io_config_init();
BMP280_S32_t tmp2;
double P_Result = 0;
unsigned char sta = 0;
unsigned int a = 0;
char data[20];
memset(data, 0, sizeof(data));
BMP_SPI_Init();
bmp280_init();
OLED_Init(); // OLED初始化
OLED_Clear();
ModifyTime(Decimal_BCD(22), Decimal_BCD(5), Decimal_BCD(11), Decimal_BCD(3), Decimal_BCD(7), Decimal_BCD(7), Decimal_BCD(0));
while (1)
{
sta = 0;
sta = bmp280_read(BMP_Status | BMP280_Read);
tmp2 = bmp280_read_Pdata();
P_Result = bmp280_compensate_P_double(tmp2);
// a=(int) P_Result;
// data[0]=a/100+0x30;
P_Result = P_Result / 1000;
a = (int)P_Result;
data[0] = a / 100 + 0x30;
a = a % 100;
data[1] = a / 10 + 0x30;
a = a % 10;
data[2] = a + 0x30;
data[3] = 'k';
memset(temp, 0, 3);
DHT11();
temp[0] = wendu_shi + 0x30;
temp[1] = wendu_ge + 0x30;
temp1[0] = shidu_shi + 0x30;
temp1[1] = shidu_ge + 0x30;
data_weather[0]= (temp[0]-'0')*10+(temp[1]-'0');//温度
data_weather[1]=(temp1[0]-'0')*10+(temp1[1]-'0');
// data_weather[1]=12;//湿度
//if (0 == (counter % 5)) // 50ms
//{
if (0 == KEI1)
{
key_delay_us();
if (0 == KEI1)
{
counter = 1;
if (set_flag)
{
set_context++;
}
else
{
set_flag = 1;
set_context = 0;
}
set_tmp = 0;
OLED_Clear();
OLED_ShowCHinese(16, 0, 7);
OLED_ShowCHinese(32, 0, 8);
memset(oled_show_data, 0, sizeof(oled_show_data));
sprintf(oled_show_data, "%02d", set_tmp);
switch (set_context)
{
case 0:
OLED_ShowCHinese(48, 0, 18);
OLED_ShowString_numstring_3232(32, 2, (unsigned char *)oled_show_data);
break;
case 1:
OLED_ShowCHinese(48, 0, 17);
OLED_ShowString_numstring_3232(32, 2, (unsigned char *)oled_show_data);
break;
case 2:
OLED_ShowCHinese(48, 0, 16);
OLED_ShowString_numstring_3232(32, 2, (unsigned char *)oled_show_data);
break;
case 3:
OLED_ShowCHinese(48, 0, 20);
OLED_ShowString_numstring_3232(32, 2, (unsigned char *)oled_show_data);
break;
case 4:
OLED_ShowCHinese(48, 0, 13);
OLED_ShowString_numstring_3232(32, 2, (unsigned char *)oled_show_data);
break;
case 5:
OLED_ShowCHinese(48, 0, 12);
OLED_ShowString_numstring_3232(32, 2, (unsigned char *)oled_show_data);
break;
case 6:
OLED_ShowCHinese(48, 0, 11);
OLED_ShowString_numstring_3232(32, 2, (unsigned char *)oled_show_data);
break;
case 7:
OLED_ShowCHinese(48, 0, 13);
OLED_ShowString1(0, 6, "alarm", 16);
OLED_ShowString_numstring_3232(32, 2, (unsigned char *)oled_show_data);
break;
case 8:
OLED_ShowCHinese(48, 0, 12);
OLED_ShowString1(0, 6, "alarm", 16);
OLED_ShowString_numstring_3232(32, 2, (unsigned char *)oled_show_data);
break;
case 9:
OLED_ShowString1(0, 0, (unsigned char *)ID_data, 16);//显示学号
break;
case 10://显示天气
OLED_Clear();
if(data_weather[0]>20&data_weather[1]>60)
{
OLED_ShowCHinese(48, 0, 24);
}
if(data_weather[0]>20&data_weather[1]<50)
{
OLED_ShowCHinese(48, 0, 23);
}
if(data_weather[0]>20&data_weather[1]>=50&data_weather[1]<=60)
{
OLED_ShowCHinese(48, 0, 22);
}
if(data_weather[0]<=20&data_weather[1]<=50)
{
OLED_ShowCHinese(48, 0, 23);
}
// else
// OLED_ShowCHinese(48, 0, 24);
break;
}
}
}
else if (0 == KEI2)
{
if (set_flag)
{
key_delay_us();
if (0 == KEI2)
{
counter = 1;
switch (set_context)
{
case 0:
ModifyTime_yea(Decimal_BCD(set_tmp));
time_data_set[0] = set_tmp + 2000;
break;
case 1:
ModifyTime_mon(Decimal_BCD(set_tmp));
time_data_set[1] = set_tmp;
break;
case 2:
ModifyTime_da(Decimal_BCD(set_tmp));
break;
case 3:
ModifyTime_week(Decimal_BCD(set_tmp));
break;
case 4:
ModifyTime_hours(Decimal_BCD(set_tmp));
break;
case 5:
ModifyTime_min(Decimal_BCD(set_tmp));
break;
case 6:
ModifyTime_sed(Decimal_BCD(set_tmp));
break;
case 7:
time_data_alarm[0] = set_tmp;
break;
case 8:
time_data_alarm[1] = set_tmp;
break;
}
set_tmp = 0;
OLED_Clear();
OLED_ShowCHinese(16, 0, 7);
OLED_ShowCHinese(32, 0, 8);
OLED_ShowCHinese(48, 0, 21);
OLED_ShowCHinese(64, 0, 22);
set_flag = 0;
OLED_Clear();
}
}
}
else if (0 == KEI3)
{
if (set_flag)
{
key_delay_us();
if (0 == KEI3)
{
counter = 1;
switch (set_context)
{
case 0:
if (set_tmp + 1 <= 99)
{
set_tmp += 1;
}
else
{
set_tmp = 0;
}
break;
case 1:
if (set_tmp + 1 <= 12)
{
set_tmp += 1;
}
else
{
set_tmp = 1;
}
break;
case 2:
if (time_data_set[1] == 1 | time_data_set[1] == 3 | time_data_set[1] == 5 | time_data_set[1] == 7 | time_data_set[1] == 8 | time_data_set[1] == 10 | time_data_set[1] == 12)
{
if (set_tmp + 1 <= 31)
{
set_tmp += 1;
}
else
{
set_tmp = 1;
}
}
if (time_data_set[1] == 2)
{
if ((time_data_set[0] % 4 != 0) || (time_data_set[0] % 100 == 0 && time_data_set[0] % 400 != 0))
{
if (set_tmp + 1 <= 28)
{
set_tmp += 1;
}
else
{
set_tmp = 0;
}
}
else
{
if (set_tmp + 1 <= 29)
{
set_tmp += 1;
}
else
{
set_tmp = 1;
}
}
}
else
{
if (set_tmp + 1 <= 30)
{
set_tmp += 1;
}
else
{
set_tmp = 1;
}
}
break;
case 3:
if (set_tmp + 1 <= 7)
{
set_tmp += 1;
}
else
{
set_tmp = 1;
}
break;
case 4:
if (set_tmp + 1 <= 24)
{
set_tmp += 1;
}
else
{
set_tmp = 0;
}
break;
case 5:
if (set_tmp + 1 <= 60)
{
set_tmp += 1;
}
else
{
set_tmp = 0;
}
break;
case 6:
if (set_tmp + 1 <= 60)
{
set_tmp += 1;
}
else
{
set_tmp = 0;
}
break;
case 7:
if (set_tmp + 1 <= 24)
{
set_tmp += 1;
}
else
{
set_tmp = 0;
}
break;
case 8:
if (set_tmp + 1 <= 60)
{
set_tmp += 1;
}
else
{
set_tmp = 0;
}
break;
}
memset(oled_show_data, 0, sizeof(oled_show_data));
sprintf(oled_show_data, "%02d", set_tmp);
OLED_ShowString_numstring_3232(32, 2, (unsigned char *)oled_show_data);
}
}
}
else if (0 == KEI4)
{
if (set_flag)
{
key_delay_us();
if (0 == KEI4)
{
counter = 1;
switch (set_context)
{
case 0:
if (set_tmp + 10 <= 99)
{
set_tmp += 10;
}
break;
case 1:
if (set_tmp + 10 <= 12)
{
set_tmp += 10;
}
break;
case 2:
if (set_tmp + 10 <= 30)
{
set_tmp += 10;
}
break;
case 3:
if (set_tmp + 10 <= 7)
{
set_tmp += 10;
}
break;
case 4:
if (set_tmp + 10 <= 24)
{
set_tmp += 10;
}
break;
case 5:
if (set_tmp + 10 <= 60)
{
set_tmp += 10;
}
break;
case 6:
if (set_tmp + 10 <= 60)
{
set_tmp += 10;
}
break;
case 7:
if (set_tmp + 10 <= 24)
{
set_tmp += 10;
}
break;
case 8:
if (set_tmp + 10 <= 60)
{
set_tmp += 10;
}
break;
}
memset(oled_show_data, 0, sizeof(oled_show_data));
sprintf(oled_show_data, "%02d", set_tmp);
OLED_ShowString_numstring_3232(32, 2, (unsigned char *)oled_show_data);
}
}
}
else if (0 == KEI5)
{
key_delay_us();
if (0 == KEI5)
{
}
}
else if (0 == KEI6)
{
key_delay_us();
if (0 == KEI6)
{
}
}
//}
if (set_flag)
{
if (0 == (counter % 200)) // 6s
{
set_flag = 0;
}
}
else
{
if (set_flag == 0)
{
counter = 0;
memset(time_data, 0, sizeof(time_data));
Read_RTC(time_data);
memset(oled_show_data, 0, sizeof(oled_show_data));
sprintf(oled_show_data, "%02d-%02d-%02d", BCD_Decimal(time_data[2]), BCD_Decimal(time_data[1]), BCD_Decimal(time_data[0]));
OLED_ShowString(32, 2, (unsigned char *)oled_show_data, 16);
memset(oled_show_data, 0, sizeof(oled_show_data));
sprintf(oled_show_data, "20%02d-%02d-%02d", BCD_Decimal(time_data[6]), BCD_Decimal(time_data[5]), BCD_Decimal(time_data[4]));
OLED_ShowString(28, 4, (unsigned char *)oled_show_data, 16);
OLED_ShowString1(0, 6, "temp:", 16);
OLED_ShowString1(40, 6, (unsigned char *)temp, 16);
OLED_ShowString1(56, 6, "pres:", 16);
OLED_ShowString1(96, 6, (unsigned char *)data, 16);
OLED_ShowString1(40, 0, "temp1:", 16);
OLED_ShowString1(90, 0, (unsigned char *)temp1, 16);
// Uart_Send_String(&data_weather);
if ((time_data_alarm[0] == BCD_Decimal(time_data[2]) & time_data_alarm[1] == BCD_Decimal(time_data[1])) | (BCD_Decimal(time_data[1]) == 0)) //||((BCD_Decimal(time_data[2])==0)))
{
OLED_ShowString1(0, 0, "ok:", 16);
OLED_Clear();
}
}
}
}
}
#pragma vector = T1_VECTOR
__interrupt void T1_ISR(void)
{
EA = 0; //关总中断
counter++;
// D6 = !D6;
T1IF = 0;
EA = 1; //开总中断
}
最终成果
总结
就随便写了写做了记录,就不做详细介绍了。