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

📄 lcd_display.c

📁 LCD12864 display control code
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <hidef.h>      /* common defines and macros */
#include <mc9s12xdt256.h>     /* derivative information */
#include <math.h>
#pragma LINK_INFO DERIVATIVE "mc9s12xdt256"

#define VALUE_OVERFLOW 85
#define VALUE_OK       170

#define LCD_RS        PTH_PTH0     
#define LCD_RW        PTH_PTH1     
#define LCD_E         PTH_PTH2      
#define LCD_PSB       PTM_PTM7                  
#define LCD_RESET     PTM_PTM6               
#define DATA_PORT     PORTA
#define DATA_DDR      DDRA

#define DDR_LCD_RS    DDRH_DDRH0
#define DDR_LCD_RW    DDRH_DDRH1
#define DDR_LCD_E     DDRH_DDRH2
#define DDR_LCD_PSB   DDRM_DDRM7  
#define DDR_LCD_RESET DDRM_DDRM6

//command code
#define CMD_FUNCTION  0x30	 //功能设置8位数据,基本指令
#define CMD_DISPLAY   0x0C	 //显示状态ON,游标OFF,反白OFF
#define CMD_CLEARDISP 0x01	 //清除显示
#define CMD_CLEARADDR 0x02   //地址归位
#define CMD_DDRAMADDR 0x80   //DDRAM地址归位   

//display chinese in sample
//uchar Chinese1[16]={0xC8,0xF0,0xCC,0xD8,0xB5,0xE7,0xD7,0xD3,0xBB,0xB6,0xD3,0xAD,0xC4,0xFA,0xEC,0xF4};
//uchar Chinese2[16]={0xD6,0xD0,0xCE,0xC4,0xD7,0xD6,0xBF,0xE2,0xD2,0xBA,0xBE,0xA7,0xCF,0xD4,0xCA,0xBE};
//uchar Chinese3[16]={0xC8,0xF0,0xCC,0xD8,0xB5,0xE7,0xD7,0xD3,0xBB,0xB6,0xD3,0xAD,0xC4,0xFA,0xEC,0xF4};
//uchar Chinese4[16]={0xD6,0xD0,0xCE,0xC4,0xD7,0xD6,0xBF,0xE2,0xD2,0xBA,0xBE,0xA7,0xCF,0xD4,0xCA,0xBE};
//uchar  DIGITAL[20]={0xA3,0xB0,0xA3,0xB1,0xA3,0xB2,0xA3,0xB3,0xA3,0xB4,0xA3,0xB5,0xA3,0xB6,0xA3,0xB7,0xA3,0xB8,0xA3,0xB9};
  
//uchar Temperature_Chinese[4]={0xCe,0xc2,0xb6,0xc8};
//uchar Pressure_Chinese[4]={0xD1,0xb9,0xC1,0xa6};
//uchar Flux_Chinese[4]={0xC1,0xF7,0xC1,0xbf};

//uchar Displacement1_Chinese[6]={0xb5,0xb1,0xc7,0xb0,0xD6,0xB5};//当前值      //add at 8.2.2007
//uchar Displacement2_Chinese[6]={0xBC,0xC7,0xc2,0xbc,0xD6,0xB5};//记录值      //add at 8.2.2007
//uchar Measuring_Chinese[6]={0xB2,0xE2,0xCA,0xD4,0xD6,0xD0};
//uchar Recording_Count[6]={0xBC,0xC7,0xC2,0xBC,0xCA,0xFD};//记录数
//uchar Character1[3]={'.','.','.'};
//uchar Command_Error[8]={0xC3,0xFC,0xC1,0xEE,0xB4,0xED,0xCE,0xF3};//命令错误
//uchar System_Calibration[10]={0xCF,0xB5,0xCD,0xB3,0xB1,0xEA,0xB6,0xA8,0xD6,0xD0}; //系统标定中
//uchar Data_Transmiting[10]={0xCF,0xB5,0xCD,0xB3,0xB1,0xEA,0xB6,0xA8,0xD6,0xD0};   //数据传输中
//uchar DELETE_Chinese[6]= {0xC9,0xBE,0xB3,0xFD,0xD6,0xD0};
//uchar DELETE_Success_Chinese[8]= {0xC9,0xBE,0xB3,0xFD,0xB3,0xC9,0xB9,0xA6};
//uchar DELETE_Fail_Chinese[8]= {0xC9,0xBE,0xB3,0xFD,0xCA,0xA7,0xB0,0xDC};

//uchar Title[14]={0xB5,0xA5,0xCD,0xA8,0xb5,0xc0,0xCA,0xFD,0xB2,0xC9,0xCF,0xB5,0xCD,0xB3};
//uchar Title1[8]={0xB2,0xE2,0xC1,0xBF,0xCF,0xB5,0xCD,0xB3};//测量系统
//uchar HORIZON[8]={0xBA,0xC3,0xC4,0xCD,0xb5,0xE7,0xD7,0xD3}; //好耐电子
//uchar CurrentTime[9]={'2','0','0','7','/','1','0','/','1'}; //2007/8/10
//uchar GPS_array[3]={'G','P','S'};

uchar Speed_Chinese[4]={0xcb,0xd9,0xb6,0xc8};			//速度
uchar danwei1[5]="km/h";				  				//(km/h)
uchar Distance_chiness[4]={0xbe,0xe0,0xc0,0xeb}; 	  	//距离
uchar danwei2[3]="m";
uchar danwei3[3]="km";
uchar Height_Chinese[4]={0xba,0xa3,0xb0,0xce}; 		  	//海拔   	  
uchar Star_Chinese[6]={0xce,0xc0,0xd0,0xc7,0xca,0xfd};	//卫星数
//uchar Cali_A[2]={'A','='};
//uchar Cali_B[2]={'B','='};
//uchar Char1=':';
//uchar Char2[2]={'m','m'};
uint  Display_data_length=0;
uchar Speed_string[6]="0.00 ";
uchar Distance_string[7]="0.00 ";
uchar Height_string[6]="0.00 ";

extern uchar WDog1_Clear();

/**************************************************/
void WritePort(unsigned char data){
  DATA_DDR=0xff;				// Configure the corresponding I/O pin as an output
  DATA_PORT=data; 
  return;
}
unsigned char ReadPort(void){
  unsigned char i;
  DATA_DDR=0x00;        // Configure the corresponding I/O pin as an input
  i=DATA_PORT;
  return i;
}
/********延时程序**************************    
    DELAY:
         MOV     R6,#00H
         MOV     R7,#00H
    DELAY1:
         NOP
         DJNZ    R7,DELAY1
         DJNZ    R6,DELAY1
         RET*/  
void Delay(unsigned int counter){
  unsigned int i=0;
  unsigned int j;
  for(j=0;j<counter;j++){
    for(i=0;i<255;i++){}
    WDog1_Clear();
  }
  return;
}
void Delay1(){
  uchar i=0;
  uchar j=0;
  for(j=0;j<255;j++){
    for(i=0;i<255;i++){}
    //WDog1_Clear();
  }
  return;
}
/**********读BF和AC值************************
    PR0:
         PUSH    ACC
         MOV     P0,#0FFH
         CLR     RS
         SETB    RW
         SETB    E
         MOV     COMMAND,P0
         CLR     E
         POP     ACC
         RET*/
unsigned char ReadBF_AC(void){
  unsigned char Command;
  WritePort(0xff);
  LCD_RS=0;
  LCD_RW=1;
  LCD_E=1;
  Command= ReadPort();
  LCD_E=0;
  return Command;
}
/**********写指令代码************************
函数功能:写一条指令到液晶屏
输入参数:指令代码(见代码表)
输出参数:void

    PR1:
         PUSH     ACC
         CLR      RS
         SETB     RW
    PR11:MOV      P0,#0FFH
         SETB     E
         MOV      A,P0
         CLR      E
         JB       ACC.7,PR11
         CLR      RW
         MOV      P0,COMMAND
         SETB     E
         CLR      E
         POP      ACC
         RET*/
void WriteCommand(unsigned char cmdcode){
  unsigned char i;

  LCD_RS=0;
  LCD_RW=1; 
  do{
    WritePort(0xff);
    LCD_E=1; 
    i= ReadPort();
    LCD_E=0;
    //WDog1_Clear();
  }while(i&0x80);
  
  LCD_RW=0;
  WritePort(cmdcode);
  LCD_E=1;
  LCD_E=0;
  return;
}
/**********写显示数据************************
函数功能:写显示数据DATA1到液晶屏
输入参数:显示数据DATA1
输出参数:void
    PR2:
         PUSH     ACC
         CLR      RS
         SETB     RW
    PR21:MOV      P0,#0FFH
         SETB     E
         MOV      A,P0
         CLR      E
         JB       ACC.7,PR21
         SETB     RS
         CLR      RW
         MOV      P0,DATA1
         SETB     E
         CLR      E
         POP      ACC
         RET*/
void WriteData(unsigned char data1){
  unsigned char i; 
  
  LCD_RS=0;
  LCD_RW=1; 
  do{
    WritePort(0xff);
    LCD_E=1;

    i=ReadPort();
    LCD_E=0;
    //WDog1_Clear();
  }while(i&0x80);
  
  LCD_RS=1;
  LCD_RW=0;
  WritePort(data1);
  LCD_E=1;
  LCD_E=0;
  return;
}
/**********读显示数据************************
    PR3:
        PUSH      ACC
        CLR       RS
        SETB      RW
   PR31:MOV       P0,#0FFH
        SETB      E
        MOV       A,P0
        CLR       E
        JB        ACC.7,PR31
        SETB      RS
        SETB      RW
        MOV       P0,#0FFH
        SETB      E
        MOV       COMMAND,P0
        CLR       E
        POP       ACC
        RET         */
unsigned char ReadData(void){
  unsigned char i;
  unsigned char Command;
 
  LCD_RS=0;
  LCD_RW=1;
  do{
    WritePort(0xff);
    LCD_E=1;
    //Delay(1);
    i=ReadPort();
    LCD_E=0;
    //Delay(1);
    //WDog1_Clear();
  }while(i&0x80);
  
  LCD_RS=1;
  LCD_RW=1;
  WritePort(0xff);
  LCD_E=1;
  Command=ReadPort();
  LCD_E=0;
  return Command;
}
/*************写CGROM*************************
函数功能:写CGROM,按照点阵16*16自定义一个汉字(图案) 
输入参数:cmdcode,data3,data2			//Command必须是0x40,0x50,0x60,0x70
输出参数:void
    CG:
         
         LCALL    PR1
         MOV      R0,#8
    CG1:
         MOV      DATA1,DATA3
         LCALL    PR2
         LCALL    PR2
         MOV      DATA1,DATA2
         LCALL    PR2
         LCALL    PR2
         DJNZ     R0,CG1 
         RET */ 
void WriteCGROM(unsigned char cmdcode,unsigned char data3,unsigned char data2){
  unsigned char i;
  
  WriteCommand(cmdcode);
  for(i=0;i<8;i++) {
    WriteData(data3);
    WriteData(data3);
    
    WriteData(data2);
    WriteData(data2);
  }
}
/************写DDRAM*************************
函数功能:写DDRAM,以显示CGRAM中自定义的字
输入参数:cmdcode,data2
输出参数:void
    DD:   
         LCALL    PR1
         MOV      R0,#8
    MM:  MOV      DATA1,#00H
         LCALL    PR2
         MOV      DATA1,DATA2
         LCALL    PR2
         DJNZ     R0,MM
         RET */
void WriteDDRAM(unsigned char cmdcode, unsigned char data2){
  unsigned char i=0;
  WriteCommand(cmdcode);
  for(i=0;i<8;i++){
    WriteData(0x00);  //表示所要显示的是CGRAM中自定义的字
    WriteData(data2);	 //data2的值是0x00,0x02,0x04,0x06,可显出四个自定义字
  }
  return;
}
/****************************************
    INT:
      PUSH     ACC
      PUSH     DPH
      PUSH     DPL
      PUSH     PSW
      CLR      EX0
      JNB    P3.2,$
      JB     P3.2,$
      JNB    P3.2,$
      SETB    EX0 
      CLR     IE0
      POP     PSW
      POP     DPL
      POP     DPH
      POP     ACC
      RETI*/ 
/************显示一串字符*************************
函数功能:显示一个字符 ,首字符显示在偶数列
输入参数:row,column,字符编码(范围0x01-0x7f)
输出参数:void */       
void WriteCharArray(unsigned char row, unsigned char column, unsigned char num, unsigned char * ptdata){
  unsigned char cmdcode,i;
  switch(row){
    case 1:
      cmdcode=0x80+(column-1)/2;
      break;
    case 2:
      cmdcode=0x90+(column-1)/2;
      break;
    case 3:
      cmdcode=0x88+(column-1)/2;
      break;
    case 4:
      cmdcode=0x98+(column-1)/2;
      break;
    default:
      cmdcode=0x80;
  }

  WriteCommand(cmdcode);  
  
  for(i=0;i<num;i++){
    
    WriteData(*ptdata);				//先写命令1xxxxxxxB,再写一个数据,可以显示字符(占半字) 
    ptdata++;
  }
  return;
}
uchar WriteCharArray1(unsigned char row, unsigned char column, unsigned char * ptdata){
  unsigned char cmdcode;
  uchar j;
  switch(row){
    case 1:
      cmdcode=0x80+(column-1)/2;
      break;
    case 2:
      cmdcode=0x90+(column-1)/2;
      break;
    case 3:
      cmdcode=0x88+(column-1)/2;
      break;
    case 4:
      cmdcode=0x98+(column-1)/2;
      break;
    default:
      cmdcode=0x80;
  }

  WriteCommand(cmdcode);  
  j= column;
  while((*ptdata!=' ')&&(j<=16)){
    WriteData(*ptdata);				//先写命令1xxxxxxxB,再写一个数据,可以显示字符(占半字) 
    ptdata++;
    j++;
  }
  return j;
}
uchar WriteCharArray2(unsigned char row, unsigned char column, unsigned char * ptdata){
  uchar cmdcode;
  uchar j;
  switch(row){
    case 1:
      cmdcode=0x80+(column-1)/2;
      break;
    case 2:
      cmdcode=0x90+(column-1)/2;
      break;
    case 3:
      cmdcode=0x88+(column-1)/2;
      break;
    case 4:
      cmdcode=0x98+(column-1)/2;
      break;
    default:
      cmdcode=0x80;
  }

  WriteCommand(cmdcode);  
  j= column;
  while((*ptdata!=0)&&(j<=16)){
    if((*ptdata>=0x30)&&(*ptdata<=0x39)) WriteData(*ptdata);				//先写命令1xxxxxxxB,再写一个数据,可以显示字符(占半字) 
    else if(*ptdata=='.')  WriteData(*ptdata);
    else j=16;
    ptdata++;
    j++;
  }
  return j;
}
uchar WriteCharArray3(unsigned char row, unsigned char column, unsigned char * ptdata){
  unsigned char cmdcode,i;
  uchar j;
  uchar k=0;
  switch(row){
    case 1:
      cmdcode=0x80+(column-1)/2;
      break;
    case 2:
      cmdcode=0x90+(column-1)/2;
      break;
    case 3:
      cmdcode=0x88+(column-1)/2;
      break;
    case 4:
      cmdcode=0x98+(column-1)/2;
      break;
    default:
      cmdcode=0x80;
  }

  WriteCommand(cmdcode);  
  j= column;
  
  for(i=0;i<8;i++){
    WriteData(*ptdata);
    if(*ptdata=='.') k=1;
    if(k>0) k++;
    if(k>3) i=8;
    ptdata++;
  }
  
  /*while((*ptdata!=',')&&(j<=16)){
    WriteData(*ptdata);				//先写命令1xxxxxxxB,再写一个数据,可以显示字符(占半字) 
    if(*ptdata=='.') k=1;
    if(k>0) k++;
    if(k>3) j=17;;
    ptdata++;
    j++;
  }*/
  return j;
}
/************显示一个汉字*************************
函数功能:显示一个汉字
输入参数:row,column,汉字编码低位,汉字编码高位
输出参数:void	 */

