📄 液晶多级菜单实现方法_rar cxlcdnew_c.htm
字号:
}
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)
{
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -