📄 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_key_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);
uint get_date(uchar); //获取AD转换值
void date_display(uint); //显示电压值
void alarm(void); //报警
void usartint(void); //异步同步串行通信模块初始化
uchar get_usart_date(void); //获取PC的数据
void pc_read(void); //pc 读取电压值
//****************************************
bank1 uchar test1[]="Designer:";
bank1 uchar test2[]="Fan enzeng";
bank1 uchar test3[]="pc-mcu";
bank1 uchar i=0;
bank1 uint count=0; //tmr1计数,计满1000为一秒
bank1 uchar auto_count=0; //自动模式各路显示时间 30s
bank1 uchar ad_key_result; //存放ADKEY转换的值
bank1 uchar shift=0,add=0,reduce=0,set=0; //各个功能键
bank1 uchar key; //存放键值
bank1 uchar second=0,minute=0,hour=0,day=1,month=1;
bank1 uint year=2008;
bank1 uchar tian1[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //平年
bank1 uchar tian2[12]={31,29,31,30,31,30,31,31,30,31,30,31}; //平闰
bank1 uchar channel=1; //路数标志位
bank1 uchar ad_date;//存放AD转换值
bank1 uchar auto_mode=0; //显示模式, 手动/自动
/*
struct waring //高低报警值
{
uint channel_1;
uint channel_2;
uint channel_3;
uint channel_4;
uint channel_5;
};
*/
bank2 uint low[5]={250,250,250,250,250};
bank2 uint high[5]={490,490,490,490,490}; //报警值初始化
bank2 uchar gao=0; //高低位报警设置标志位,默认为低位,可通过left(低)和right(高)键设置
//****************数据显示函数中的显示内容*****************************
uchar date_display_temp1[]="The voltage is:";
uchar date_display_temp2[]="Alarm value: ";
uchar date_display_temp3[]=" ";
bank2 uchar date_display_temp4[]="low ";
bank2 uchar date_display_temp5[]="high ";
bank2 float date_temp2;
/***********USART***********************
!!!!!!注意在发送的字符串后边需加'/'!!!!!!!!!
可以用‘*’进行清屏
**********************************/
bank2 uchar pc_link_ready=0; //PC与单片机连接成功标志位,1代表连接成功
//*******************************************************************
//*********tmr1中断*****************
void interrupt time(void)
{TMR1H=0xfc;
TMR1L=0x18; //1ms
TMR1IF=0;
count++;
if(count>1000)
{
count=0;
second++;
auto_count++;
if(auto_count>1)
{
auto_count=0;
if((auto_mode==1)&&(2==set))
{
channel++;
if(channel>5)channel=1; //在自动模式下,路数自增
}
}
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;
}
//*************取AD转换值********************
uint get_date(uchar channel_temp)
{
uint date_temp1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -