//***************************************
//显示程序
//功能:驱动12864LCD
//***************************************
//延时子程序
void delay(unsigned int t)
{ unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++)
;
}
void lcdwbit(bit n)
{ SIPIN = n;
_nop_();
SCLPIN = 1;
_nop_();
SCLPIN = 0;
_nop_();
SCLPIN = 1;
}
void lcdwbyte(unsigned char databyte)
{ unsigned char i;
CSPIN=1;
CSPIN=0;
for(i=0;i<8;i++)
{ if((databyte&0x80)==0x80)
lcdwbit(1);
else
lcdwbit(0);
databyte<<=1;
}
CSPIN=1;
}
//写指令代码
void lcdwc(unsigned char cmdcode)
{ A0PIN=0;
lcdwbyte(cmdcode);
}
//写数据
void lcdwd(unsigned char dispdata)
{ A0PIN=1;
lcdwbyte(dispdata);
}
//内部数据地址指针定位
void lcdpos(void)
{ unsigned char x1,y1;
x1=(Lcd_CurrentX+1)>>4; //列从1 → 128 x1为高四位
if(Lcd_CurrentY<32)
y1=Lcd_CurrentY+32;
else
y1=Lcd_CurrentY-32;
lcdwc(0xb0|((y1/8)&0x0f)); //设置地址页指针
lcdwc(0x10|x1); //设置地址列指针(高四位)
lcdwc((Lcd_CurrentX+1)&0x0f); //设置地址列指针(低四位)
}
//当前坐标移动到下一个点
void lcdcursornext(void)
{ Lcd_CurrentX++;
if(Lcd_CurrentX>LCD_RIGHT)
{ Lcd_CurrentX=LCD_LEFT;
Lcd_CurrentY+=8;
if(Lcd_CurrentY>LCD_BOTTOM)
Lcd_CurrentY=LCD_TOP;
}
}
void displaybyte(unsigned char dispdata)
{ lcdpos(); //内部数据地址指针定位
lcdwd(dispdata); //写数据
lcdcursornext(); //当前坐标移动到下一个点
}
//整屏显示
void lcdfill_quick(unsigned char FillData)
{ unsigned char i,j;
for(j=0;j<8;j++)
{ Lcd_CurrentY=j*8;
Lcd_CurrentX=0;
lcdpos();
for(i=0;i<128;i++)
lcdwd(FillData);
}
}
void lcdfill(unsigned char FillData)
{ Lcd_Mask=0xff;
for(Lcd_CurrentX=LCD_LEFT,Lcd_CurrentY=LCD_TOP;1;)
{ displaybyte(FillData);
if((Lcd_CurrentX==LCD_LEFT)&&(Lcd_CurrentY==LCD_TOP))
break;
}
}
//初始化
void lcdreset()
{ lcdwc(0xa2); //设置LCD bias
lcdwc(0xa0); //设置ADC select
lcdwc(0xc8); //设置COM反向
lcdwc(0x2f); //设置电源控制模式
lcdwc(0xaf); //开显示
lcdwc(0x40); //设置显示初始行
}
void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s)
{ unsigned char k,lx,ly,a1,a2,y;
k=0;
YSIZE+=k;
y=Lcd_CurrentY;
for(lx=0;lx<XSIZE;lx++,Lcd_CurrentX++)
for(Lcd_CurrentY=y,ly=k,a1=0;ly<YSIZE;s++)
{ unsigned char p;
a2=*s;
lcdpos();
p=YSIZE&0x7;
if(ly<8)
{ if(YSIZE<8)
{ Lcd_Mask=LeftMask[k]&RightMask[p];
//a1=lcdrd();
a1&=(~Lcd_Mask);
a1|=(a2&Lcd_Mask);
lcdwd(a1);
ly=YSIZE;
Lcd_CurrentY+=YSIZE-k;
}
else
{ Lcd_Mask=LeftMask[k];
//a1=lcdrd();
a1&=(~Lcd_Mask);
a1|=(a2&Lcd_Mask);
lcdwd(a1);
ly+=8-k;
Lcd_CurrentY+=8-k;
}
}
else if(ly>=YSIZE-p)
{ if(k>=p)
{ s--;
a1=*s;
a2=0;
for(p=0;p<k;p++)
{ a2<<=1;
if((a1&0x80)==0x80)
a2++;
a1<<=1;
}
p=YSIZE&0x7;
}
Lcd_Mask=RightMask[p];
//a1=lcdrd();
a1&=(~Lcd_Mask);
a1|=(a2&Lcd_Mask);
lcdwd(a1);
ly+=p;
Lcd_CurrentY+=p;
}
else
{ lcdwd(a2);
ly+=8;
Lcd_CurrentY+=8;
}
a1=*s;
}
Lcd_CurrentY=y;
}
//显示汉字
void displaychinesechardot(unsigned int Index)
{ unsigned char code *s;
s=ChineseCharDot+Index*CHINESECHARDOTSIZE; //赋值汉字点阵首地址(数组名+ )
{ if(Lcd_CurrentX>LCD_RIGHT-CHINESECHARSIZE+1)
{ Lcd_CurrentX=LCD_LEFT;
Lcd_CurrentY+=CHINESECHARSIZE;
if(Lcd_CurrentY>LCD_BOTTOM-CHINESECHARSIZE+1)
Lcd_CurrentY=LCD_TOP;
}
putsizeimage(CHINESECHARSIZE,CHINESECHARSIZE,s);
}
}
//显示英文字符
void displayenglishchardot(unsigned int Index)
{ unsigned char code *s;
s=EnglishCharDot+Index*ENGLISHCHARDOTSIZE;
if(Lcd_CurrentX>LCD_RIGHT-ENGLISHCHARSIZE+1)
{ Lcd_CurrentX=LCD_LEFT;
Lcd_CurrentY+=CHINESECHARSIZE;
if(Lcd_CurrentY>LCD_BOTTOM-CHINESECHARSIZE+1)
Lcd_CurrentY=LCD_TOP;
}
putsizeimage(ENGLISHCHARSIZE,CHINESECHARSIZE,s);
}
//信息显示
void putchar(unsigned int uChar)
{ unsigned int i;
if(uChar<128)
for(i=0;i!=ENGLISHCHARNUMBER;i++)
{ if(uChar==EnglishCode)
{ displayenglishchardot(i);
break;
}
}
else
for(i=0;i!=CHINESECHARNUMBER;i++)
{ if(uChar==ChineseCode)
{ displaychinesechardot(i);
break;
}
}
}
//显示汉字或英文字符
void put_str(unsigned char code *s)
{ unsigned int i;
for(;*s!=0;s++)
{ i=*s;
if(*s>127)
{ s++;
i=i*256+*s;
}
if(i=='\n')
{ Lcd_CurrentX=LCD_LEFT;
if(Lcd_CurrentY>LCD_BOTTOM-CHINESECHARSIZE+1)
Lcd_CurrentY=LCD_TOP;
else
Lcd_CurrentY+=CHINESECHARSIZE;
}
putchar(i);
}
}
//显示汉字或英文字符
void put_str_xy(unsigned char x,unsigned char y,unsigned char code *s)
{ Lcd_CurrentX=x;
Lcd_CurrentY=y;
put_str(s);
}
//****************************************
//屏幕主模式显示
//*****************************************
void display()
{put_str_xy(x,y,"速度");
put_str_xy(x,y,"里程");
put_str_xy(x,y,"时间");
put_str_xy(x,y,"计程");
put_str_xy(x,y,"安全驾驶");
put_str_xy(x,y,"分");
put_str_xy(x,y,"km/h");
put_str_xy(x,y,"km");
put_str_xy(x,y,"hour:miniter:second");
put_str_xy(x,y,"minter1");
put_str_xy(x,y,"mile2");
put_str_xy(x,y,"mile1");
put_str_xy(x,y,"v");
}
//*************************************
//主函数
//功能:设置密码锁,修改密码,调整时间,
// 设置开锁模式,计程、计时复位
//*************************************
void main()
{char keys,lock1;
RSTPIN=0;
LCD_CurrenX=0;
LCD_CurrenY=0;
delay(100);
RSTPIN=1;
lcdreset();
lcdfill(0x00);
delay(5000);
void dispaly();
timer_initialize();
xint0_initialize();
for(i=0;i<5;i++)
password=read_byte(i);
mode=password[4];
do{key();
key1();
keys=gotkey();
switch(keys)
{case 0xc :
operation=1;
lcdfill(0x00);
if(check_password())
{lock1=1;
put_str_xy(x,y,"密码正确");
isd_setplay(0X00,0x00); //密码正确语音播报
}
else
{put_str_xy(x,y,"密码错误");
isd_setpaly(0x00,0x00);
}
lcdfill(0x00);
delay(5000);
operation=0;
display();
break;
case 0xE :
operation=1;
lcdfill(0x00);
delay(5000);
put_str_xy(x,y,"请输入密码");
get_password();
if(check_password())
if(input_new_password())
{lcdfill(0x00);
delay(5000);
put_str_xy(x,y,"正确");
}
else
{lcdfill(0x00);
delay(5000);
put_str_xy(x,y,"错误");
}
else
{lcdfill(0x00);
delay(5000);
operation=0;
dispaly();
}
break;
case 0xD :
lock=0;
lock1=0;
case 0xf :
mile2=0;
hour1=0;
miniter1=0;
break;
}
//*****************************************
//开锁模式
//******************************************
if(lock==0)
{if(mode==1)
{if(p0^7==1&&lock1=1)
lock=1;
}
if(mode==2)
{if(p0^7==1||lock1)
lock=1;
}
if(mode==3)
{if(p0^7==1)
lock=1;
}
}
if(p3^6==0)
{lock=0;mile2=0;miniter=0;}
}while(1);