⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 知能车源码,CCD采样道路,飞思卡尔智能车比赛源码.
💻 C
字号:
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#include "funtion.h"


#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long


#define cs_s PTH|=0x08
#define cs_c PTH&=~0x08

#define ck_s PTH|=0x40
#define ck_c PTH&=~0x40

#define da_s PTH|=0x20
#define da_c PTH&=~0x20

#define rd_p PTIH&0x10    //read PH4

volatile uchar kp=0;


void dy(uint t)   //delay t uS
{
 uchar i;
 while(t--) 
  {
   for(i=0;i<3;i++)  
      ;
   asm(nop);
  }
}

void delay(uint t)  //delay t mS
{
 while(t--)    //
    {
      dy(1200);
    }
}

interrupt 25 void ph(void)    //port H
{
 if(PIFH&0x80)      //遥控中断
   {
    dy(100);
    if(m_en&&(PTIT&0xB0)==0x10)     //stop
        m_en=0;
   }
   
 else if(PIFH&0x01)  //车上键盘
   {
    delay(1);
    if((PTIH&0x01)==0)
       m_en=0;
   }
 PIFH=0xff;        //clean flag
}

uchar rk(void)    //read keyboard
{
 uchar ret=0;
 uchar i;
 
 ret=(PTIH|0xf8);     //读取PH0-PH2
 
 if(ret!=0xff)
      return(ret&0x07);  //有键按下,返回数据位
 else       //读液晶键盘
  {
   ret=0;
   
   if(rd_p) 
     ret|=0x01;
   cs_s;          //hold the line
   dy(10);
   for(i=0;i<7;i++)   
    {
     ret<<=1;
     ck_s;
     dy(10);
     if(rd_p)
       ret|=0x01;
     ck_c;
     dy(10);
    }
   dy(10);
   cs_c;
   return ret;
  }
}



uchar key(void)   //get keyboard value
{
 uchar ret;
 if(kp)   //some key press condition
   {
    if(rk()!=0xff)      //some key press conditon
       return(0x80);     //
    else    //no key press condition
      {
       delay(20);
       if(rk()==0xff)     //no key press
         {
           kp=0;
           return(0xff);
         } //
       else
         return(0x80);
      }
   } 
 else   //no key press condition'
   {
     if(rk()!=0xff)   //
       {
        delay(20);
        ret=rk();
        
        if(ret!=0xff)   //some key press cfonditon]
          {
           if(ret==0xDF)        //1-8为液晶键盘
                ret=1;
           else if(ret==0xBF)
                ret=2;
           else if(ret==0xF7)
                ret=3;
           else if(ret==0x7F)
                ret=4;
           else if(ret==0xEF)
                ret=5;
           else if(ret==0xFB)
                ret=6;
           else if(ret==0xFD)
                ret=7;
           else if(ret==0xFE)
                ret=8;
           
           else if(ret==0x05)  //9-11为车上键盘
                ret=9;
           else if(ret==0x06)   
                ret=10;
         /*  else if(ret==0x03)
                ret=11;        //按键11被拆除*/
           kp=1;
           return ret;
          } 
       else         
          return 0xff;
       } 
    else
       return 0xff;
   }
}
 
    



void w_lcd(uchar dat_com,uchar cont)		//向LCD写命令或数据,由dat_com决定
{
 uchar tp[3];
 uchar i,j,tmp;
 
 tp[0]=0xf8;
 if(dat_com)  
    tp[0]|=0x02;
 tp[1]=cont&0xf0;
 tp[2]=cont&0x0f;
 tp[2]<<=4;
 
 dy(10);
 
 for(i=0;i<3;i++)
   {
    tmp=tp[i];
    for(j=0;j<8;j++)
      {
       if(tmp&0x80)   
            da_s;
	     else
	      	  da_c;
	     tmp<<=1;
	     ck_s;
	     dy(1);
	     ck_c;
	     dy(1);
	    }
   }
  
  if(dat_com==0&&cont==0x01)  
    dy(1600);
  else
   	dy(60);	//data
}

void set(uchar sway)		//seting display way
{
 if(sway==0x00)   
    w_lcd(com,0x32), w_lcd(com,0x08); 		//not display
 else if(sway==0x01)  
    w_lcd(com,0x32), w_lcd(com,0x0c), w_lcd(com,0x06);  //cursor not flash, not move
 else if(sway==0x02)  
    w_lcd(com,0x32), w_lcd(com,0x0d), w_lcd(com,0x06);	//cursor flash, not move
 else if(sway==0x03)  
    w_lcd(com,0x32), w_lcd(com,0x0c), w_lcd(com,0x07);   //cursor not flash, move left when writing 
 else if(sway==0x04)  
    w_lcd(com,0x32), w_lcd(com,0x0d), w_lcd(com,0x07); //cursor flash, move ledt wehn writing
}


/*光标定位*/
void go(uchar xxx, uchar yyy)
{ 
  w_lcd(com,0x32);
  if(yyy==0)  
     w_lcd(com,0x80+xxx);
  else if(yyy==1) 
     w_lcd(com,0x90+xxx);
  else if(yyy==2) 
     w_lcd(com,0x88+xxx);
  else if(yyy==3) 
     w_lcd(com,0x98+xxx);
}

void wc(uchar *chan)      //写N个字符
{
 uchar i;
 for(i=0;chan[i]!='\0';i++)
    w_lcd(dat,chan[i]);
}
 
void wn(uchar num1,uchar num2)		//wtite number or leter
{
 if(num1<10)
   w_lcd(dat,num1+0x30);
 else if(num1>10)
   w_lcd(dat,num1);
 if(num2<10)
   w_lcd(dat,num2+0x30);
 else if(num2>10)
   w_lcd(dat,num2);
}

void wh(uchar const *chan)    //写入N个字符(汉字) 到/x0
{
 uchar i;
 uchar ttp;
 ttp=0xff;
 for(i=0;ttp!='\0';i++)
  {
   ttp=*(chan+i);
   w_lcd(dat,ttp);
  }
}



void wu (uchar const *ch0, uchar const *ch1, uchar const *ch2, uchar const *ch30)
{ 
  w_lcd(com,0x32);      //切换到基本指令集
  w_lcd(com,0x01);      
  set(1);
  go(0,0);
  wh(ch0);		//write line 0
  go(0,1);
  wh(ch1);		//write line 1
  go(0,2);
  wh(ch2);
  go(0,3);
  wh(ch30);
}

void clr_pr(void)   //清屏
{
  uchar i,j;
  w_lcd(com,0x32);      //切换到基本指令集
  w_lcd(com,0x01);      //CLR
  set(0);               //不显示光标
  w_lcd(com,0x34);
   for(j=0;j<32;j++)
    {
     for(i=0;i<8;i++) 
      {
        w_lcd (com,0x80+j);		//写Y地址
        w_lcd (com,0x80+i);			//写X地址
        w_lcd(dat,0x00);    //全部数据写0
        w_lcd(dat,0x00);    //全部数据写0
      }
    }
      for(j=0;j<32;j++)
    {
	    for(i=0;i<8;i++) 
	     {
	       w_lcd (com,0x80+j);		//写Y地址
         w_lcd (com,0x88+i);			//写X地址
         w_lcd(dat,0x00);    //全部数据写0
         w_lcd(dat,0x00);    //全部数据写0
	     }
    }
}


void dr(void)     //画画
{
 uchar i=0;
 uchar j=0;
 uchar *pd;
 
 uchar tmp[128]={
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 };       //显存
 
 if(vc)     //正在采集第二场,使用第一场
    pd=rdd1; 
 else      //正在采集第一场,使用第二场
    pd=rdd2;
 
 //将CCD采集到的数据转化为LCD的点阵数据
 for(j=0;j<16;j++)      //行计数
   {
    for(i=0;i<8;i++)   //行内计数
      {
       if(*(pd+j*64+i*8)<GATE0)
         *(tmp+j*8+i)|=0x80;
       if(*(pd+j*64+i*8+1)<GATE0)
         *(tmp+j*8+i)|=0x40;
       if(*(pd+j*64+i*8+2)<GATE0)
         *(tmp+j*8+i)|=0x20;
       if(*(pd+j*64+i*8+3)<GATE0)
         *(tmp+j*8+i)|=0x10;
       if(*(pd+j*64+i*8+4)<GATE0)
         *(tmp+j*8+i)|=0x08;
       if(*(pd+j*64+i*8+5)<GATE0)
         *(tmp+j*8+i)|=0x04;
       if(*(pd+j*64+i*8+6)<GATE0)
         *(tmp+j*8+i)|=0x02;
       if((*(pd+j*64+i*8+7)<GATE0)&&(i!=7))  //一行63个点,最后一个不画
         *(tmp+j*8+i)|=0x01;      //*/
       }
   }
  //在LCD 画下点阵数据
  w_lcd (com,0x36);		//切换到扩展指令
  for(j=0;j<32;j++)
    {
	   for(i=0;i<4;i++) 
	     {
	       w_lcd(com,0x80+j);		//写Y地址
         w_lcd(com,0x80+i);			//写X地址
	       w_lcd(dat,*(tmp+(j/2)*8+i*2));// (dat,imge[j*16+i*2]);  //写数据
	       w_lcd(dat,*(tmp+(j/2)*8+i*2+1));
	      }
    }
}


void dg(void)     //画重心
{
 uchar i,j;
 ulong tmp[32]={  //显存
 0};
 char tmp1;
 //将重心数据转化为LCD的点阵数据
 for(i=0;i<16;i++)     //一场16行
  {
   tmp1=*(gg1+i);
   if(-32==tmp1)        //左边看不到有效点
      tmp1=-31;
   else if(32==tmp1)   //右边看不到有效点
      tmp1=31;
  
   if(tmp1<0) 
    {
     *(tmp+(2*i))=0x80000000>>(tmp1+31);
     *(tmp+(2*i)+1)=0;
    } 
   else if(tmp1==0)    //
    {
     *(tmp+(2*i))=1;
     *(tmp+(2*i)+1)=0x80000000;
    } 
   else    //正
    {
     *(tmp+(2*i))=0;
     *(tmp+(2*i)+1)=0x80000000>>(tmp1);
    }
 }    //*/

 //将点阵数据显示到LCD上
  w_lcd (com,0x36);		//切换到扩展指令
  for(j=0;j<32;j++)
    {
	    w_lcd(com,0x80+j);		//写Y地址
      w_lcd(com,0x88);			//写X地址
	    w_lcd(dat,((*(tmp+(j&0xfe)))>>24)&0x00ff);// (dat,imge[j*16+i*2]);  //写数据
	    w_lcd(dat,((*(tmp+(j&0xfe)))>>16)&0x00ff);
	    w_lcd(dat,((*(tmp+(j&0xfe)))>>8)&0x00ff);
	    w_lcd(dat,((*(tmp+(j&0xfe))))&0x00ff);
	    w_lcd(dat,((*(tmp+(j&0xfe)+1))>>24)&0xff);// (dat,imge[j*16+i*2]);  //写数据
	    w_lcd(dat,((*(tmp+(j&0xfe)+1))>>16)&0x00ff);
	    w_lcd(dat,((*(tmp+(j&0xfe)+1))>>8)&0x00ff);
	    w_lcd(dat,((*(tmp+(j&0xfe)+1)))&0x00ff);
	   }

}   //*/

void wgc(uchar *fr)      //向液晶写入重心和曲率
{
 uchar tmp;

/* go(4,1);                 //曲率
 wn(' ',' ');
 wn((cu%100)/10,cu%10);
                          //不呆见点数
 go(7,1);
 wn(' ',*us%10);
 
 go(4,2);                 //重心
 if(*gx<0)   
    wc(" -");
 else
    wc(" +");
 tmp=abs(*gx);
 wn(tmp/10,tmp%10);     */
 
 go(5,2);
 wn(*(fr)/10,*(fr)%10);
 go(7,2);
 wn(*(fr+1)/10,*(fr+1)%10);
 
 go(4,3);
 wn(GATE0/10,GATE0%10);
 go(7,3);             
 wn(GATE1/10,GATE1%10);  //门槛
 
 
} 

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -