//*************************************** //顯示程序 //功能:驅(qū)動(dòng)12864LCD //*************************************** //延時(shí)子程序 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; } //寫(xiě)指令代碼 void lcdwc(unsigned char cmdcode) { A0PIN=0; lcdwbyte(cmdcode); } //寫(xiě)數(shù)據(jù) void lcdwd(unsigned char dispdata) { A0PIN=1; lcdwbyte(dispdata); } //內(nèi)部數(shù)據(jù)地址指針定位 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)); //設(shè)置地址頁(yè)指針 lcdwc(0x10|x1); //設(shè)置地址列指針(高四位) lcdwc((Lcd_CurrentX+1)&0x0f); //設(shè)置地址列指針(低四位) } //當(dāng)前坐標(biāo)移動(dòng)到下一個(gè)點(diǎn) 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(); //內(nèi)部數(shù)據(jù)地址指針定位 lcdwd(dispdata); //寫(xiě)數(shù)據(jù) lcdcursornext(); //當(dāng)前坐標(biāo)移動(dòng)到下一個(gè)點(diǎn) } //整屏顯示 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); //設(shè)置LCD bias lcdwc(0xa0); //設(shè)置ADC select lcdwc(0xc8); //設(shè)置COM反向 lcdwc(0x2f); //設(shè)置電源控制模式 lcdwc(0xaf); //開(kāi)顯示 lcdwc(0x40); //設(shè)置顯示初始行 } 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; //賦值漢字點(diǎn)陣首地址(數(shù)組名+ ) { 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,"時(shí)間"); put_str_xy(x,y,"計(jì)程"); 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"); } //************************************* //主函數(shù) //功能:設(shè)置密碼鎖,修改密碼,調(diào)整時(shí)間, // 設(shè)置開(kāi)鎖模式,計(jì)程、計(jì)時(shí)復(fù)位 //************************************* 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); //密碼正確語(yǔ)音播報(bào) } else {put_str_xy(x,y,"密碼錯(cuò)誤"); 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,"請(qǐng)輸入密碼"); 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,"錯(cuò)誤"); } else {lcdfill(0x00); delay(5000); operation=0; dispaly(); } break; case 0xD : lock=0; lock1=0; case 0xf : mile2=0; hour1=0; miniter1=0; break; } //***************************************** //開(kāi)鎖模式 //****************************************** 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);