📄 main.c
字号:
#include <pic.h>
#define uint unsigned int
#define uchar unsigned char
//**********函数声明*************
void Init_LCD(void);
void LCD_Clear(void);
void delay_nms(unsigned int);
void LCD_DisplayString (char, char ,unsigned char*);
void LCD_DisplayCharacter(char);
void LCD_WriteControl(uchar);
void tmr1_init(void);
void ad_init(void);
void set_key(void);
void add_key(void);
void reduce_key(void);
void right_key(void);
void left_key(void);
uchar key_result(void);
uchar get_key(void);
void time_seting(void);
//****************************************
uchar test1[]="Designer:Zhaobao";
uchar test2[]="Electronics 04-1";
bank2 uchar i=0;
bank2 uint count=0; //tmr1计数,计满1000为一秒
bank2 uchar ad_key_result; //存放ADKEY转换的值
bank2 uchar shift=0,add=0,reduce=0,set=0; //各个功能键
bank2 uchar key; //存放键值
bank2 uchar second=0,minute=0,hour=0,day=1,month=1;
bank2 uint year=2008;
bank2 uchar tian1[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //平年
bank2 uchar tian2[12]={31,29,31,30,31,30,31,31,30,31,30,31}; //平闰
//*********tmr1中断*****************
void interrupt time(void)
{TMR1H=0xfc;
TMR1L=0x18; //1ms
TMR1IF=0;
count++;
if(count>1000)
{
count=0;
second++;
if(second>=60)
{
second=0;
minute++;
if(minute>=60)
{
minute=0;
hour++;
if(hour>=24)
{
hour=0;
day++;
if((year%4==0)&&(year%100!=0)||(year%400==0)) //判断闰年
{ if(day>tian2[month-1]) //闰年
{
day=1;
month++;
}
}
else if(day>tian1[month-1]) //非闰年
{
day=1;
month++;
}
if(month>=13)
{
month=1;
year++;
}
}
}
}
}
}
//*****************时间显示*******************
void time_display()
{
uchar temp1[]=" ";
uchar temp2[]=" ";
uchar temp3[]="SET ";
LCD_WriteControl(0x80); //起始地址
switch(shift)
{
case 1:LCD_DisplayCharacter('M');break;
case 2:LCD_DisplayCharacter('F');break;
case 3:LCD_DisplayCharacter('S');break;
case 4:LCD_DisplayCharacter('R');break;
case 5:LCD_DisplayCharacter('Y');break;
case 6:LCD_DisplayCharacter('N');break;
default:LCD_DisplayCharacter(' ');break;
}
LCD_DisplayString(1,2,temp2);
LCD_DisplayCharacter(year/1000+0x30); //年的千位
LCD_DisplayCharacter((year%1000)/100+0x30); //年的百位
LCD_DisplayCharacter(((year%1000)%100)/10+0x30); //年的十位
LCD_DisplayCharacter(((year%1000)%100)%10+0x30); //年的个位
LCD_DisplayCharacter(' ');
LCD_DisplayCharacter(month/10+0x30); //月的十位
LCD_DisplayCharacter(month%10+0x30); //月的个位
LCD_DisplayCharacter('-');
LCD_DisplayCharacter(day/10+0x30); //日的十位
LCD_DisplayCharacter(day%10+0x30); //日的个位
if(set==0)
LCD_DisplayString(2,1,temp1);
else LCD_DisplayString(2,1,temp3);
LCD_DisplayCharacter(hour/10+0x30);
LCD_DisplayCharacter(hour%10+0x30);
LCD_DisplayCharacter(':');
LCD_DisplayCharacter(minute/10+0x30);
LCD_DisplayCharacter(minute%10+0x30);
LCD_DisplayCharacter(':');
LCD_DisplayCharacter(second/10+0x30);
LCD_DisplayCharacter(second%10+0x30);
}
//************时间调整****************
void time_seting()
{
if(shift==1) //秒位校正
{
if(add==1)
{
second++;
if(second>59)second=0;
add=0;
}
if(reduce==1)
{
second--;
if(second>59) second=59;
reduce=0;
}
}
if(shift==2) //分位校正
{
if(add==1)
{
minute++;
if(minute>59)minute=0;
add=0;
}
if(reduce==1)
{
minute--;
if(minute>59)minute=59;
reduce=0;
}
}
if(shift==3) //时位校正
{
if(add==1)
{
hour++;
if(hour>23)hour=0;
add=0;
}
if(reduce==1)
{
hour--;
if(hour>23)hour=23;
reduce=0;
}
}
if(shift==4) //日校正
{
if(add==1)
{
day++;
if((year%4==0)&&(year%100!=0)||(year%400==0)) //闰年判断
{ if(day>tian2[month-1])day=1;}
else if(day>tian1[month-1])day=1;
add=0;
}
if(reduce==1)
{
day--;
if((year%4==0)&&(year%100!=0)||(year%400==0)) //闰年判断
{if(day<=0||day>tian2[month-1]) day=tian2[month-1];}
else if(day<=0||day>tian1[month-1]) day=tian1[month-1];
reduce=0;
}
}
if(shift==5) //月校正
{
if(add==1)
{
month++;
if(month>12)month=1;
add=0;
}
if(reduce==1)
{
month--;
if(month>12)month=1;
reduce=0;
}
}
if(shift==6) //年校正
{
if(add==1)
{
year++;
add=0;
}
if(reduce==1)
{year--;
if(year<2008)year=2008;
reduce=0;
}
}
}
//********读键值*************
uchar key_result()
{
uchar key_value;
ADGO=1;
do{;}while(1==ADGO);
ADGO=0;
ad_key_result=ADRESH;
if(ad_key_result>0xa5) key_value=1;
else if(ad_key_result>0x7b) key_value=2;
else if(ad_key_result>0x61) key_value=3;
else if(ad_key_result>0x50) key_value=4;
else if(ad_key_result>0x44) key_value=5;
else key_value=0;
return key_value;
}
//****************防抖动******************
uchar get_key()
{
uchar key_temp;
uint k;
do{
key_temp=key_result(); //取键值
if(0!=key_temp)for(k=400;--k;); //延时一段时间再取键值
}while(key_temp!=key_result()); //若两次取得键值不相同,则说明键误按下,重新取键值。
if(0!=key_temp) //等键松开
{
do{
do{;}while(0!=key_result()); //若没松开键,等待
for(k=400;--k;);
}while(0!=key_result()); //若二者不相等,说明是误操作,继续循环检测
}
return key_temp;
}
//**************功能键*******************
void set_key()
{
if(0==set){shift=0; time_display();} //初始状态,显示时间
if((1==set)||(0==set)) {time_seting(); time_display();} //功能键按一次,进入时间校准模式
PORTC=0x01;
}
//************左移键*************
void left_key() //
{
if(1==set)
{shift--;
if(shift<1) shift=6;
}
PORTC=0x10;
}
//************右移键*************
void right_key()
{
if(1==set)
{
shift++;
if(shift>6)shift=1;
}
PORTC=0x08;
}
//********加键****************
void add_key()
{
if(1==set)add=1;
PORTC=0x02;
}
//*********减键******************
void reduce_key()
{
if(1==set)reduce=1;
PORTC=0x04;
}
//*****************************
//************主函数******************
void main()
{
Init_LCD();
tmr1_init();
ad_init();
LCD_Clear();
LCD_DisplayString(1,1,test1);
LCD_DisplayString(2,1,test2);
delay_nms(500);
LCD_Clear();
TMR1IE=1; //开中断
while (1)
{
key=get_key();
if(1==key) {left_key();}
if(2==key) {reduce_key();}
if(3==key){set++;if(set>2)set=0;}
if(4==key){add_key();}
if(5==key){right_key();}
set_key();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -