⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 这个文档程序主要应用了单片机的串行通讯部分
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************************工程文件说明*******************************/
/*FileName:main.c														   */
/*Author:烛光 															   */
/*Version:v1.0															   */
/*Data:2008年07月11日													   */
/*Description:工程主程序文件,包含状态机制和时间机制两条主线。			   */
/*Function List:														   */
/*    1.main  主程序,状态机制											   */
/*	  2.scrfresh  状态辅助程序,刷新屏幕								   */
/*	  3.time_manager  时间控制程序,时间机制							   */
/*	  4.……															   */
/*History:																   */
/*	  3.烛光  2008.09.13  v1.0  初步完成设计							   */
/*	  2.烛光  2008.09.13  v1.0  初步完成设计							   */
/*	  1.烛光  2008.07.11  v0.0  开始设计								   */
/*Copyright (c) 2008 烛光 All Rights Reserved							   */
/***************************************************************************/

/***********************************硬件接口说明****************************/
/*MCU
1、STC89C58RD+
/*LM19264A接口说明
1、DB7--P0^7   5、DB3--P0^3   9、 EN--P2^5   13、VDD--VDD    17、VOUT--RP3 
2、DB6--P0^6   6、DB2--P0^2   10、RW--P2^4   14、VSS--GND    18、RSTB--P2^0  
3、DB5--P0^5   7、DB1--P0^1   11、RS--P2^3   15、CSA--P2^2   19、BLA--VDD  
4、DB4--P0^4   8、DB0--P0^0   12、VO--RP2    16、CSB--P2^1   20、BLK--GND
/*键盘接口说明
1、JP6.1--P2.6	2、JP6.2--P.7	JP2.3--GND

/***********************************头文件包含******************************/
#include <intrins.h>

#include "hardware.h"
#include "software.h"
#include "keyboard.h"
#include "lm19264.h"
#include "serial.h"
#include "eeprom.h"

/************************************符号定义*******************************/
//使用接口定义
//见其他各头文件

//使用寄存器定义
#define startclk TR0

/************************************变量定义*******************************/

bit scrfreshf=1;//刷新屏幕标志
bit mlimitf=0;//分限制标志
bit slimitf=0;//秒限制标志
bit newnewsf=0;//收到新消息
bit newnewsf0=0;//新消息0
bit newnewsf1=0;//新消息1
bit newnewsf2=0;//新消息2 
bit oldnewsf=0;//旧消息标志
bit oldnewsf0=0;//旧消息0
bit oldnewsf1=0;//旧消息1
bit oldnewsf2=0;//旧消息2
bit newsoverf=0;//显示消息结束标志
bit statefinish=0;//状态任务完成标志
bit gprscarryf=0;//gprs传送位
bit gprsresf=0;//gprs回复标志位
bit gprslostf=0;//gprs回复丢失标志位
bit contraf=0;
bit tiaoshi=0;//调试程序标志

uchar timer=0;
uchar second=0;
uchar minute=0;
uchar hour=0;
uchar state=0;
uchar minutecopy=0;
uchar secondcopy=0;
uchar storeturn=0;//eep消息存储顺序
uchar gprssendtime=0;
uchar gprscode=0;
uchar gprsturner=0;
uchar gprsharth=0;
uchar ti=0;//测试计数标志

/************************************函数声明*******************************/
void scrfresh(void);
void time_manager(void);
void getdata(void);
void displaynews(uchar startstr);
void storenews(void);
void loadnews(uchar m);
void showoldnews(void);
void rectify(void);
void device_init(void);
void displaygprs(void);
void displaycdma(void);
					   
/***************************************************************************/
////////////////////////////////////主程序///////////////////////////////////
/***************************************************************************/
/**********************************状态机制*********************************/
void main(void)
{	

	device_init();

	while(1)
	{		
		//第一喂狗
		WDT_CONTR=0x3f;
		//第二优先处理
		if(TF0)time_manager();		
		//第三状态处理
/*0000000000000000000000000000000000000000000000000000000000000000000000000*/
		if(state<0x10)//〇.总界面
		{ 
			switch(state)
			{
				case 0x00:if(scrfreshf){scrfreshf=0;scrfresh();break;}break;
				case 0x01:break;
				case 0x02:break;
				case 0x03:break;
				default:break;

			}
		}
/*1111111111111111111111111111111111111111111111111111111111111111111111111*/
		if(state>=0x10&&state<0x20)//I.旧消息
		{
			switch(state)
			{
				case 0x10:if(statefinish==0){statefinish=1;mlimitf=1;showoldnews();break;}break;
				case 0x11:if(statefinish==0){statefinish=1;;break;}break;
				case 0x12:if(statefinish==0){statefinish=1;;break;}break;
				case 0x13:if(statefinish==0){statefinish=1;;break;}break;
				case 0x14:if(statefinish==0){statefinish=1;;break;}break;
				case 0x15:if(statefinish==0){statefinish=1;;break;}break;
				default:break;
			}
		}
/*2222222222222222222222222222222222222222222222222222222222222222222222222*/
		if(state>=0x20&&state<0x30)//II.显示消息
		{
			switch(state)
			{
				case 0x20:
					if(statefinish==0)
					{
						mlimitf=1;//一分钟倒计时开始
						statefinish=1;//任务完成
						displaynews(0);						
						break;
					}
					else break;
				case 0x21:
					if(statefinish==0)
					{
						statefinish=1;mlimitf=1;
						displaynews(32);lcd_prt_letter(23,0x2c,0);
						break;
					}break;
				case 0x22:
					if(statefinish==0)
					{
						statefinish=1;mlimitf=1;
						displaynews(64);lcd_prt_letter(23,0x2c,0);
						break;
					}break;
				case 0x23:
					if(statefinish==0)
					{
						statefinish=1;mlimitf=1;
						displaynews(96);lcd_prt_letter(23,0x2c,0);
						break;
					}break;
				case 0x24:
					if(statefinish==0)
					{
						statefinish=1;mlimitf=1;
						displaynews(128);lcd_prt_letter(23,0x2c,0);
						break;
					}break;
				case 0x25:
					if(statefinish==0)
					{
						statefinish=1;mlimitf=1;
						displaynews(160);lcd_prt_letter(23,0x2c,0);
						break;
					}break;
				case 0x26:
					if(statefinish==0)
					{
						statefinish=1;mlimitf=1;
						displaynews(192);lcd_prt_letter(23,0x2c,0);
						break;
					}break;
				case 0x27:
					if(statefinish==0)
					{
						statefinish=1;mlimitf=1;
						displaynews(224);lcd_prt_letter(23,0x2c,0);
						break;
					}break;
				case 0x28:
					if(statefinish==0)
					{
						statefinish=1;//状态收到
						mlimitf=1;//一分钟倒计时开始												
						newsoverf=0;//收到结束标志并清除
						lcd_prt_letter(90,0x2a,0);//“ ”
						lcd_prt_letter(95,0x2a,0);//“ ”
						lcd_prt_char(91,'j');//“退”
						lcd_prt_char(93,'k');//“出”												
						break;
					}
					break;
				default:tiaoshi=1;lightflag=0;break;//未知状态
			}
		}
/*3333333333333333333333333333333333333333333333333333333333333333333333333*/
		if(state>=0x30&&state<0x40)//III.ZCL-1C查询
		{
			switch(state)
			{
				case 0x30:
					if(statefinish==0)
					{
						statefinish=1;mlimitf=1;
						//serl_snd_string(send);//发送命令
						clrscr(0);
						clrscr(1);
						clrscr(2);
						
						lcd_prt_char(33,'l');//“消息00”
						lcd_prt_char(35,'m');
						lcd_prt_letter(37,zclsend[16]/0x10,0);
						lcd_prt_letter(38,zclsend[16]&0x0f,0);
						lcd_prt_char(92,'p');//“发送”
						lcd_prt_char(94,'q');
						lcd_prt_char(72,'j');//“退出”
						lcd_prt_char(74,'k');//
						lcd_prt_char(79,'v');//“→”
						lcd_prt_letter(86,0x30,0);//“↑”
					}
					else 
					{
						lcd_prt_letter(37,zclsend[16]/0x10,!contraf);
						lcd_prt_letter(38,zclsend[16]&0x0f,contraf);
					}break;
				case 0x31:break;
				case 0x32:break;
				case 0x33:break;
				case 0x34:break;
				case 0x35:break;
				default:tiaoshi=1;lightflag=0;break;//未知状态
			}
		}
/*4444444444444444444444444444444444444444444444444444444444444444444444444*/
		if(state>=0x40&&state<0x50)//IV.GPRS配置
		{
			switch(state)
			{
				case 0x40:
					if(statefinish==0)
						{
							statefinish=1;mlimitf=1;												
							break;							
						}
					else
					{
						if(gprsresf)
						{
							//状态跳转显示内容
							statefinish=0;
							state=0x41;
							gprsresf=0;
						}
						if(gprslostf)
						{
							//显示错误
							lcd_prt_char(32,'A');//“无应答!”
							lcd_prt_char(34,'B');//
							lcd_prt_char(36,'C');//
							lcd_prt_char(38,'D');//
							lcd_prt_char(72,'j');//“退出”
							lcd_prt_char(74,'k');//
							lcd_prt_char(92,'u');//“重连”
							lcd_prt_char(94,'E');//		
							gprslostf=0;//本次通信结束
						}
					}break;
				case 0x41:
					if(statefinish==0)
					{
						statefinish=1;//状态收到
						mlimitf=1;//一分钟倒计时开始
						gprsturner=0;//准备显示						
						break;
					}
					displaygprs();//显示配置
					break;
				case 0x42:if(statefinish==0){statefinish=1;;break;}break;
				case 0x43:if(statefinish==0){statefinish=1;;break;}break;
				case 0x44:if(statefinish==0){statefinish=1;;break;}break;
				case 0x45:if(statefinish==0){statefinish=1;;break;}break;
				default:tiaoshi=1;lightflag=0;break;//未知状态
			}
		}
/*5555555555555555555555555555555555555555555555555555555555555555555555555*/
		if(state>=0x50&&state<0x60)//IV.GPRS配置
		{
			switch(state)
			{
				case 0x50:
					if(statefinish==0)
						{
							statefinish=1;mlimitf=1;												
							break;							
						}
					else
					{
						if(gprsresf)
						{
							//状态跳转显示内容
							statefinish=0;
							state=0x51;
							gprsresf=0;
						}
						if(gprslostf)
						{
							//显示错误
							lcd_prt_char(32,'A');//“无应答!”
							lcd_prt_char(34,'B');//
							lcd_prt_char(36,'C');//
							lcd_prt_char(38,'D');//
							lcd_prt_char(72,'j');//“退出”
							lcd_prt_char(74,'k');//
							lcd_prt_char(92,'u');//“重连”
							lcd_prt_char(94,'E');//		
							gprslostf=0;//本次通信结束
						}
					}break;
				case 0x51:
					if(statefinish==0)
					{
						statefinish=1;//状态收到
						mlimitf=1;//一分钟倒计时开始
						gprsturner=0;//准备显示						
						break;
					}
					displaycdma();//显示配置
					break;
				case 0x52:if(statefinish==0){statefinish=1;;break;}break;
				case 0x53:if(statefinish==0){statefinish=1;;break;}break;
				case 0x54:if(statefinish==0){statefinish=1;;break;}break;
				case 0x55:if(statefinish==0){statefinish=1;;break;}break;
				default:tiaoshi=1;lightflag=0;break;//未知状态
			}
		}
		//第四按键处理
		key_manager();
	}	
}

/***************************************************************************/
////////////////////////////////////状态服务程序/////////////////////////////
/***************************************************************************/
/************************************刷新屏幕*******************************/
void scrfresh(void)
{
	clrscr(0);clrscr(1);clrscr(2);
	lcd_prt_char(30,'a');//“网络测试仪表”
	lcd_prt_char(32,'b');
	lcd_prt_char(34,'c');
	lcd_prt_char(36,'d');
	lcd_prt_char(38,'e');
	lcd_prt_char(40,'f');
	lcd_prt_char(28,'s');//图象
	lcd_prt_char(42,'t');
	lcd_prt_letter(79,'G',0);//GPRS
	lcd_prt_letter(80,'P',0);
	lcd_prt_letter(81,'R',0);
	lcd_prt_letter(82,'S',0);
	lcd_prt_letter(86,'C',0);//CDMA
	lcd_prt_letter(87,'D',0);
	lcd_prt_letter(88,'M',0);
	lcd_prt_letter(89,'A',0);
	if(oldnewsf0||oldnewsf1||oldnewsf2){lcd_prt_char(72,'h');lcd_prt_char(74,'i');}
	else {lcd_prt_char(72,'s');lcd_prt_char(74,'t');}//图象
	if(newnewsf0||newnewsf1||newnewsf2){lcd_prt_char(92,'g');lcd_prt_char(94,'i');}
	else //ZCL	
	{
		lcd_prt_letter(93,'Z',0);
		lcd_prt_letter(94,'C',0);
		lcd_prt_letter(95,'L',0);
		//lcd_prt_letter(95,0x01,0);
	}
}

/************************************存储消息*******************************/
void storenews(void)
{
	uchar addrh,addrl,i=0;
	if(newnewsf0&&newnewsf1&&newnewsf2){tiaoshi=1;lightflag=0;}
	else
	{
		switch(storeturn)
		{
			case 0:addrh=0x80;addrl=0x00;newnewsf0=1;break;
			case 1:addrh=0x82;addrl=0x00;newnewsf1=1;break;
			case 2:addrh=0x84;addrl=0x00;newnewsf2=1;break;
			default:tiaoshi=1;lightflag=0;break;
		}
		storeturn++;
		if(storeturn==3)storeturn=0;
	}
	eep_clr_sector(addrh);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -