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

📄 lcddisp.c

📁 基于ARM的gps智能公车报站系统的程序设计
💻 C
字号:
#include "option.h"
#include "def.h"
#include "44b.h"
#include "44blib.h"
#include "picturemap.h"
#include "stdio.h"


typedef unsigned long uint32;
typedef unsigned short uint16;

short displaybuffer[64][8];
void  delay(unsigned long  dly);
void  Blink(int row);
void  TextDisplayInit(void);
void  displaypicture(int m);

#define displaycommand 0xfa
#define controlcommand 0xf8

#define RS_L   rPDATC&=~(1<<6)
#define RS_H   rPDATC|=(1<<6)
#define RW_L   rPDATC&=~(1<<4)
#define RW_H   rPDATC|=(1<<4)
#define EN_L   rPDATC&=~(1<<2)
#define EN_H   rPDATC|=(1<<2)


#define LCD_CS   0x80         //p2.5  vd4    112         RS
#define LCDDATA  0x20         //p2.6  vd6    114         R/W
#define LCDCLK   0x08         //p2.7  iisclk 116         E
/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly		延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void  DelayNS(uint32  dly)
{  uint32  i;

   for(; dly>0; dly--) 
      for(i=0; i<500000; i++);
}


void  LCDIni(void)
{ 

				// 管脚功能设置
     rPCONC&=0xffff00ff;	
     rPCONC|=0x5500;    // 
}

/****************************************************************************
*名称 SendLCD()
* 功能:向LCD发送数据或命令。
* 入口参数:data    待发送的数据,命令/数据选择 1 命令 0 数据
***************************************************************************/

void SendLcd(unsigned char ldate, char flag)		
{
        unsigned char send_data[3];
        unsigned char i, j;
        send_data[0] = (flag == 1) ? 0xF8 : 0xFA;	
        send_data[1] = ldate & 0xF0;				
        send_data[2] = (ldate << 4) & 0xF0;
        EN_L;
        RS_H;;
        for (i = 0; i < 3; i++) {
                for(j = 0; j < 8; j++) {
                        EN_L;
                        if(((send_data[i]<<j)&0x80)==0x80)
						RW_H;

					    else 
						RW_L;

                        EN_H;
                }
        }
        
        EN_L;
        RS_L;
        delay(20);
        return;
}  


void DisplayChineseword(unsigned short int x,unsigned short int y,unsigned int chineseword) //在x,y位置的一个汉字显示
{


	unsigned int i;
	char i1,i2;  
   i=(unsigned int)chineseword;
   i2=i;
   i1=i>>8;
   switch(x){
   case 0:
     SendLcd(0x80+y,1);               //DD RAM 地址给定
     break;
    case 1:
     SendLcd(0x90+y,1);               //DD RAM 地址给定
     break;
       case 2:
     SendLcd(0x88+y,1);               //DD RAM 地址给定
     break;
      case 3:
     SendLcd(0x98+y,1);               //DD RAM 地址给定
     break;
   }
     SendLcd(i1,0);   
     SendLcd(i2,0);
      
         
}

void DisplayChar(unsigned short int x,unsigned short int y,char *CharString) //在x,y位置的一个汉字显示
{
   U8 i;

	char DATA;  
   switch(x){
   case 0:
     SendLcd(0x80+y,1);               //DD RAM 地址给定
     break;
   case 1:
     SendLcd(0x90+y,1);               //DD RAM 地址给定
     break;
   case 2:
     SendLcd(0x88+y,1);               //DD RAM 地址给定
     break;
   case 3:
     SendLcd(0x98+y,1);               //DD RAM 地址给定
     break;
   }
   while(*CharString!='@')
   { 
     DATA=*CharString;
     SendLcd(DATA,0);
     *CharString++;   
   }
      
         
}

void printsentence(unsigned short int x,char *p)//xdenotes the start line  the 12864module is 4 line and 8 column
{
unsigned int chineseword;
unsigned short int temp1,temp2,i;
   DelayNS(2);
   SendLcd(0x06,1);                //;DDRAM的地址计数器(AC)加1
for( i=0;i<8;i++)
{
temp1=(unsigned short int)*p++;
temp2=(unsigned short int)*p++;
chineseword=temp1;
chineseword=(chineseword<<8)|(unsigned int)temp2;
DisplayChineseword(x,i,chineseword);
   }
}

void printdot(int x,int y)//x and y is 128*64
{
   displaybuffer[x][y/16]|=0x8000>>(y%16);
}

void clearpicture()
{
    int i,j;
   SendLcd(0x32,1);              // 功能设置---8BIT控制界面,绘图显示ON  
   SendLcd(0x36,1);              //功能设置---8BIT控制界面,扩充指令集  
   SendLcd(0x34,1);              //关显示   
   for(i=0;i<64;i++)
     for(j=0;j<8;j++)          
      displaybuffer[i][j]=0;      
   SendLcd(0x36,1);             //开显示
}

void clearsentence()
{
   SendLcd(0x30,1);             //功能设置---8BIT控制界面,基本指令集
   SendLcd(0x0c,1);             //显示打开,光标关,反白显示关 
   SendLcd(0x01,1);             //清除屏幕显示,将DDRAM的地址计数器归零
   DelayNS(2);
}

void printxy(int x,int y,int Bold)
{
if(x<0) x=0;
if(y<0) y=0;
if(x>127) x=127;
if(y>63) y=63;
if(Bold==0) 
printdot(64-y,x);
else {printdot(64-y,x);
printdot(64-y+1,x);

  }
}

void line_y(int startX,int startY,int length)
{
int i;
for (i=startX;i<length;i++)
     printdot(i,startY);
}

void line_x(int startX,int startY,int length)
{
int i;
 
SendLcd(0x34,1);                //关显示
for (i=startY;i<length;i++)
     printdot(startX,i);
SendLcd(0x36,1);                //关显示     
}

void graphshow()               //在LCD输出显示buffer的内容
{ int i,j;

   SendLcd(0x30,1);            //基本命令
   SendLcd(0x02,1);            //地址归位 
   SendLcd(0x36,1);            //8BIT控制界面,扩充指令集
   SendLcd(0x32,1);            // 功能设置---8BIT控制界面,绘图显示ON
   SendLcd(0x34,1);                //关显示
   SendLcd(0x34,1);                //关显示
  
  for(i=0;i<64;i++)
     for(j=0;j<8;j++)
    {
   SendLcd(0x80+i%32,1);                            //设置绘图区的Y地址坐标      
   SendLcd(0x80+(j+((int)(i/32))*8)%128,1) ;        //设置绘图区的X地址坐标
   SendLcd(displaybuffer[i][j]>>8,0);
   SendLcd(displaybuffer[i][j],0);
    }
   
  SendLcd(0x36,1);          //开显示
 }
    
 void  TextDisplayInit()
  {
   
   SendLcd(0x30,1);                 //功能设置---8BIT控制界面,基本指令集
   SendLcd(0x08,1);
   SendLcd(0x0c,1);                 //显示打开,光标关,反白显示关 
   SendLcd(0x06,1);
   SendLcd(0x01,1);                 //清除屏幕显示,将DDRAM的地址计数器归零
   SendLcd(0x02,1);
   
  }

  void displaypicture(int m )
  {
  int i,j,temp1,temp2;
  line_x(0,0,20);
  for(i=0;i<64;i++)
     for(j=0;j<8;j++)
      {     
      temp1 =0x00;
         switch(m){
         case 0:temp2=temp1|picture0[i][j*2];
                temp2=temp2<<8;
                temp1=temp2|picture0[i][j*2+1];  
         break;
         case 1:temp2=temp1|picture1[i][j*2];
                temp2=temp2<<8;
                temp1=temp2|picture1[i][j*2+1];    
         break;
         case 2:temp2=temp1|picture2[i][j*2];
                temp2=temp2<<8;
                temp1=temp2|picture2[i][j*2+1];
         break;
         case 3:temp2=temp1|picture3[i][j*2];
                temp2=temp2<<8;
                temp1=temp2|picture3[i][j*2+1];    
         break;
         case 4:temp2=temp1|picture4[i][j*2];
                temp2=temp2<<8;
                temp1=temp2|picture4[i][j*2+1];   
         break;
         case 5:temp2=temp1|picture5[i][j*2];
                temp2=temp2<<8;
                temp1=temp2|picture5[i][j*2+1];    
         break;
         case 6:temp2=temp1|picture6[i][j*2];
                temp2=temp2<<8;
                temp1=temp2|picture6[i][j*2+1];
         break;
         case 7:temp2=temp1|picture7[i][j*2];
                temp2=temp2<<8;
                temp1=temp2|picture7[i][j*2+1];    
         break;
         case 8:temp2=temp1|picture8[i][j*2];
                temp2=temp2<<8;
                temp1=temp2|picture8[i][j*2+1];   
         break;
         case 9:temp2=temp1|picture9[i][j*2];
                temp2=temp2<<8;
                temp1=temp2|picture9[i][j*2+1];
         break;
                
         default: break;       }
      displaybuffer[i][j]=temp1;
      }
  }
    
  //发白显示
void  Blink(int row)
 { int i,j;
 
    SendLcd(0x34,1);                //关显示

  for(i=0;i<64;i++)
     for(j=0;j<8;j++)
    {
   SendLcd(0x80+i%32,1);                //设置绘图区的Y地址坐标
   
 
   
   SendLcd(0x80+j+((int)(i/32))*8,1) ;              //设置绘图区的X地址坐标

  if((row*16<i)&&(i<(row+1)*16) ){  SendLcd(0xff,0);
       SendLcd(0xff,0);
      }
  else{
  SendLcd(0x0,0);
  SendLcd(0x0,0);
  };
     SendLcd(0x36,1);                 //功能设置---8BIT控制界面,扩充指令集

    }
}
  
  
void flash(int row,int location)
{
   if(location!=0)
   {
       SendLcd(0x30,1);//基本指令
       SendLcd(0x0C,1);//
       SendLcd(0xf,1);//游标开
       SendLcd(0x7,1);
         switch(row){
         case 1:SendLcd(0x80+location,1);  
         break;
         case 2:SendLcd(0x90+location,1);    
         break;
         case 3:SendLcd(0x88+location,1);
         break;
         case 4:SendLcd(0x98+location,1);   
         break;
         default: break; 
         }

    }

}

void delay(unsigned long int i)
{

for(i;i>0;i--);
}

⌨️ 快捷键说明

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