📄 cxlcdnew.c
字号:
//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 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的地址线移到这个口内容的低位)
//菜单专用
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;
//中断0用
unsigned char xdata cTemp_ex0 _at_ 0x204c;
//通讯中断用
unsigned int xdata i_uart _at_ 0x204d;
//读时间用
unsigned char xdata i_RdTime _at_ 0x2059;
//键处理程序专用
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;
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;
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
};
main()
{
MyInit();
bOldOnline=(~bOnline);
b_KeyInt=0;
b_ReceiveOver=0;
b_Arrive1S=0;
DispFaceBmp();
iMenuID=MENU_FACE;//赋初值在这里==0
while(1)
{
ReadyForKey();//开始键盘扫描的一部分
//
BitValue=XBYTE[Addr_Key];
if(bOldOnline!=bOnline)
{
bOldOnline=bOnline;
if(!bOldOnline)
{//Line=1
}
else
{//Line=0;
}
}
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_DOWN:
if((KeyTab[iMenuID].KeyTab_PressDown!=999)&&(iMenuNextID!=999))
{
KeyTab[iMenuID].KeyTab_PressOk=KeyTab[iMenuNextID].KeyTab_PressDown;
iMenuNextID=KeyTab[iMenuNextID].KeyTab_PressDown;
JudgeHLight();
}
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;
}
}
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;
//
}
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 DispMenu_Root()
{
for(cMenuTemp1=0;cMenuTemp1<7;cMenuTemp1++)
{
if(cMenuTemp1<4)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -