专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

电子测速里程防盗报警器设计(3)

作者:佚名   来源:本站原创   点击数:  更新时间:2010年09月12日   【字体:
//***************************************
//显示程序
//功能:驱动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); 

关闭窗口

相关文章