//Last Modify Time:03/11/07 01:22
//ReadMe
//屏宽:112
//屏高:64
#include <reg51.h>
#include <intrins.h>
#include <absacc.h>
//
typedef struct
{
unsigned int KeyTab_MenuIndex; //当前状态索引号
unsigned int KeyTab_MaxItems; //本级菜单最大条目数
unsigned int KeyTab_PressOk; //按下"回车"键时转向的状态索引号
unsigned int KeyTab_PressEsc; //按下"返回"键时转向的状态索引号
unsigned int KeyTab_PressDown; //按下"向下"键时转向的状态索引号
unsigned int KeyTab_PressUp; //按下"向上"键时转向的状态索引号
void (*CurrentOperate)(); //当前状态应该执行的功能操作
}KeyTabStruct;
void (*KeyFuncPtr)(); //按键功能指针
//
#define S_S 0x80//上 =1000,0000=0x80,
#define S_X 0x40//下 =0100,0000=0x40,
#define S_Z 0x20//左 =0010,0000=0x20,
#define S_Y 0x10//右 =0001,0000=0x10,
#define S_ZS 0xa0//左上 =1010,0000=0xa0,
#define S_ZX 0x60//左下 =0110,0000=0x60,
#define S_YS 0x90//右上 =1001,0000=0x90,
#define S_YX 0x50//右下 =0101,0000=0x50,
#define S_SXZY 0xf0//上下左右=1111,0000=0xf0
//
#define KEY_OK 0x11
#define KEY_UP 0x12
#define KEY_ESC 0x13
//
#define KEY_LEFT 0x21
#define KEY_DOWN 0x22
#define KEY_RIGHT 0x23
//
#define KEY_1 0x31
#define KEY_2 0x32
#define KEY_3 0x33
//
#define KEY_4 0x41
#define KEY_5 0x42
#define KEY_6 0x43
//
#define KEY_7 0x51
#define KEY_8 0x52
#define KEY_9 0x53
//
#define KEY_XING 0x61
#define KEY_0 0x62
#define KEY_JING 0x63
//
#define KEY_POWER 0x71
#define KEY_NULL 0x00
//
//
#define MAX_KEYTABSTRUCT_NUM 19
#define MENU_FACE 0
#define MENU_ROOT 1
#define MENU_VIEW 2
#define MENU_VIEW_ABOUTRECORDE 3
#define MENU_VIEW_HANDSETCLOCK 4
#define MENU_OPERATION 5
#define MENU_OPERATION_SETPOSITION 6
#define MENU_OPERATION_READZJTOFLASH 7
#define MENU_OPERATION_RDZJTORAM 8
#define MENU_OPERATION_DELGIVENZL 9
#define MENU_OPERATION_DELALLZJ 10
#define MENU_TEST 11
#define MENU_TEST_RAMTEST 12
#define MENU_TEST_FLASHTEST 13
#define MENU_SYSTEMSET 14
#define MENU_SYSTEMSET_DEBUG 15
#define MENU_SYSTEMSET_DEBUG_PASSWORD 16
#define MENU_SYSTEMSET_DEBUG_SEEPICTURE 17
#define MENU_SYSTEMSET_SETHANDCLK 18
//
#define Addr_Key 0xc000 //1100,0000,0000,0000
#define Addr_XRamBegin1 0x0000 //0000,0000,0000,0000//共32K
#define Addr_XRamEnd1 0x3fff //0011,1111,1111,1111
#define Addr_XRamBegin2 0x4000 //0100,0000,0000,0000
#define Addr_XRamEnd2 0x7fff //0111,1111,1111,1111
#define Addr_XFlashBegin 0x9000//1000,0000,0000,0000 16K/每自然扇区
#define Addr_XFlashEnd 0xbfff//1011,1111,1111,1111
#define Addr_XFlashSector 0xc001//1100,0000,0000,0001 4个自然扇区(把FLASH的地址线移到这个口内容的低位)
//Flash可用容量=4*16K=64K
//自然扇区的内容字节范围(0->3)(0000,0000~0000,0011)共4块=64K,硬件上把A18,A17,A16锁住了,不能写)
//能读不能写的扇区号为4-31为(0000,0100~0001,1111)共28块=448K,可以作为菜单位置
//#define Addr_XFlashBegin 0x9000//1000,0000,0000,0000 16K/每自然扇区
//#define Addr_XFlashEnd 0xbfff//1011,1111,1111,1111
//能读能写的FLASH的连续地址如下:
//#define Addr_XFlashBegin 0x0000//共64K
//#define Addr_XFlashEnd 0xffff
//
//操作FLASH地址时,
//1.算出页地址
//2. 对扇区解锁(读扇区不用解锁):(0x5555)=0xaa,(0x2aaa)=0x55,(0x5555)=0xa0;
//3。把高2位移入[Addr_XFlashSector]=0的低2位,
//4。把原来的高2位置0,再或上10B
//5. 然后整个扇区读/写256字节
//片外数组0x0000~0x1fff;
unsigned char xdata Rev232Buffer[256] _at_ 0x0000; //->0x00ff
unsigned char xdata Send232Buffer[256] _at_ 0x0100; //->0x1ff
#define Addr_FlashWriteBuffer1 0x0200 //->0x2ff
#define Addr_FlashWriteBuffer2 0x0300 //->0x3ff
#define Addr_FlashReadBuffer1 0x0400 //->0x4ff
#define Addr_FlashReadBuffer2 0x0500 //->0x5ff
#define Addr_ZjWrRdBuffer 0x0800 //->0xfff
unsigned char xdata clock[12] _at_ 0x1000; //->0x100b
//
unsigned char xdata cGraphByte[8] _at_ 0x100e; //->0x1015
unsigned char xdata * xdata cpGraph _at_ 0x1016; //->0x1017
signed char xdata cMenuHLight[0x10] _at_ 0x1018;
KeyTabStruct xdata KeyTab[MAX_KEYTABSTRUCT_NUM] _at_ 0x1028;
unsigned char xdata CxTestByte1 _at_ 0x1145;
//片外单变量0x2000~0x2fff;
//通讯专用
unsigned char xdata cUartTemp1 _at_ 0x2000;
unsigned char xdata cUartTemp2 _at_ 0x2001;
unsigned char xdata cUartTemp3 _at_ 0x2002;
unsigned char xdata cUartFunSn _at_ 0x2003;
unsigned char xdata cUartDataLenght _at_ 0x2004;
unsigned char xdata cUartAddSum _at_ 0x2005;
unsigned char xdata cUartXorSum _at_ 0x2006;
unsigned char xdata iUartTemp1 _at_ 0x2007;
unsigned char xdata iUartTemp2 _at_ 0x2008;
unsigned char xdata iUartTemp3 _at_ 0x2009;
//Flash专用
unsigned char xdata cPageAddr _at_ 0x2010;
unsigned int xdata iSectorAddr _at_ 0x2011;
unsigned int xdata iFlashToRamAddr _at_ 0x2013;
unsigned int xdata iRamToFlashAddr _at_ 0x2015;
unsigned char xdata iFlashAddrH _at_ 0x2017;
unsigned char xdata iFlashAddrM _at_ 0x2018;
unsigned char xdata iFlashAddrL _at_ 0x2019;
unsigned char xdata iFlashRdWrNum _at_ 0x201a;
//菜单专用
unsigned char xdata cMenuTemp1 _at_ 0x2020;
unsigned char xdata cMenuTemp2 _at_ 0x2021;
unsigned char xdata cMenuTemp3 _at_ 0x2022;
//
unsigned int xdata iMenuID _at_ 0x2023;
unsigned int xdata iMenuNextID _at_ 0x2025;
//
//画线专用
unsigned char xdata cLineTemp1 _at_ 0x2030;
unsigned char xdata cLineTemp2 _at_ 0x2031;
unsigned char xdata cLineTemp3 _at_ 0x2032;
unsigned char xdata cLineTemp4 _at_ 0x2033;
unsigned char xdata cLineTemp5 _at_ 0x2034;
unsigned char xdata cLineTemp6 _at_ 0x2035;
unsigned char xdata cLineTemp7 _at_ 0x2036;
unsigned char xdata cLineTemp8 _at_ 0x2037;
unsigned char xdata cLineTemp9 _at_ 0x2038;
unsigned char xdata cLineTemp10 _at_ 0x2039;
unsigned char xdata cLineTemp11 _at_ 0x203a;
unsigned char xdata cLineTemp12 _at_ 0x203b;
unsigned char xdata cLineTemp13 _at_ 0x203c;
//DispTextLine
unsigned char xdata cTextLineTemp1 _at_ 0x203d;
unsigned char xdata cTextLineTemp2 _at_ 0x203e;
unsigned char xdata cTextLineTemp3 _at_ 0x203f;
//图形字符专用
unsigned char xdata cGraphTemp1 _at_ 0x2040;
unsigned char xdata cGraphTemp2 _at_ 0x2041;
unsigned char xdata cGraphTemp3 _at_ 0x2042;
unsigned char xdata cGraphTemp4 _at_ 0x2043;
//主程序用
unsigned char xdata NowKey _at_ 0x2044;
unsigned char xdata RxPos _at_ 0x2045;
unsigned char xdata RxStep _at_ 0x2046;
unsigned char xdata RxPrev _at_ 0x2047;
unsigned char xdata RxNow _at_ 0x2048;
unsigned char xdata RxDataLenght _at_ 0x2049;
unsigned char xdata TxPos _at_ 0x204a;
unsigned char xdata TxNum _at_ 0x204b;
//中断0用
unsigned char xdata cTemp_ex0 _at_ 0x204c;
//通讯中断用
unsigned int xdata i_uart _at_ 0x204d;
//写Flash用
unsigned int xdata i_FlashWr _at_ 0x204f;
unsigned char xdata c1_FlashWr _at_ 0x2051;
//读Flash用
unsigned int xdata i_FlashRd _at_ 0x2052;
unsigned char xdata c1_FlashRd _at_ 0x2054;
//Make05Answe专用
unsigned int xdata i_Make05Answer _at_ 0x2055;
unsigned char xdata cAdd_Make05Answer _at_ 0x2057;
unsigned char xdata cXor_Make05Answer _at_ 0x2058;
//读时间用
unsigned char xdata i_RdTime _at_ 0x2059;
//显示文本行用
unsigned char xdata col_DispTextLine _at_ 0x205a;
unsigned char code * xdata p_DispTextLine _at_ 0x205b;
//显示开机画面
unsigned char xdata i_FaceBmp _at_ 0x205d;
unsigned char xdata j_FaceBmp _at_ 0x205e;
unsigned char xdata k_FaceBmp _at_ 0x205f;
unsigned char xdata c1_FaceBmp _at_ 0x2060;
//DisponeTextChar
unsigned char xdata i_DisponeTextChar _at_ 0x2061;
unsigned char xdata j_DisponeTextChar _at_ 0x2062;
unsigned char xdata k_DisponeTextChar _at_ 0x2063;
unsigned char xdata cTemp_DisponeTextChar _at_ 0x2064;
//键处理程序专用
unsigned char xdata cKeyTemp1 _at_ 0x2065;
//定时器0专用
unsigned int xdata iT0_1S _at_ 0x2066;
unsigned char xdata cClock_Year _at_ 0x2068;
unsigned char xdata cClock_Month _at_ 0x2069;
unsigned char xdata cClock_Day _at_ 0x206a;
unsigned char xdata cClock_Hour _at_ 0x206b;
unsigned char xdata cClock_Minute _at_ 0x206c;
unsigned char xdata cClock_Second _at_ 0x206d;
//cx
//Timer
#define TH0data 0xb8//20ms=0xb800,1ms=0xfc66
#define TL0data 0x00//
//
sbit LCD_CS=P1^0;
sbit LCD_RESET=P1^1;
sbit LCD_A0=P1^5;
sbit LCD_WR=P1^6;
sbit KEYINT=P3^2;
sbit I2C_SCK=P3^4;
sbit I2C_SDA=P3^5;
//
sbit KEYROW1=P1^5;
sbit KEYROW2=P1^6;
sbit KEYROW3=P1^7;
//
unsigned char bdata BitByte0;
sbit bOldOnline=BitByte0^7;
sbit b_ReceiveOver=BitByte0^6;
sbit b_KeyInt=BitByte0^5;
sbit b_Arrive1S=BitByte0^4;
unsigned char bdata BitByte1;
unsigned char bdata BitByte2;
unsigned char bdata BitValue;
sbit bOnline=BitValue^7;
sbit bPowerOff=BitValue^6;
unsigned char bdata BitValue1;
sbit bBit7=BitValue1^7;
sbit bBit6=BitValue1^6;
sbit bBit5=BitValue1^5;
sbit bBit4=BitValue1^4;
sbit bBit3=BitValue1^3;
sbit bBit2=BitValue1^2;
sbit bBit1=BitValue1^1;
sbit bBit0=BitValue1^0;
//
//
void lcd_write_d(unsigned char c1);
void lcd_write_c(unsigned char c1);
void LcdInit();
void MyInit();
//
void DispOneBoxTextChar(unsigned char Row,unsigned char Col,unsigned char c1,unsigned char DispAttrib);
void DispTwoBoxHexChar(unsigned char Row,unsigned char Col,unsigned char c1,unsigned char DispAttrib);
void DispGraphChar(unsigned char Row,unsigned char Col,unsigned char xdata *cArray,unsigned char DispAttrib);
void DispTextLine(unsigned char Row,unsigned char code *MenuText,unsigned char DispAttrib);
//
void ReadyForKey();
void DelayMs(unsigned int iMs);
void UartProcess();
void IAmZj();
void IAmOk();
void IAmUnKnow();
void FlashSectorWr(unsigned int SourceXRamAddr,unsigned int TargetFlashAddr);
void FlashSectorRd(unsigned int SourceFlashAddr,unsigned int TargetXRamAddr);
void Make05Answer();
void Make06Answer();
void I2Cstart(void);
void I2Csend(unsigned char);
unsigned char I2Csuback(void);
void I2Cmastack(void);
unsigned char I2Cread(void);
void I2Cnoack(void);
void I2Cstop(void);
void Make07Answer();
unsigned char set_time();
void Make08Answer();
void MakeBox(unsigned char row1,unsigned char col1,unsigned char row2,unsigned char col2);
void MenuFunctionNull();
void MenuFunctionDemo1();
void MenuFunctionDemo2();
void MenuFunctionDemo3();
void MenuFunctionDemo4();
void MenuFunctionDemo5();
void MenuFunctionDemo6();
void MenuFunctionDemo7();
void MenuFunctionDemo8();
void MenuFunctionDemo9();
void MenuFunctionDemo10();
void MenuFunctionDemo11();
void MenuFunctionDemo12();
void MenuFunctionDemo13();
void MenuFunctionDemo14();
void MenuFunctionDemo15();
void MenuFunctionDemo16();
void MenuFunctionDemo17();
void MenuFunctionDemo18();
void MenuFunctionDemo19();
//
void DispFaceBmp();
void DispMenu_Root();
void DispMenu_View();
void DispMenu_Operation();
void DispMenu_Test();
void DispMenu_SystemSet();
void DispMenu_Debug();
//
void JudgeHLight();
//
unsigned char ReadTime();
void ShowDesktopTime();
//
unsigned char code Echar[96][8];
unsigned char code FaceBmp[112][8];
//
unsigned char code *Menu_Root[4]=
{
" View ",
" Operation ",
" Test ",
" System Set "
};
unsigned int code Menu_RootID[4]=
{
MENU_VIEW,
MENU_OPERATION,
MENU_TEST,
MENU_SYSTEMSET
};
//
unsigned char code *Menu_View[2]=
{
" About ZL ",
" HandSet CLK "
};
unsigned int code Menu_ViewID[2]=
{
MENU_VIEW_ABOUTRECORDE,
MENU_VIEW_HANDSETCLOCK
};
//
unsigned char code *Menu_Operation[5]=
{
" Set Position ",
" Rd Zj To ROM ",
" Rd ZL To Ram ",
" Del Given ZL ",
" Del All ZL "
};
unsigned int code Menu_OperationID[5]=
{
MENU_OPERATION_SETPOSITION,
MENU_OPERATION_READZJTOFLASH,
MENU_OPERATION_RDZJTORAM,
MENU_OPERATION_DELGIVENZL,
MENU_OPERATION_DELALLZJ
};
//
unsigned char code *Menu_Test[2]=
{
" Ram Test ",
" Flash Test "
};
unsigned int code Menu_TestID[2]=
{
MENU_TEST_RAMTEST,
MENU_TEST_FLASHTEST
};
//
unsigned char code *Menu_SystemSet[2]=
{
" Debug ",
" Set Hand Clk "
};
unsigned int code Menu_SystemSetID[2]=
{
MENU_SYSTEMSET_DEBUG,
MENU_SYSTEMSET_SETHANDCLK
};
//
unsigned char code *Menu_Debug[2]=
{
" PassWord ",
" See Picture "
};
unsigned int code Menu_DebugID[2]=
{
MENU_SYSTEMSET_DEBUG_PASSWORD,
MENU_SYSTEMSET_DEBUG_SEEPICTURE
};
//
unsigned char code MenuNULL[]={" "};
//
main()
{
MyInit();
LcdInit();
//
cMenuHLight[0x00]=0x00;
cMenuHLight[0x01]=0x00;
cMenuHLight[0x02]=0x00;
cMenuHLight[0x03]=0x00;
cMenuHLight[0x04]=0x00;
cMenuHLight[0x05]=0x00;
cMenuHLight[0x06]=0x00;
cMenuHLight[0x07]=0x00;
cMenuHLight[0x08]=0x00;
cMenuHLight[0x09]=0x00;
cMenuHLight[0x0a]=0x00;
cMenuHLight[0x0b]=0x00;
cMenuHLight[0x0c]=0x00;
cMenuHLight[0x0d]=0x00;
cMenuHLight[0x0e]=0x00;
cMenuHLight[0x0f]=0x00;
//
DelayMs(20);
//调试用
MenuFunctionNull();
//
BitValue=XBYTE[Addr_Key];
bOldOnline=(~bOnline);
b_KeyInt=0;
b_ReceiveOver=0;
b_Arrive1S=0;
//
DispFaceBmp();
//
iMenuID=MENU_FACE;
//
while(1)
{
ReadyForKey();
//
BitValue=XBYTE[Addr_Key];
if(bOldOnline!=bOnline)
{
bOldOnline=bOnline;
if(!bOldOnline)
{//Line=1
}
else
{//Line=0;
}
}
if(b_ReceiveOver)
{
//
UartProcess();
//
b_ReceiveOver=0;
RxStep=0;
RxPos=0;
REN=1;
}
//
if(b_KeyInt)
{
switch(NowKey)
{
case KEY_OK://KEY_OK, KEY_UP, KEY_ESC,
if(KeyTab[iMenuID].KeyTab_PressOk!=999)
{
iMenuID=KeyTab[iMenuID].KeyTab_PressOk;
iMenuNextID=KeyTab[iMenuID].KeyTab_PressOk;
JudgeHLight();
}
KeyFuncPtr=KeyTab[iMenuID].CurrentOperate;
(*KeyFuncPtr)(); //执行当前按键的操作
break;
case KEY_UP:
if((KeyTab[iMenuID].KeyTab_PressUp!=999)&&(iMenuNextID!=999))
{
KeyTab[iMenuID].KeyTab_PressOk=KeyTab[iMenuNextID].KeyTab_PressUp;
iMenuNextID=KeyTab[iMenuNextID].KeyTab_PressUp;
JudgeHLight();
}
break;
case KEY_ESC:
//
if(KeyTab[iMenuID].KeyTab_PressEsc!=999)
{
iMenuID=KeyTab[iMenuID].KeyTab_PressEsc;
iMenuNextID=KeyTab[iMenuID].KeyTab_PressOk;
JudgeHLight();
KeyFuncPtr=KeyTab[iMenuID].CurrentOperate;
(*KeyFuncPtr)(); //执行当前按键的操作
}
break;
//
case KEY_LEFT://KEY_LEFT, KEY_DOWN, KEY_RIGHT,
if((KeyTab[iMenuID].KeyTab_PressUp!=999)&&(iMenuNextID!=999))
{
KeyTab[iMenuID].KeyTab_PressOk=KeyTab[iMenuNextID].KeyTab_PressUp;
iMenuNextID=KeyTab[iMenuNextID].KeyTab_PressUp;
JudgeHLight();
}
break;
case KEY_DOWN:
if((KeyTab[iMenuID].KeyTab_PressDown!=999)&&(iMenuNextID!=999))
{
KeyTab[iMenuID].KeyTab_PressOk=KeyTab[iMenuNextID].KeyTab_PressDown;
iMenuNextID=KeyTab[iMenuNextID].KeyTab_PressDown;
JudgeHLight();
}
break;
case KEY_RIGHT:
if((KeyTab[iMenuID].KeyTab_PressDown!=999)&&(iMenuNextID!=999))
{
KeyTab[iMenuID].KeyTab_PressOk=KeyTab[iMenuNextID].KeyTab_PressDown;
iMenuNextID=KeyTab[iMenuNextID].KeyTab_PressDown;
JudgeHLight();
}
break;
//
case KEY_1://KEY_1, KEY_2, KEY_3,
break;
case KEY_2:
break;
case KEY_3:
break;
case KEY_4://KEY_4, KEY_5, KEY_6,
break;
case KEY_5:
break;
case KEY_6:
break;
case KEY_7://KEY_7, KEY_8, KEY_9,
break;
case KEY_8:
break;
case KEY_9:
break;
case KEY_XING://KEY_XING, KEY_0, KEY_JING,
break;
case KEY_0:
break;
case KEY_JING:
break;
case KEY_POWER://KEY_POWER, KEY_NULL
break;
case KEY_NULL:
MakeBox(3,3,5,12);
break;
//
default:
break;
}
b_KeyInt=0;
}
if((b_Arrive1S==1)&&(iMenuID==MENU_FACE))
{
ReadTime();
//
ShowDesktopTime();
//
b_Arrive1S=0;
}
}
}
void isr_ex0(void) interrupt 0 using 1
{
b_KeyInt=1;
//
cTemp_ex0=0xff;
//
DelayMs(20);
ReadyForKey();
cTemp_ex0=XBYTE[Addr_Key];
//
cTemp_ex0=cTemp_ex0&0x3f;
switch(cTemp_ex0)
{
case 0x3e://第一行
NowKey=0x10;
break;
case 0x3d://第二行
NowKey=0x20;
break;
case 0x3b://第三行
NowKey=0x30;
break;
case 0x37://第四行
NowKey=0x40;
break;
case 0x2f://第五行
NowKey=0x50;
break;
case 0x1f://第六行
NowKey=0x60;
break;
default:
NowKey=0x00;
break;
}
//
KEYROW1=0;
KEYROW2=1;
KEYROW3=1;
cTemp_ex0=XBYTE[Addr_Key];
//
cTemp_ex0&=0x3f;
if(cTemp_ex0!=0x3f)
{
NowKey=NowKey 0x01;
}
else
{
KEYROW1=1;
KEYROW2=0;
KEYROW3=1;
cTemp_ex0=XBYTE[Addr_Key];
//
cTemp_ex0&=0x3f;
if(cTemp_ex0!=0x3f)
{
NowKey=NowKey 0x02;
}
else
{
KEYROW1=1;
KEYROW2=1;
KEYROW3=0;
cTemp_ex0=XBYTE[Addr_Key];
cTemp_ex0&=0x3f;
if(cTemp_ex0!=0x3f)
{
NowKey=NowKey 0x03;
}
else
{
BitValue=XBYTE[Addr_Key];
if(!bPowerOff)
{
NowKey=0x71;
}
else
{
NowKey=0x00;
}
}
}
}
//
do
{
DelayMs(100);
}while(!KEYINT);
//
IE0=0;//清外中断0请求
}
//
void isr_t0(void) interrupt 1 using 2
{
TL0=TL0data;
TH0=TH0data;
iT0_1S+=20;//因为定时器的定时为20Ms一次
if(iT0_1S>=1000)
{
iT0_1S=0;
b_Arrive1S=1;
}
}
//
void isr_ex1(void) interrupt 2 using 1
{
_nop_();
}
//
void isr_t1(void) interrupt 3 using 2
{
_nop_();
}
//
void isr_ser(void) interrupt 4 using 3
{
if(TI)
{
if((TxNum--)>0)
{
SBUF=Send232Buffer[TxPos++];
}
else
{
TxNum=0;
TxPos=0;
}
//
TI=0;
}
else
{
RI=0;
RxNow=SBUF;
Rev232Buffer[RxPos++]=RxNow;
if(RxPos>=255)
{
RxPos=0;
}
//
if(!b_ReceiveOver)
{
switch(RxStep)
{
case 0://帧头:55 55
if(RxNow==0x55)
{
if(RxPrev==0x55)
{
RxStep=1;
}
else
{
RxPrev=RxNow;
RxPos=0;
Rev232Buffer[RxPos++]=RxNow;
RxStep=0;
}
}
else
{
RxStep=0;
RxPos=0;
REN=1;
}
break;
case 1://命令帧和数据帧的判断
if((RxNow&0x80)==0)
{
RxStep=3;
}
else
{
RxPrev=RxNow;
RxStep=2;
}
break;
case 2://命令帧,第二个命令字(和第一个命令字相同)
if(RxNow==RxPrev)
{
RxStep=7;
}
else
{
RxStep=0;
RxPos=0;
REN=1;
}
break;
case 3://数据帧,帧长度
RxDataLenght=RxNow;
RxStep=4;
break;
case 4://数据帧,数据段
RxDataLenght--;
if(RxDataLenght==0)
{
RxStep=5;
}
break;
case 5://数据帧,累加和
RxStep=6;
break;
case 6://数据帧,异或和
RxStep=8;
break;
case 7://命令帧,累加和
RxStep=8;
break;
case 8://帧尾:aa aa
if(RxNow==0xaa)
{
if(RxPrev==0xaa)
{
b_ReceiveOver=1;
REN=0;
}
else
{
RxPrev=RxNow;
}
}
else
{
RxStep=0;
RxPos=0;
REN=1;
}
break;
default:
RxStep=0;
RxPos=0;
REN=1;
break;
}
}
}
}
//
void UartProcess()
{
//
cUartTemp1=0;
cUartTemp2=0;
cUartTemp3=0;
cUartFunSn=0xff;
//
cUartTemp1=Rev232Buffer[0];
cUartTemp2=Rev232Buffer[1];
if((cUartTemp1==0x55)&(cUartTemp2==0x55))
{
cUartTemp1=Rev232Buffer[2];
cUartTemp1&=0x80;
if(cUartTemp1!=0)
{//命令帧
cUartTemp1=Rev232Buffer[2];
cUartTemp2=Rev232Buffer[3];
if(cUartTemp1==cUartTemp2)
{
cUartTemp3=cUartTemp1+cUartTemp2;
cUartTemp1=Rev232Buffer[4];
if(cUartTemp1==cUartTemp3)
{
cUartTemp1=Rev232Buffer[5];
cUartTemp2=Rev232Buffer[6];
if((cUartTemp1==0xaa)&&(cUartTemp2=0xaa))
{
cUartFunSn=Rev232Buffer[2];
}
}
}
}
else
{//数据帧
cUartAddSum=Rev232Buffer[2]+Rev232Buffer[3];
cUartXorSum=Rev232Buffer[2]^Rev232Buffer[3];
cUartDataLenght=Rev232Buffer[3];
for(i_uart=4;i_uart<(cUartDataLenght+4);i_uart++)
{
cUartTemp1=Rev232Buffer[i_uart];
cUartAddSum+=cUartTemp1;
cUartXorSum^=cUartTemp1;
}
cUartTemp1=Rev232Buffer[cUartDataLenght+4];
cUartDataLenght++;
cUartTemp2=Rev232Buffer[cUartDataLenght+4];
cUartDataLenght++;
if((cUartTemp1==cUartAddSum)&&(cUartTemp2==cUartXorSum))
{
cUartTemp1=Rev232Buffer[cUartDataLenght+4];
cUartDataLenght++;
cUartTemp2=Rev232Buffer[cUartDataLenght+4];
cUartDataLenght++;
if((cUartTemp1==0xaa)&&(cUartTemp2==0xaa))
{
cUartFunSn=Rev232Buffer[6];
}
}
}
}
switch(cUartFunSn)
{
case 0xa5:
case 0xa6://我要伪装成座机0xa7
IAmZj();
break;
case 0xac:
case 0xad:
case 0xae:
IAmOk();
break;
case 5:
iFlashAddrH=Rev232Buffer[7];
iFlashAddrM=Rev232Buffer[8];
iFlashAddrL=Rev232Buffer[9];
iFlashRdWrNum=Rev232Buffer[10];
//
i_uart=iFlashAddrM;
i_uart=(i_uart<<8)&0xff00;
FlashSectorRd(i_uart,Addr_FlashReadBuffer1);
//
i_uart=iFlashAddrM+1;
i_uart=(i_uart<<8)&0xff00;
FlashSectorRd(i_uart,Addr_FlashReadBuffer2);
//
Make05Answer();
//
break;
case 6:
iFlashAddrH=Rev232Buffer[7];
iFlashAddrM=Rev232Buffer[8];
iFlashAddrL=Rev232Buffer[9];
iFlashRdWrNum=Rev232Buffer[10];
//
i_uart=iFlashAddrM;
i_uart=(i_uart<<8)&0xff00;
FlashSectorRd(i_uart,Addr_FlashWriteBuffer1);
//
i_uart=iFlashAddrM+1;
i_uart=(i_uart<<8)&0xff00;
FlashSectorRd(i_uart,Addr_FlashWriteBuffer2);
//
cUartTemp1=iFlashRdWrNum;
iUartTemp1=iFlashAddrL;
cUartTemp2=0;
while(cUartTemp1>0)
{
XBYTE[Addr_FlashWriteBuffer1+iUartTemp1]=Rev232Buffer[11+cUartTemp2];
cUartTemp1--;
iUartTemp1++;
cUartTemp2++;
}
//
i_uart=iFlashAddrM;
i_uart=(i_uart<<8)&0xff00;
FlashSectorWr(Addr_FlashWriteBuffer1,i_uart);
//
i_uart=iFlashAddrM+1;
i_uart=(i_uart<<8)&0xff00;
FlashSectorWr(Addr_FlashWriteBuffer2,i_uart);
//
Make06Answer();
break;
case 7:
ReadTime();
Make07Answer();
break;
case 8:
// 5 7 8 9 10 11 12
//55 55 03 09 00 CF 08 03 11 11 19 39 15 6F FB AA AA
clock[0]=0xa2;//I2C address
clock[1]=0x02;//address
clock[8]=Rev232Buffer[7];//year
clock[7]=Rev232Buffer[8];//month
clock[5]=Rev232Buffer[9];//date
clock[4]=Rev232Buffer[10];//hours
clock[3]=Rev232Buffer[11];//minutes
clock[2]=Rev232Buffer[12];//seconds
set_time();
Make08Answer();
break;
default:
IAmUnKnow();
RxStep=0;
RxPos=0;
break;
}
}
//
void IAmZj()
{
Send232Buffer[0]=0x55;
Send232Buffer[1]=0x55;
Send232Buffer[2]=0xa7;
Send232Buffer[3]=0xa7;
Send232Buffer[4]=0x4e;
Send232Buffer[5]=0xaa;
Send232Buffer[6]=0xaa;
TxPos=0;
TxNum=7;
TI=1;
}
void IAmOk()
{
Send232Buffer[0]=0x55;
Send232Buffer[1]=0x55;
Send232Buffer[2]=0x80;
Send232Buffer[3]=0x80;
Send232Buffer[4]=0x00;
Send232Buffer[5]=0xaa;
Send232Buffer[6]=0xaa;
TxPos=0;
TxNum=7;
TI=1;
}
void IAmUnKnow()
{
Send232Buffer[0]=0x55;
Send232Buffer[1]=0x55;
Send232Buffer[2]=0x84;
Send232Buffer[3]=0x84;
Send232Buffer[4]=0x08;
Send232Buffer[5]=0xaa;
Send232Buffer[6]=0xaa;
TxPos=0;
TxNum=7;
TI=1;
}
//
void FlashSectorWr(unsigned int SourceXRamAddr,unsigned int TargetFlashAddr)
{
//
cPageAddr=(unsigned char)((TargetFlashAddr>>14)&0x0003);
iSectorAddr=(TargetFlashAddr&0x3f00) 0x8000;
iRamToFlashAddr=SourceXRamAddr&0xff00;
//解锁
XBYTE[Addr_XFlashSector]=0x01;
XBYTE[0x9555]=0xaa;
XBYTE[Addr_XFlashSector]=0x00;
XBYTE[0xaaaa]=0x55;
XBYTE[Addr_XFlashSector]=0x01;
XBYTE[0x9555]=0xa0;
//
XBYTE[Addr_XFlashSector]=cPageAddr;
for(i_FlashWr=iSectorAddr;i_FlashWr<=(iSectorAddr+0xff);i_FlashWr++)
{
c1_FlashWr=XBYTE[iRamToFlashAddr++];
XBYTE[i_FlashWr]=c1_FlashWr;
}
DelayMs(10);
}
void FlashSectorRd(unsigned int SourceFlashAddr,unsigned int TargetXRamAddr)
{
//
cPageAddr=(unsigned char)((SourceFlashAddr>>14)&0x0003);
iSectorAddr=(SourceFlashAddr&0x3f00) 0x8000;
iFlashToRamAddr=TargetXRamAddr&0xff00;
//
XBYTE[Addr_XFlashSector]=cPageAddr;
for(i_FlashRd=iSectorAddr;i_FlashRd<=(iSectorAddr+0xff);i_FlashRd++)
{
c1_FlashRd=XBYTE[i_FlashRd];
XBYTE[iFlashToRamAddr++]=c1_FlashRd;
}
}//
//
void Make05Answer()
{
i_Make05Answer=iFlashAddrL;
cUartTemp2=0;
Send232Buffer[cUartTemp2++]=0x55;
Send232Buffer[cUartTemp2++]=0x55;
Send232Buffer[cUartTemp2++]=0x03;
Send232Buffer[cUartTemp2++]=4+iFlashRdWrNum;
Send232Buffer[cUartTemp2++]=0x00;
Send232Buffer[cUartTemp2++]=Rev232Buffer[5];//*********
Send232Buffer[cUartTemp2++]=0x05;
Send232Buffer[cUartTemp2++]=iFlashRdWrNum;
cUartTemp1=iFlashRdWrNum;
while((cUartTemp1--)!=0)
{
Send232Buffer[cUartTemp2++]=XBYTE[Addr_FlashReadBuffer1+i_Make05Answer];
i_Make05Answer++;
}
cAdd_Make05Answer=Send232Buffer[2];
cXor_Make05Answer=Send232Buffer[2];
for(i_Make05Answer=3;i_Make05Answer<cUartTemp2;i_Make05Answer++)
{
cAdd_Make05Answer=cAdd_Make05Answer+Send232Buffer[i_Make05Answer];
cXor_Make05Answer=cXor_Make05Answer^Send232Buffer[i_Make05Answer];
}
Send232Buffer[cUartTemp2++]=cAdd_Make05Answer;
Send232Buffer[cUartTemp2++]=cXor_Make05Answer;
Send232Buffer[cUartTemp2++]=0xaa;
Send232Buffer[cUartTemp2++]=0xaa;
TxPos=0;
TxNum=cUartTemp2;
TI=1;
}
void Make06Answer()
{//55 55 03 04 00 CE 06 00 DB CF AA AA
cUartTemp2=0;
Send232Buffer[cUartTemp2++]=0x55;
Send232Buffer[cUartTemp2++]=0x55;
Send232Buffer[cUartTemp2++]=0x03;
Send232Buffer[cUartTemp2++]=0x04;
Send232Buffer[cUartTemp2++]=0x00;
Send232Buffer[cUartTemp2++]=Rev232Buffer[5];//*********
Send232Buffer[cUartTemp2++]=0x06;
Send232Buffer[cUartTemp2++]=0x00;
cAdd_Make05Answer=Send232Buffer[2];
cXor_Make05Answer=Send232Buffer[2];
for(i_Make05Answer=3;i_Make05Answer<=7;i_Make05Answer++)
{
cAdd_Make05Answer=cAdd_Make05Answer+Send232Buffer[i_Make05Answer];
cXor_Make05Answer=cXor_Make05Answer^Send232Buffer[i_Make05Answer];
}
Send232Buffer[cUartTemp2++]=cAdd_Make05Answer;
Send232Buffer[cUartTemp2++]=cXor_Make05Answer;
Send232Buffer[cUartTemp2++]=0xaa;
Send232Buffer[cUartTemp2++]=0xaa;
TxPos=0;
TxNum=cUartTemp2;
TI=1;
}
//
unsigned char ReadTime()
{
for(i_RdTime=0;i_RdTime<9;i_RdTime++)
clock[i_RdTime]=0;
I2Cstart();
I2Csend(0xA2);
if(I2Csuback()==0)return 0;
I2Csend(0x02);
if(I2Csuback()==0)return 0;
I2Cstart();
I2Csend(0xA3);
if(I2Csuback()==0)return 0;
clock[0]=I2Cread()&0x7f;//seconds
I2Cmastack();
clock[1]=I2Cread()&0x7f;//min
I2Cmastack();
clock[2]=I2Cread()&0x3f;//hours
I2Cmastack();
clock[3]=I2Cread()&0x3f;//day
I2Cmastack();
clock[7]=I2Cread()&0x07;//week
I2Cmastack();
clock[4]=I2Cread()&0x1f;//mouth
I2Cmastack();
clock[5]=I2Cread()&0x7f;//year
I2Cnoack();
I2Cstop();
clock[6]=0x20;
cClock_Year=clock[5];
cClock_Month=clock[4];
cClock_Day=clock[3];
cClock_Hour=clock[2];
cClock_Minute=clock[1];
cClock_Second=clock[0];
return 1;
//
}//
//
void I2Cstart(void)
{
I2C_SCK=0;_nop_();_nop_();
I2C_SDA=1;_nop_();_nop_();
I2C_SCK=1;_nop_();_nop_();
I2C_SDA=0;_nop_();_nop_();
I2C_SCK=0;_nop_();_nop_();
I2C_SDA=1;_nop_();_nop_();
I2C_SCK=1;
}
//
void I2Csend(unsigned char d)
{
unsigned char i;
BitValue1=d;
for(i=0;i<8;i++){
I2C_SDA=bBit7;
BitValue1<<=1;_nop_();_nop_();
I2C_SCK=1;_nop_();_nop_();
I2C_SCK=0;
}
}
//
void I2Cmastack(void)
{
I2C_SDA=0;
I2C_SCK=1;_nop_();_nop_();_nop_();
I2C_SCK=0;
I2C_SDA=1;
}
//
unsigned char I2Csuback(void)
{
unsigned char i;
I2C_SDA=1;//_nop_();_nop_();
I2C_SCK=1;_nop_();_nop_();
for(i=0;i<255;i++){
_nop_();_nop_();
if(I2C_SDA==0){
I2C_SCK=0;
return 1;
}
}
I2C_SCK=0;
return 0;
}
//
unsigned char I2Cread(void)
{
unsigned char i;
BitValue1=0;
for(i=0;i<8;i++){
BitValue1<<=1;
I2C_SDA=1;
I2C_SCK=1;_nop_();_nop_();_nop_();
bBit0=I2C_SDA;
I2C_SCK=0;
}
return BitValue1;
}
//
void I2Cnoack(void)
{
I2C_SDA=1;
I2C_SCK=1;_nop_();_nop_();_nop_();
I2C_SCK=0;
}
//
void I2Cstop(void)
{
I2C_SCK=0;_nop_();_nop_();
I2C_SDA=0;_nop_();_nop_();
I2C_SCK=1;_nop_();_nop_();
I2C_SDA=1;
}
//
void Make07Answer()
{//55 55 03 09 00 CF 07 04 11 11 16 09 08 2F D1 AA AA
cUartTemp2=0;
Send232Buffer[cUartTemp2++]=0x55;
Send232Buffer[cUartTemp2++]=0x55;
Send232Buffer[cUartTemp2++]=0x03;
Send232Buffer[cUartTemp2++]=0x09;
Send232Buffer[cUartTemp2++]=0x00;
Send232Buffer[cUartTemp2++]=Rev232Buffer[5];//*********
Send232Buffer[cUartTemp2++]=0x07;
Send232Buffer[cUartTemp2++]=clock[5];//Year
Send232Buffer[cUartTemp2++]=clock[4];//Month
Send232Buffer[cUartTemp2++]=clock[3];//Day
Send232Buffer[cUartTemp2++]=clock[2];//Hour
Send232Buffer[cUartTemp2++]=clock[1];//Minute
Send232Buffer[cUartTemp2++]=clock[0];//Second
cAdd_Make05Answer=Send232Buffer[2];
cXor_Make05Answer=Send232Buffer[2];
for(i_Make05Answer=3;i_Make05Answer<cUartTemp2;i_Make05Answer++)
{
cAdd_Make05Answer=cAdd_Make05Answer+Send232Buffer[i_Make05Answer];
cXor_Make05Answer=cXor_Make05Answer^Send232Buffer[i_Make05Answer];
}
Send232Buffer[cUartTemp2++]=cAdd_Make05Answer;
Send232Buffer[cUartTemp2++]=cXor_Make05Answer;
Send232Buffer[cUartTemp2++]=0xaa;
Send232Buffer[cUartTemp2++]=0xaa;
TxPos=0;
TxNum=cUartTemp2;
TI=1;
}//
//
unsigned char set_time(void)
{
I2Cstart();
for(i_RdTime=0;i_RdTime<11;i_RdTime++){
I2Csend(clock[i_RdTime]);
if(I2Csuback()==0)return 0;
}
I2Cstop();
return 1;
}
//
void Make08Answer()
{//55 55 03 04 00 CF 08 00 DE C0 AA AA
cUartTemp2=0;
Send232Buffer[cUartTemp2++]=0x55;
Send232Buffer[cUartTemp2++]=0x55;
Send232Buffer[cUartTemp2++]=0x03;
Send232Buffer[cUartTemp2++]=0x04;
Send232Buffer[cUartTemp2++]=0x00;
Send232Buffer[cUartTemp2++]=Rev232Buffer[5];//*********
Send232Buffer[cUartTemp2++]=0x08;
Send232Buffer[cUartTemp2++]=0x00;
cAdd_Make05Answer=Send232Buffer[2];
cXor_Make05Answer=Send232Buffer[2];
for(i_Make05Answer=3;i_Make05Answer<=7;i_Make05Answer++)
{
cAdd_Make05Answer=cAdd_Make05Answer+Send232Buffer[i_Make05Answer];
cXor_Make05Answer=cXor_Make05Answer^Send232Buffer[i_Make05Answer];
}
Send232Buffer[cUartTemp2++]=cAdd_Make05Answer;
Send232Buffer[cUartTemp2++]=cXor_Make05Answer;
Send232Buffer[cUartTemp2++]=0xaa;
Send232Buffer[cUartTemp2++]=0xaa;
TxPos=0;
TxNum=cUartTemp2;
TI=1;
}
//
void DispTextLine(unsigned char Row,unsigned char code *MenuText,unsigned char DispAttrib)
{
//
p_DispTextLine=MenuText;
col_DispTextLine=1;
do
{
if((Row==1)&&(col_DispTextLine==1))//第一行
{
cTextLineTemp1=DispAttrib S_ZS;
}
else
if((Row==1)&&(col_DispTextLine==14))
{
cTextLineTemp1=DispAttrib S_YS;
}
else
if((Row==1)&&(col_DispTextLine!=1)&&(col_DispTextLine!=14))
{
cTextLineTemp1=DispAttrib S_S;
}
else
if((Row==7)&&(col_DispTextLine==1))//第7行
{
cTextLineTemp1=DispAttrib S_ZX;
}
else
if((Row==7)&&(col_DispTextLine==14))
{
cTextLineTemp1=DispAttrib S_YX;
}
else
if((Row==7)&&(col_DispTextLine!=1)&&(col_DispTextLine!=14))
{
cTextLineTemp1=DispAttrib S_X;
}
else
if((Row!=1)&&(Row!=7)&&(col_DispTextLine==1))//中间行的左右两边
{
cTextLineTemp1=DispAttrib S_Z;
}
else
if((Row!=1)&&(Row!=7)&&(col_DispTextLine==14))
{
cTextLineTemp1=DispAttrib S_Y;
}
else//中间行的剩下的字符
{
cTextLineTemp1=DispAttrib;
}
//
DispOneBoxTextChar(Row,col_DispTextLine,*p_DispTextLine,cTextLineTemp1);
col_DispTextLine++;
p_DispTextLine++;
}while(*p_DispTextLine!=0x00);
}
//
void DispMenu_Root()
{
for(cMenuTemp1=0;cMenuTemp1<7;cMenuTemp1++)
{
if(cMenuTemp1<4)
{
if(iMenuNextID==Menu_RootID[cMenuTemp1])
{
DispTextLine(cMenuTemp1+1,&Menu_Root[cMenuTemp1][0],0);
}
else
{
DispTextLine(cMenuTemp1+1,&Menu_Root[cMenuTemp1][0],1);
}
}
else
{
DispTextLine(cMenuTemp1+1,&MenuNULL[0],1);
}
}
}
//
void DispMenu_View()
{
for(cMenuTemp1=0;cMenuTemp1<7;cMenuTemp1++)