void WriteWord(unsigned char row, unsigned char column, unsigned char hdata, unsigned char ldata){
  unsigned char cmdcode;
  switch(row){
    case 1:
      cmdcode=0x80+column-1;
      break;
    case 2:
      cmdcode=0x90+column-1;
      break;
    case 3:
      cmdcode=0x88+column-1;
      break;
    case 4:
      cmdcode=0x98+column-1;
      break;
    default:
      cmdcode=0x80;
  }
  WriteCommand(cmdcode);
  WriteData(hdata);				//写汉字时,按照编码,先写高位,后写低位
  WriteData(ldata);
  return;
}
/************显示一组汉字*************************
函数功能:显示一个汉字,长度不能超过8个(一行)
输入参数:row,column,num,ptarray(可以把数组名直接传递,数组名就是首地址)
输出参数:void  */
void WriteWordArray(unsigned char row, unsigned char column,unsigned char num,unsigned char * ptarray){
  unsigned char cmdcode,i;
  switch(row){
    case 1:
      cmdcode=0x80+column-1;
      break;
    case 2:
      cmdcode=0x90+column-1;
      break;
    case 3:
      cmdcode=0x88+column-1;
      break;
    case 4:
      cmdcode=0x98+column-1;
      break;
    default:
      cmdcode=0x80;
  }

  WriteCommand(cmdcode);  
  for(i=0;i<num;i++) {
    
    WriteData(*ptarray);				//写汉字时,按照编码,先写高位,后写低位
		ptarray++;
    WriteData(*ptarray);
    ptarray++;
  }
  return;
}
/****************液晶屏复位************************/
void LCD_Reset(void){
  DDR_LCD_PSB  = 1;
  LCD_PSB=1;
  //reset display
  DDR_LCD_RESET= 1; 
  LCD_RESET=0;
  //LCD_E=1;
  Delay1();
  
  LCD_RESET=1;
  return;
}
/****************液晶屏初始化**********************/
void LCD_Init(void){
  unsigned char i;
  DDR_LCD_RS   = 1;    
  DDR_LCD_RW   = 1;    
  DDR_LCD_E    = 1;    
  DDR_LCD_PSB  = 1;   
  DDR_LCD_RESET= 1; 
  
  LCD_RS=0;
  LCD_RW=1;
  WritePort(0xff); 
  
  LCD_E=1; 
  i=0x30;
  i=ReadPort();
  LCD_E=0;
  
  Delay1();
  
  LCD_RS=0;
  LCD_RW=1;
  WritePort(0xff); 
  
  LCD_E=1;
  i=0x30;
  i=ReadPort();
  LCD_E=0;
  
  Delay1();
  
  WriteCommand(CMD_FUNCTION) ;				//功能设置8位数据,基本指令
  WriteCommand(CMD_DISPLAY)  ;				//显示状态ON,游标OFF,反白OFF
  WriteCommand(CMD_CLEARDISP);			  //清除显示
  WriteCommand(CMD_CLEARADDR);			  //地址归位
  WriteCommand(CMD_DDRAMADDR);			  //DDR地址归0
  
  Delay1();
  
  return;
}
/*****************显示HCGROM***********************/
/*void Write_HCGROM(void){   
  unsigned char mydata,i;

  //WriteCommand(0x80);
  mydata=0x02;
  for (i=0;i<16;i++){
    WriteData(mydata);
    mydata++;
  }

  WriteCommand(0x90);
  mydata=0x41;
  for (i=0;i<16;i++){
    WriteData(mydata);
    mydata++;
  }

  WriteCommand(0x88);
  mydata=0x51;
  for (i=0;i<16;i++){
    WriteData(mydata);
    mydata++;
  } 

  WriteCommand(0x98);
  mydata=0x61;
  for (i=0;i<16;i++){
    WriteData(mydata);
    mydata++;
  }
 	Delay(255);
 	Delay(255);
 	Delay(255);
}*/
/*****************显示CGRAM***********************/
/*void Write_CGRAM(void){   
  unsigned char mydata,i;

  WriteCGROM(0x40,0xff,0x00);

  WriteCGROM(0x50,0x00,0xff);

  WriteCGROM(0x60,0xaa,0xaa);

  WriteCGROM(0x70,0x55,0x55);
  
  WriteDDRAM(0x80, 0x00);
  
  WriteDDRAM(0x90, 0x00);
  
  WriteDDRAM(0x88, 0x00);
  
  WriteDDRAM(0x98, 0x00);
  
  Delay(255);
 	Delay(255);
 	Delay(255);
  
  WriteDDRAM(0x80, 0x02);
  

⌨️ 快捷键说明

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