📄 main.c
字号:
/********************************工程文件说明*******************************/
/*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 + -