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

📄 lcd.c

📁 基于c8051f020的应用
💻 C
📖 第 1 页 / 共 2 页
字号:
//**************************************************************************************************************************
#include <c8051F020.h>
#include <intrins.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include "HEAD.H"
//**************************************************************************************************************************
void LCD_C_D(bit flag,unsigned char ldata)
{
    A0 = !flag;
	RD = 1;
	WR = 1;
	CS_LCD = 1;
	P3 = LcdDataChange(ldata);	// 由于硬件数据线相反
	CS_LCD = 0;
	WR = 0;
    CS_LCD = 1;
	WR = 1;
}
//**************************************************************************************************************************
void ChangeV(unsigned char changevol)
{	
	LCD_C_D(1,0x81);			// 设置电量值寄存器	
	LCD_C_D(1,changevol);		// V5 as 1/7
}
//**************************************************************************************************************************
void LCD_INIT(void)
{
	xdata unsigned char i,j,st_data;

	Delay_ms(200);
	LCD_CLEAR();
	LCD_C_D(1,0xA1);   			// Display ON(1)/OFF(0) 设置reverse的显示模式,seg132->seg1/
	LCD_C_D(1,0x40);			// 8.4ADD	//0x20   //Display Start Line Address
	for(i=0;i<8;i++)			// 设置各page地址的column地址从0开始
	{
		st_data = i|0xB0;
		LCD_C_D(1,st_data);		
		LCD_C_D(1,0x10);		
		LCD_C_D(1,0);		
		for (j=0;j<130;j++)		// 清空显示RAM
		{
	    	LCD_C_D(0,0);
		}
	}
	ChangeV(90);

	LCD_C_D(1,0xA4);		// 显示所有点
	LCD_C_D(1,0xA6);		// 正常显示
	LCD_C_D(1,0xA3);		// 设置电压基准比例1/7,a2
	LCD_C_D(1,0xC8);		// 设置列扫描方向反转,c0
	LCD_C_D(1,0x2F);		// 电源供电操作模式boosting on/ regulator on/follower ON
	LCD_C_D(1,0x81);		// 设置电量值寄存器
	LCD_C_D(1,0x64);		// V5 as 1/7
	LCD_C_D(1,0x23);		// 内部电阻比例模式23,27
	LCD_C_D(1,0xAD);		// 静态指示常亮模式//cancle
	LCD_C_D(1,0x03);		// cancle
	LCD_C_D(1,0xAF);		// 设置显示模式ON

	//LCD_DispStr("RotateSpeed",MainShowAddr,30);
	disp_chn_str("抽油机转速仪",5,20,16,1);
	//LCD_DispStr("Beijing Goldentime",MainShowAddr+30,10);
	disp_chn_str("北京金时",40,35,16,1);
	Display_Data();
	Delay_ms(3000);
}
//**************************************************************************************************************************
void LCD_CLEAR(void)
{
	xdata unsigned char i,j; 
	
	for (j = 0 ; j < 8 ; j ++)
	 {
	    for (i = 0 ;  i< 128 ; i ++)
		{	
		    disp_ram[j][i] = 0x00;
		}
	 }

	 Display_Data();
}
//**************************************************************************************************************************
void LCD_Cursor_Show(unsigned char lay_y,unsigned char lay_x)
{
	draw_line(lay_x-2,lay_y+8,lay_x+4,lay_y+8);
	Display_Data();
}
//**************************************************************************************************************************
//送显示缓冲区到显示屏 此液晶屏分左右半屏送显示缓冲区到显示屏是要分别写LCS2选通左半屏LCS1选通右半屏
void Display_Data(void)
{
	xdata unsigned char i,j,disp_page;

    disp_page = 0xB4;
	for(i =0 ; i < 8; i++)	
	{
		LCD_C_D(1,disp_page);		
		LCD_C_D(1,0x10);		// 设置列地址高位
		LCD_C_D(1,0x02);		// 设置列地址低位0		
		for (j = 0;j < 128; j++)
		{			
			LCD_C_D(0,disp_ram[i][j]) ;
		}
		disp_page ++;
		if(disp_page > 0xB7)
			disp_page = 0xB0;
	}

	ChangeV(RTUaddress4[33]);
}
//**************************************************************************************************************************
unsigned char LcdDataChange(unsigned char datas)
{
	xdata unsigned char i,tempd;
	xdata unsigned char bb[8];

	tempd=datas;
	for(i=0;i<8;i++)
	{
		if((tempd & 0x01)==0x01)
			bb[i]=1;
		else
			bb[i]=0;
		tempd>>=1;
	}
	tempd=bb[0]*0x80+bb[1]*0x40+bb[2]*0x20+bb[3]*0x10+bb[4]*0x08+bb[5]*0x04+bb[6]*0x02+bb[7]*0x01;

	return tempd;
}
//**************************************************************************************************************************
void draw_line(unsigned char x1, unsigned char y1,unsigned char x2, unsigned char y2)
{
	xdata unsigned char i,line,page;
	xdata float add_step,temp_step;

	if(x1 > 126){x1 = x1 - 114;}
	if(x2 > 126){x2 = x2 - 114;}
	if(y1 > 64){y1 = y1 - 64;}
	if(y2 > 64){y2 = y2 - 64;}
	if((x1 == x2) && (y1 == y2))
	{
	    line = y1 & 0x07;  page = y1 >> 3;
		disp_ram[page][x1] |= (0x01 << line);
	}
	else if(x1 == x2 )
	{
	  if( y1 > y2 ) {i = y2; y2 = y1; y1 = i;}	
	  for(i = y1; i <= y2 ;i++ )	  	
 	  {
	    line = i & 0x07;  page = i >> 3;
		disp_ram[page][x1] |= (0x01 << line);
	  }
	}

	else if(y1 == y2 )
	{
	  if( x1 > x2 ) {i = x2; x2 = x1; x1 = i;}	
 	  line = 0x01 << (y1 & 0x07);  page = y1 >> 3;
	  for(i = x1; i <= x2 ;i++ )	  	
 	  {
		disp_ram[page][i] |= line;
	  }
	}
	else 
	{
		if((abs)(y2-y1) >= abs(x2-x1))
		{
	      	temp_step = x1;
  	      	add_step = ((float)x2-(float)x1)/abs((float)y2-(float)y1);
		 	if(y1 > y2) i = 1; else i = 0;
		  	do	  	
			{
				x1 = temp_step;
		 		line = y1 & 7; page = y1 >> 3;
				disp_ram[page][x1] |= (0x01 << line);
			    temp_step += add_step;
				if(i) y1--;  else y1++;

	  		}while(y1 != y2);
	 		line = y2 & 0x07;  page = y2 >> 3;
	  		disp_ram[page][x2] |= (0x01 << line);
		}
       else	
	    { 
 			temp_step = y1;
	      	add_step = ((float)y2-(float)y1)/abs((float)x2-(float)x1);

       	   	if(x1 > x2) i = 1; else i = 0;
     	   	do	  	
 	        {
			   y1 = temp_step;	
		 	   line = y1 & 0x07;
		  	   page = y1  >> 3;

			   disp_ram[page][x1] |= (0x01 << line);
			  temp_step += add_step;
		      if(i) x1 -- ;  else x1 ++;

	  	    }while(x1 != x2);
	 	    line = y2 & 0x07;  page = y2 >> 3;
		    disp_ram[page][x2] |= (0x01 << line);
	    }
	}
}
//**************************************************************************************************************************
//入口为井名字符代码串指针,显示行值,列值,间隔
void LCD_DispStr(unsigned char *addr_da, char disp_x, char disp_y)
{
	xdata unsigned char ia;
	xdata unsigned char StrLong;

    ia = *addr_da++;
	//StrLong=lenth; 
	StrLong=strlen(addr_da)+1; 

	while((ia)&&(StrLong))
	{
		if(ia >= 97 && ia <= 122)//"a-z"
		{
			display_asc8x8((ia - 0x2A - 32), disp_x , disp_y, 1,1);//换成大写的字母
		}
		else if(ia == 0x20)
		{
			display_asc8x8(49, disp_x , disp_y, 1,1);//空格
		}
		else if	(ia > 125 || ia < 27)
		{
			display_asc8x8(0 , disp_x , disp_y, 1,1);
		}//如果不是asc2码,用*表示
		else 
		{
			display_asc8x8((ia - 0x2A), disp_x, disp_y, 1,1);
		}
		disp_y += 6;
   	    ia = *addr_da++;
		StrLong --;
  	}
}
//**************************************************************************************************************************
//显示一个字符程序,asc_position为在ASC8X8的一维次序,
void display_asc8x8(char asc_position,unsigned char page, unsigned char column, char val,unsigned char fx)
{
   	xdata unsigned char *ptr;

	ptr = ASC8X8[asc_position];
	display_asc8x6(ptr, page, column, val,fx);

}
//**************************************************************************************************************************
//显示8*6asc字符,将要显示的字符放在显示缓冲区中。asc字符可以选择是否覆盖原有显示,当val = 1时清除原有内容,
void display_asc8x6(unsigned char *data_ptr,unsigned char page, unsigned char column, char val,unsigned char fx)
{
   xdata unsigned  char i,j,k,st_data,page1,column1;
   xdata unsigned  char ii,ij;
   xdata unsigned  char hzdata[8];
   xdata unsigned  char hz_temp[8];
   
   unsigned char code *ptr;

   ptr = data_ptr;
   page1 = page;
   column1 = column;
   if(column1 > 122) column1 = 0;//列数到尾
   for (i=0;i<8;i++)
    {
	  if(fx == 0)		

⌨️ 快捷键说明

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