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

📄 lcd12864.c

📁 基于51单片机的图形LCD驱动程序,建立了完成的中英文字符和基本图形输出程序,字符点阵从一片Flash存储器读出.
💻 C
字号:
//lcd12864.c
#include"general.h"
#include"lcd12864.h"
#include"lcd_code.h"
#include"sys12M.h"
#include"cm27c04.h"
#include<math.h>
sbit EN = P1^0;
//********************************
extern BYTE code char_code[95][16];
extern BYTE code motor_icon[6][32];
extern BYTE bdata tempchar[8];
//********************************
void lcd_init(void)
{
     lcd_cmd1_send(0x3F);
	 lcd_cmd1_send(0xC0);

     lcd_cmd2_send(0x3F);
	 lcd_cmd2_send(0xC0);
}
//********************************
void start_row(BYTE nrow)
{
	lcd_cmd1_send(nrow|0xC0);
	lcd_cmd2_send(nrow|0xC0);
}
//********************************
void lcd_cmd1_send(BYTE cmd)
{
     BYTE state;
	 do
     {
		ADDR_LCD = E1_state_r;
		EN = 1;
		state = DATA_LCD;
		EN = 0;
		state = state & 0x80;
     }while(state);
	 ADDR_LCD = E1_cmd_w;
	 EN = 1;
	 DATA_LCD = cmd;
	 _nop_();
	 EN = 0;
	 
}
//***********************************
void lcd_cmd2_send(BYTE cmd)
{
     BYTE state;
	 do
     {
	 	ADDR_LCD = E2_state_r;
		EN = 1;
		state = DATA_LCD;
		EN = 0;
		state = state & 0x80;
     }while(state);
	 ADDR_LCD = E2_cmd_w;
	 EN = 1;
	 DATA_LCD = cmd;
	 _nop_();
	 EN = 0;
}
//*************************************
void lcd_data1_send(BYTE dat)
{
	 BYTE state;
	 do
     {
	 	ADDR_LCD = E1_state_r;
		EN = 1;
		state = DATA_LCD;
		EN = 0;
		state = state & 0x80;
     }while(state);
	 ADDR_LCD = E1_data_w;
	 EN = 1;
	 DATA_LCD = dat;
	 _nop_();
	 EN = 0;
}
//***********************************
void lcd_data2_send(BYTE dat)
{
	 BYTE state;
	 do
     {
	 	ADDR_LCD = E2_state_r;
		EN = 1;
		state = DATA_LCD;
		EN = 0;
		state = state & 0x80;
     }while(state);
	 ADDR_LCD = E2_data_w;
	 EN = 1;
	 DATA_LCD = dat;
	 _nop_();
	 EN = 0;
}
//************************************
//*************************LCD清屏
void lcd_clear()
{
     BYTE page;
     BYTE i,j;
     for(i=0;i<8;i++)
     {
        page =  i | 0xB8;
        lcd_cmd1_send(page);
        lcd_cmd1_send(0x40);
        lcd_cmd2_send(page);
        lcd_cmd2_send(0x40);
        for(j=0;j<64;j++)
        {
           lcd_data1_send(0x00);
           lcd_data2_send(0x00);
        }
     }
}
//***********************LCD写字符子程序
BYTE lcd_char_send(BYTE *dat,BYTE page/*0,2,4or8*/,BYTE line_num,bit bclr)
{
    BYTE temp,cur_line;
    BYTE i;
    temp = page | 0xB8;
    for(i=0,cur_line=line_num;i<8;i++,cur_line++)
    {
       if(cur_line<64)
       {
          lcd_cmd1_send(temp);
          lcd_cmd1_send(cur_line|0x40);
          if(bclr) lcd_data1_send(dat[i]);
		  else     lcd_data1_send(~dat[i]);
       }
       else
       {
          lcd_cmd2_send(temp);
          lcd_cmd2_send((cur_line-64)|0x40);
          if(bclr) lcd_data2_send(dat[i]);
		  else     lcd_data2_send(~dat[i]);
       }
    }
    temp = (page+1) | 0xB8;

    for(i=8,cur_line=line_num;i<16;i++,cur_line++)
    {
       if(cur_line<64)
       {
          lcd_cmd1_send(temp);
          lcd_cmd1_send(cur_line|0x40);
          if(bclr) lcd_data1_send(dat[i]);
		  else     lcd_data1_send(~dat[i]);
       }
       else
       {
          lcd_cmd2_send(temp);
          lcd_cmd2_send((cur_line-64)|0x40);
          if(bclr) lcd_data2_send(dat[i]);
		  else     lcd_data2_send(~dat[i]);
       }
    }
    line_num += 8;
    return line_num;
}
//*************************打印字符
BYTE print_char(BYTE the_char,BYTE page,BYTE line_num,bit bclr)
{
      line_num = lcd_char_send(char_code[the_char-32],page,line_num,bclr);
      return line_num;
}
//*************************打印字符串
BYTE print_string(BYTE *string,BYTE page,BYTE line_num,bit bclr)
{
     BYTE i;
     BYTE char_test;
	 i = 0;
     while(1)
     {
        char_test = string[i];
        if(char_test == '$') break;
		if(char_test >0xA0)
		{
			line_num = print_chs(string+i,page,line_num,bclr);
			i++;
			i++;
		}
		else
		{
         	line_num = print_char(char_test,page,line_num,bclr);
         	i++;
		}
     }
     return line_num;
}
//*************************打印图标或汉字
BYTE print_icon(BYTE *icon,BYTE page,BYTE line_num,BYTE iheight,BYTE iwidth,bit bclr)
{
    BYTE temp,cur_line;
    BYTE i,j;
	for(j=0;j<iheight;j++)
	{
	    temp = (page+j) | 0xB8;
	    for(i=0,cur_line=line_num;i<iwidth;i++,cur_line++)
	    {
	       if(cur_line<64)
	       {
	          lcd_cmd1_send(temp);
	          lcd_cmd1_send(cur_line|0x40);
	          if(bclr) lcd_data1_send(icon[i+j*iwidth]);
			  else	   lcd_data1_send(~icon[i+j*iwidth]);	
	       }
	       else
	       {
	          lcd_cmd2_send(temp);
	          lcd_cmd2_send((cur_line-64)|0x40);
	          if(bclr) lcd_data2_send(icon[i+j*iwidth]);
			  else	   lcd_data2_send(~icon[i+j*iwidth]);
	       }
	    }
	 }
    line_num += iwidth;
    return line_num;
}
//******************************打印整型数字
BYTE print_num(WORD srcnum,BYTE page,BYTE line_num,bit bclr)
{
    BYTE i;
    WORD j,digit;
    if(srcnum==0) print_string("   $",page,line_num,bclr);
    else if(srcnum<10)
    {
      digit = srcnum;
      line_num = lcd_char_send(char_code[digit+16],page,line_num,bclr);
    }
    else if(srcnum<100)
      for(i=0,j=10,digit=0;i<2;i++)
      {
          digit = srcnum / j;
          srcnum -= digit * j;
          j /= 10;
          line_num = lcd_char_send(char_code[digit+16],page,line_num,bclr);
       }

     else if(srcnum<1000)
      for(i=0,j=100,digit=0;i<3;i++)
      {
          digit = srcnum / j;
          srcnum -= digit * j;
          j /= 10;
          line_num = lcd_char_send(char_code[digit+16],page,line_num,bclr);
       }

     else if(srcnum<10000)
      for(i=0,j=1000,digit=0;i<4;i++)
      {
          digit = srcnum / j;
          srcnum -= digit * j;
          j /= 10;
          line_num = lcd_char_send(char_code[digit+16],page,line_num,bclr);
       }

     else
      for(i=0,j=10000,digit=0;i<5;i++)
      {
          digit = srcnum / j;
          srcnum -= digit * j;
          j/=10;
          line_num = lcd_char_send(char_code[digit+16],page,line_num,bclr);
       }
      return line_num;

}
//************************************
void screen_up(BYTE ustep,WORD ctime)
{
	BYTE i;
	for(i=0;i<LCD_NROW;)
	{
		lcd_cmd1_send(i|0xC0);
		lcd_cmd2_send(i|0xC0);
		i += ustep;
		delay(ctime);
	}
	lcd_cmd1_send(0xC0);
	lcd_cmd2_send(0xC0);
	
		
}
//*******************************************
void screen_down(BYTE dstep,WORD ctime)
{
	BYTE i;
	for(i=LCD_NROW-1;i<LCD_NROW;)
	{
		lcd_cmd1_send(i|0xC0);
		lcd_cmd2_send(i|0xC0);
		i -= dstep;
		delay(ctime);
	}
	lcd_cmd1_send(0xC0);
	lcd_cmd2_send(0xC0);

}
//**********************************************
void setpos(BYTE px,BYTE py,bit bclr)
{
	BYTE page;
	BYTE  posdata;
	page = py % 8;
	posdata = 0x01;
	if(page) posdata = _crol_(posdata,page);
	page = py / 8;
	page = page|0xB8;
	if(px<64)
	{
	    lcd_cmd1_send(page);
	    lcd_cmd1_send(px|0x40);
	    if(bclr) lcd_data1_send(posdata);
		else	 lcd_data1_send(~posdata);	
	}
	else
	{
	    lcd_cmd2_send(page);
	    lcd_cmd2_send((px-64)|0x40);
	    if(bclr) lcd_data2_send(posdata);
		else	 lcd_data2_send(~posdata);
	}
	
}
//***********************************************
void drawline(BYTE xb,BYTE yb,BYTE xe,BYTE ye,bit bclr)
{
	char fm;
	char xstep,ystep;
	BYTE estep;
	BYTE ncase;
	if ( (xe>=xb) && (ye>=yb) )	    ncase = 1;
	else if ( (xe<xb) && (ye>=yb) ) ncase = 2;
    else if ( (xe<xb) && (ye<yb) )  ncase = 3;
	else                            ncase = 4;
	fm = xstep = ystep = 0;
	estep = abs(xe-xb) + 1;
	do
	{
		setpos(xb+xstep,yb+ystep,bclr);
		if(fm>=0)
		{
			switch(ncase)
			{
				case 1: xstep++;
						break;
				case 2: xstep--;
						break;
				case 3: xstep--;
						break;
				case 4: xstep++;
						break;
				default:break;
			 }
			 fm -= abs(ye-yb);
			 estep--;
		 }
		 else
		 {
		 	switch(ncase)
			{
				case 1: ystep++;
						break;
				case 2: ystep++;
						break;
				case 3: ystep--;
						break;
				case 4: ystep--;
						break;
				default:break;
			 }
			 fm += abs(xe-xb);
		 }
	}while(estep);

}
//************************************************************************
void drawrect(BYTE xb,BYTE yb,BYTE rwidth,BYTE rheight,bit bclr)
{
	BYTE i;
	for(i=xb;i<xb+rwidth;i++)
	{
		setpos(i,yb,bclr);
		setpos(i,yb+rheight,bclr);
	}
	for(i=yb;i<yb+rheight;i++)
	{
		setpos(xb,i,bclr);
		setpos(xb+rwidth,i,bclr);
	}
}
//*************************************************************************
void drawcircle(BYTE xb,BYTE yb,BYTE cr,bit bclr)
{
	int fm;
	char xstep,ystep;
	BYTE estep;
	fm = 0;
	xstep = xb;
	ystep = yb+cr-1;
	estep = 4*cr-3;
	do
	{
		setpos(xstep,ystep,bclr);
		if(fm>=0)
		{
			if ( (xstep>=xb) && (ystep>=yb) )
			{
				xstep--;estep--;
				fm -= (2*xstep-1);
			}
			else if ( (xstep<xb) && (ystep>=yb) )
			{
				ystep--;
				fm -= (2*ystep-1);
			}
		    else if ( (xstep<xb) && (ystep<yb) )
			{
				xstep++;estep--;
				fm -= (2*xstep-1);
			}
			else 
            {
            	ystep++;
       			fm -= (2*ystep-1);
			}
		}
		else
		{
		 	if ( (xstep>=xb) && (ystep>=yb) )
			{
				ystep++;
				fm += (2*ystep+1);
			}
			else if ( (xstep<xb) && (ystep>=yb) )
			{
				xstep--;estep--;
				fm += (2*xstep+1);
			}
		    else if ( (xstep<xb) && (ystep<yb) )
			{
				ystep--;
				fm += (2*ystep+1);
			}
			else 
            {
            	xstep++;estep--;
       			fm += (2*xstep+1);
			}
		}
	}while(estep);

}
	

⌨️ 快捷键说明

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