📄 test1.c
字号:
{
if(time_setup.year/400!=0) //非闰年
{
if(time_setup.date == non_leap_month[time_setup.month-1])
time_setup.date=1;
else
time_setup.date++;
}
else //闰年
{
if(time_setup.date == leap_month[time_setup.month-1])
time_setup.date=1;
else
time_setup.date++;
}
}
else if( ReadKey(3) == 1 ) //检测到KEY3按下时,递减
{
if(time_setup.date == 1)
{
if(time_setup.year/400!=0)
{
time_setup.date=non_leap_month[time_setup.month-1];
}
else
{
time_setup.date=leap_month[time_setup.month-1];
}
}
else
time_setup.date--;
}
else if( ReadKey(4) == 1 ) // 检测到KEY4按下时,确认设置的日并刷新时间
{
time = time_setup;
Disp_Status = 4;
}
}
}
// 0000年~9999年星期算法
unsigned char WeekDay(unsigned char c, unsigned char y, unsigned char m,unsigned char d)
{
unsigned char WeekTab[] = {//闰年月星期表
(3 << 5) + 31,//1月
(6 << 5) + 29,//2月
(0 << 5) + 31,//3月
(3 << 5) + 30,//4月
(5 << 5) + 31,//5月
(1 << 5) + 30,//6月
(3 << 5) + 31,//7月
(6 << 5) + 31,//8月
(1 << 5) + 30,//9月
(4 << 5) + 31,//10月
(0 << 5) + 30,//11月
(2 << 5) + 31 //12月
};
unsigned char week, day;
c &= 0x03; //百年%4
c = c | (c << 2); //百年%4*5
day = WeekTab[m - 1]; //月表
week = day >> 5; //月星期数
day &= 0x1f; //月天数
if ((m < 3) && !((c == 0) | (y & ((y & 0x03) == 0)))) //平年
{
if (m == 2) day--; //平年月天数
week++; //平年月表+1
}
y = y + (y >> 2); //年+年/4
week = (week + c + y + d + 2) % 7; //(星期=百年%4*5+年+年/4+月表+日+2)%7
return week; //返回星期
}
void Task_Disp(void)
{
unsigned int ulTemp;
signed int lTemp;
unsigned char D1,D2,D3,D4;
static unsigned char time_temp; // 控制数字或间隔符的抖动
switch ( Disp_Status ) // 根据LCD的状态显示不同的画面
{
case 1: // 显示正常的时间
if( time.hour > 11) // 用12进制显示时间
{
Lcd_Seg.Sign = LCD_PM; // 如果是下午,则显示PM
Lcd_Seg.D1 = HexToSeg((time.hour-12)/10);
Lcd_Seg.D2 = HexToSeg((time.hour-12)%10);
}
else
{
Lcd_Seg.Sign = LCD_AM; // 如果是上午,则显示AM
Lcd_Seg.D1 = HexToSeg(time.hour/10);
Lcd_Seg.D2 = HexToSeg(time.hour%10);
}
Lcd_Seg.D3 = HexToSeg(time.minute/10);
Lcd_Seg.D4 = HexToSeg(time.minute%10);
if( time_temp == time.second ) // 实现闪动":"
Lcd_Seg.Sign |= LCD_DOT;
else
{
time_temp = time.second;
Lcd_Seg.Sign |= 0;
}
delay(500); // 接近0.5秒的延时
break;
case 2: //星期
time.week = WeekDay(time.year/100, time.year%100, time.month, time.date);
Lcd_Seg.D1 = 0;
Lcd_Seg.D2 = 0;
Lcd_Seg.D3 = 0;
Lcd_Seg.D4 = HexToSeg(time.week%10);
Lcd_Seg.Sign = 0;
break;
case 3: //年
Lcd_Seg.D1 = HexToSeg(time.year/1000);
Lcd_Seg.D2 = HexToSeg(time.year/100%10);
Lcd_Seg.D3 = HexToSeg(time.year/10%10);
Lcd_Seg.D4 = HexToSeg(time.year%10);
Lcd_Seg.Sign = LCD_YEAR;
break;
case 4: //月/日
Lcd_Seg.D1 = HexToSeg(time.month/10);
Lcd_Seg.D2 = HexToSeg(time.month%10)+LCD_DP;
Lcd_Seg.D3 = HexToSeg(time.date/10);
Lcd_Seg.D4 = HexToSeg(time.date%10);
Lcd_Seg.Sign = LCD_MON | LCD_DAY;
break;
case 5: // 秒表
if( time_second.second == 60 ) // 60进制的秒
{
time_second.second = 0;
time_second.minute++;
}
if( time_second.minute == 60 ) // 到60分时,停止计时
Start_Time = 0;
Lcd_Seg.D1 = HexToSeg(time_second.minute/10);
Lcd_Seg.D2 = HexToSeg(time_second.minute%10);
Lcd_Seg.D3 = HexToSeg(time_second.second/10);
Lcd_Seg.D4 = HexToSeg(time_second.second%10);
Lcd_Seg.Sign = LCD_DOT;
break;
case 6: // 显示CPU的工作温度
lTemp= GetTemp(); // 获取温度值
if( lTemp >= 0 )
{ ulTemp = 1;}
else
{ ulTemp = 0; lTemp =lTemp*(-1); }
D1 = (unsigned char) (lTemp/1000);
D2 = (unsigned char) ((lTemp-D1*1000)/100);
D3 = (unsigned char) ((lTemp-D1*1000-D2*100)/10);
D4 = (unsigned char) (lTemp-D1*1000-D2*100-D3*10);
Lcd_Seg.D1 = HexToSeg(D1);
Lcd_Seg.D2 = HexToSeg(D2)+LCD_DP;
Lcd_Seg.D3 = HexToSeg(D3);
Lcd_Seg.D4 = HexToSeg(D4);
if( ulTemp>0 ) // 正负号的判断和显示
{ Lcd_Seg.Sign = LCD_PLUS + LCD_TMP; }
else
{ Lcd_Seg.Sign = LCD_MINUS + LCD_TMP; }
delay(500); //延时0.5秒左右刷新一次
break;
case 7: // 设置时间的小时
if( time_setup.hour > 11) // 12进制显示
{
Lcd_Seg.Sign = LCD_PM; // 下午,则显示PM
if( time_temp == 1 ) // 闪动正在设置的小时的数据
{
time_temp = 0;
Lcd_Seg.D1 = HexToSeg((time_setup.hour-12)/10);
Lcd_Seg.D2 = HexToSeg((time_setup.hour-12)%10);
}
else
{
Lcd_Seg.D1 = 0;
Lcd_Seg.D2 = 0;
time_temp = 1;
}
}
else
{
Lcd_Seg.Sign = LCD_AM; // 上午,则显示AM
if( time_temp == 1 ) // 闪动正在设置的小时的数据
{
time_temp = 0;
Lcd_Seg.D1 = HexToSeg(time_setup.hour/10);
Lcd_Seg.D2 = HexToSeg(time_setup.hour%10);
}
else
{
Lcd_Seg.D1 = 0;
Lcd_Seg.D2 = 0;
time_temp = 1;
}
}
Lcd_Seg.D3 = HexToSeg(time_setup.minute/10);
Lcd_Seg.D4 = HexToSeg(time_setup.minute%10);
Lcd_Seg.Sign |= LCD_DOT;
delay(200);
break;
case 8: // 设置时间的分
if( time_temp == 1 ) // 闪动正在设置的分钟的数据
{
time_temp = 0;
Lcd_Seg.D3 = HexToSeg(time_setup.minute/10);
Lcd_Seg.D4 = HexToSeg(time_setup.minute%10);
}
else
{
Lcd_Seg.D3 = 0;
Lcd_Seg.D4 = 0;
time_temp = 1;
}
if( time_setup.hour > 11) // 以12进制显示时间
{
Lcd_Seg.Sign = LCD_PM;
Lcd_Seg.D1 = HexToSeg((time_setup.hour-12)/10);
Lcd_Seg.D2 = HexToSeg((time_setup.hour-12)%10);
}
else
{
Lcd_Seg.Sign = LCD_AM;
Lcd_Seg.D1 = HexToSeg(time_setup.hour/10);
Lcd_Seg.D2 = HexToSeg(time_setup.hour%10);
}
Lcd_Seg.Sign |= LCD_DOT;
delay(200);
break;
case 9: //年
Lcd_Seg.Sign = LCD_YEAR;
if( time_temp == 1 ) // 闪动正在设置的年的数据
{
time_temp = 0;
Lcd_Seg.D1 = HexToSeg(time_setup.year/1000);
Lcd_Seg.D2 = HexToSeg(time_setup.year/100%10);
Lcd_Seg.D3 = HexToSeg(time_setup.year/10%10);
Lcd_Seg.D4 = HexToSeg(time_setup.year%10);
}
else
{
Lcd_Seg.D1 = 0;
Lcd_Seg.D2 = 0;
Lcd_Seg.D3 = 0;
Lcd_Seg.D4 = 0;
time_temp = 1;
}
Lcd_Seg.Sign = LCD_YEAR;
delay(200);
break;
case 10: //月
Lcd_Seg.Sign = LCD_MON;
if( time_temp == 1 ) // 闪动正在设置的月的数据
{
time_temp = 0;
Lcd_Seg.D1 = HexToSeg(time_setup.month/10);
Lcd_Seg.D2 = HexToSeg(time_setup.month%10)+LCD_DP;
}
else
{
Lcd_Seg.D1 = 0;
Lcd_Seg.D2 = LCD_DP;
time_temp = 1;
}
Lcd_Seg.D3 = HexToSeg(time_setup.date/10);
Lcd_Seg.D4 = HexToSeg(time_setup.date%10);
Lcd_Seg.Sign |= LCD_DP;
delay(200);
break;
case 11: //日
Lcd_Seg.Sign = LCD_DAY;
if( time_temp == 1 ) // 闪动正在设置的日的数据
{
time_temp = 0;
Lcd_Seg.D3 = HexToSeg(time_setup.date/10);
Lcd_Seg.D4 = HexToSeg(time_setup.date%10);
}
else
{
Lcd_Seg.D3 = 0;
Lcd_Seg.D4 = 0;
time_temp = 1;
}
Lcd_Seg.D1 = HexToSeg(time_setup.month/10);
Lcd_Seg.D2 = HexToSeg(time_setup.month%10)+LCD_DP;
Lcd_Seg.Sign |= LCD_DP;
delay(200);
break;
default:
break;
}
Data_Time();
Lcd_Update(); // 刷新LCD的内容
delay( 100 ); // 延时
}
int main(void)
{
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_6MHZ); // 设定晶振为时钟源
// KEY2,PA5 KEY4,PA4
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_4 | GPIO_PIN_5, GPIO_DIR_MODE_IN);
// KEY1,PD4
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
GPIODirModeSet(GPIO_PORTD_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN);
// KEY3 ,PB5
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_5, GPIO_DIR_MODE_IN);
// 设置PD7为LED1的输入口,以显示1秒的跳动
GPIODirModeSet(GPIO_PORTD_BASE, LED1 , GPIO_DIR_MODE_OUT);
GPIOPinWrite(GPIO_PORTD_BASE, LED1,LED1); // 点亮LED
//中断优先级分配 (错的)
//IntPrioritySet(INT_I2C,0x04<<5);
//IntPrioritySet(INT_TIMER1A,0x05<<5);
Timer1a_int(2); // 初始化TIMER1A
I2CInit(100000, 1); // 初始化I2C
ADCInit(); // 初始化ADC
if(PCF8576_Ini(MODE_E, NOGLITTER)!=1) // 初始化液晶屏
{
while(1); // 初始化不成功,则在此等待
}
Lcd_Clean(); // 清屏
//初始化时间
time.year = 2007;
time.month = 4;
time.date = 13;
time.hour=16;
time.minute=23;
time.second=0;
while(1)
{
Manage_Key(); // 按键处理及界面切换
Task_Disp(); // 显示各状态
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -