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

📄 3510.c

📁 这是一个使用NOKIA 3510I的液晶屏+AVR单片机来制作的电压表
💻 C
字号:


#include "3510.h"
#include "aschz.h"



void LCD_Drawhz(uint8_t x, uint8_t y,uint8_t *n,uint8_t len,uint8_t color,uint8_t pen)
{

	uint8_t ListLength;
	uint8_t ii,i,dd,kk,aa;


ListLength=len;
	for (kk=0;kk<ListLength;kk++)
	{

	LCD_SendCD(0x2a,CMD );//column address set
    LCD_SendCD(x,DATA );
	LCD_SendCD(x+7,DATA );
 	LCD_DataOver(); 

    LCD_SendCD(0x2B,CMD );//page address set
    LCD_SendCD(y,DATA );
	LCD_SendCD(y+15,DATA );
 	LCD_DataOver(); 	
	
	LCD_SendCD(0x2C,CMD );		//memory write

	for (i=0;i<16;i++)
       {
	   aa=n[kk];
			
	      dd=asc[i+(n[kk]-32)*16];


           for(ii=0;ii<8;ii++)
             {
                if(dd & 0x80)
                LCD_SendCD(pen, DATA);   
             else
				LCD_SendCD(color, DATA);
              dd = dd << 1;
			}
		}	
	//				ListLength++;
					x=x+8;

          
	}

LCD_DataOver();
}

	
//画线
void LCD_DrawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2,uint8_t Color)
{
	uint8_t x, y, t;
	if((x1 == x2) && (y1 == y2))
		LCD_DrawPoint(x1, y1,Color);
	else if(abs(y2 - y1) > abs(x2 - x1))
	{
		if(y1 > y2)
		{
			t = y1;
			y1 = y2;
			y2 = t;
			t = x1;
			x1 = x2;
			x2 = t;
		}
		for(y = y1; y <= y2; y ++)
		{
			x = (y - y1) * (x2 - x1) / (y2 - y1) + x1;
			LCD_DrawPoint(x, y,Color);
		}
	}
	else
	{
		if(x1 > x2)
		{
			t = y1;
			y1 = y2;
			y2 = t;
			t = x1;
			x1 = x2;
			x2 = t;
		}
		for(x = x1; x <= x2; x ++)
		{
			y =(x - x1) * (y2 - y1) / (x2 - x1) + y1;
			LCD_DrawPoint(x, y,Color);
		}
	}


}	
	
	
//画点
void LCD_DrawPoint(uint8_t x, uint8_t y,uint8_t Color)
{
    LCD_SendCD(0x2a,CMD );//column address set
    LCD_SendCD(x,DATA );
	LCD_SendCD(x,DATA );
 	LCD_DataOver(); 

    LCD_SendCD(0x2B,CMD );//page address set
    LCD_SendCD(y,DATA );
	LCD_SendCD(y,DATA );
 	LCD_DataOver(); 	
	
	LCD_SendCD(0x2C,CMD );		//memory write
	LCD_SendCD(Color,DATA );
	LCD_DataOver(); 	
}	

// 短延时
void Delay5Ms(void)
{
	uint16_t i = 5552;
	while(i--);
}

//长延时
void Delay400Ms(void)
{
	uint8_t i = 5;
	uint16_t j;
	while(i--)
	{
		j=17269;
		while(j--);
	};
}



void LCD_Reset(void)
{
	cbi(LCD_RST_PORT, LCD_RST);		//set RST = L
	Delay5Ms();
	sbi(LCD_RST_PORT, LCD_RST);		//set RST = H
	Delay5Ms();
}

void LCD_SendCD(uint8_t Sdata,uint8_t CD)
{
	
	if (CD==CMD)
	{
	sbi(LCD_SIO_DDR, LCD_SIO);		//set SDI.DDR = 1
	cbi(LCD_CS_PORT, LCD_CS);		//set CS = L
	cbi(LCD_SCL_PORT, LCD_SCL);		//set SCK = L
	cbi(LCD_SIO_PORT, LCD_SIO);		//send 0, for command
	sbi(LCD_SCL_PORT, LCD_SCL);		//set SCK = H, latch data
	}
	else
	{
	sbi(LCD_SIO_DDR, LCD_SIO);		//set SDI.DDR = 1
	cbi(LCD_CS_PORT, LCD_CS);		//set CS = L
	cbi(LCD_SCL_PORT, LCD_SCL);		//set SCK = L
	sbi(LCD_SIO_PORT, LCD_SIO);		//send 1, for command
	sbi(LCD_SCL_PORT, LCD_SCL);		//set SCK = H, latch data
	}
//Bit 0(MSB)
	cbi(LCD_SCL_PORT, LCD_SCL);
	if(Sdata & 0x80)
		sbi(LCD_SIO_PORT, LCD_SIO);
	else
		cbi(LCD_SIO_PORT, LCD_SIO);
	sbi(LCD_SCL_PORT, LCD_SCL);
//Bit 1
	cbi(LCD_SCL_PORT, LCD_SCL);
	if(Sdata & 0x40)
		sbi(LCD_SIO_PORT, LCD_SIO);
	else
		cbi(LCD_SIO_PORT, LCD_SIO);
	sbi(LCD_SCL_PORT, LCD_SCL);
//Bit 2
	cbi(LCD_SCL_PORT, LCD_SCL);
	if(Sdata & 0x20)
		sbi(LCD_SIO_PORT, LCD_SIO);
	else
		cbi(LCD_SIO_PORT, LCD_SIO);
	sbi(LCD_SCL_PORT, LCD_SCL);
//Bit 3
	cbi(LCD_SCL_PORT, LCD_SCL);
	if(Sdata & 0x10)
		sbi(LCD_SIO_PORT, LCD_SIO);
	else
		cbi(LCD_SIO_PORT, LCD_SIO);
	sbi(LCD_SCL_PORT, LCD_SCL);
//Bit 4
	cbi(LCD_SCL_PORT, LCD_SCL);
	if(Sdata & 0x08)
		sbi(LCD_SIO_PORT, LCD_SIO);
	else
		cbi(LCD_SIO_PORT, LCD_SIO);
	sbi(LCD_SCL_PORT, LCD_SCL);
//Bit 5
	cbi(LCD_SCL_PORT, LCD_SCL);
	if(Sdata & 0x04)
		sbi(LCD_SIO_PORT, LCD_SIO);
	else
		cbi(LCD_SIO_PORT, LCD_SIO);
	sbi(LCD_SCL_PORT, LCD_SCL);
//Bit 6
	cbi(LCD_SCL_PORT, LCD_SCL);
	if(Sdata & 0x02)
		sbi(LCD_SIO_PORT, LCD_SIO);
	else
		cbi(LCD_SIO_PORT, LCD_SIO);
	sbi(LCD_SCL_PORT, LCD_SCL);
//Bit 7(LSB)
	cbi(LCD_SCL_PORT, LCD_SCL);
	if(Sdata & 0x01)
		sbi(LCD_SIO_PORT, LCD_SIO);
	else
		cbi(LCD_SIO_PORT, LCD_SIO);
	sbi(LCD_SCL_PORT, LCD_SCL);
//done
}


//************************
//颜色模式设置:color=1为4096色模式
//            :color=0为256色模式
//************************
void LCD_ColorSet(uint8_t Color)
{

if (Color==TRUE) {
	LCD_SendCD(0x3a, CMD);		//interface pixel format
	LCD_SendCD(0x03, DATA);    //0x03 为4096色,0x02为256色
	LCD_DataOver(); 
	}
	else
	{
	LCD_SendCD(0x3a, CMD);		//interface pixel format
	LCD_SendCD(0x02, DATA);    //0x03 为4096色,0x02为256色
	LCD_DataOver(); 


	LCD_SendCD(0x2d, CMD);		//调色板设置
//red
LCD_SendCD(0x00, DATA);
LCD_SendCD(0x02, DATA);
LCD_SendCD(0x03, DATA);
LCD_SendCD(0x04, DATA);
LCD_SendCD(0x05, DATA);
LCD_SendCD(0x06, DATA);
LCD_SendCD(0x08, DATA);
LCD_SendCD(0x0f, DATA);

//green
LCD_SendCD(0x00, DATA);
LCD_SendCD(0x02, DATA);
LCD_SendCD(0x03, DATA);
LCD_SendCD(0x04, DATA);
LCD_SendCD(0x05, DATA);
LCD_SendCD(0x06, DATA);
LCD_SendCD(0x08, DATA);
LCD_SendCD(0x0f, DATA);
//blue
LCD_SendCD(0x00, DATA);
LCD_SendCD(0x03, DATA);
LCD_SendCD(0x06, DATA);
LCD_SendCD(0x0f, DATA);
   LCD_DataOver(); 
   }
}
//************************
//清屏:color=1为4096色模式清屏
//    :color=0为256色模式清屏
//************************
void LCD_Clear(uint8_t Color)
{
	uint8_t x, y;

    LCD_SendCD(0x2a,CMD );//column address set
    LCD_SendCD(0,DATA );
	LCD_SendCD(97,DATA );
 	LCD_DataOver(); 


    LCD_SendCD(0x2B,CMD );//page address set
    LCD_SendCD(0,DATA );
	LCD_SendCD(67,DATA );
 	LCD_DataOver(); 
	

    LCD_SendCD(0x2C,CMD );//memory write
	if (Color==TRUE)	
	{
	for(y = 0; y < 68; y ++)
		for(x = 0; x < 147; x ++)
			LCD_SendCD(0,DATA );
	}
	else
	{
	for(y = 0; y < 68; y ++)
		for(x = 0; x < 98; x ++)
			LCD_SendCD(0,DATA );
	}
	LCD_DataOver(); 	

}



void LCD_Initialize(void)
{
    uint8_t i;

	sbi(LCD_RST_PORT, LCD_RST);		//set RST = H
	sbi(LCD_RST_DDR, LCD_RST);	//set RST.DDR = 1
	sbi(LCD_CS_PORT, LCD_CS);		//set CS = H
	sbi(LCD_CS_DDR, LCD_CS);	//set CS.DDR = 1
	cbi(LCD_SIO_PORT, LCD_SIO);		//set SDI = L
	cbi(LCD_SIO_DDR, LCD_SIO);	//set SDI.DDR = 0
	sbi(LCD_SCL_PORT, LCD_SCL);		//set SCK = H
	sbi(LCD_SCL_DDR, LCD_SCL);	//set SCK.DDR = 1

	LCD_Reset();
	
   LCD_SendCD(0x01, CMD);      // LCD Software Reset 
   LCD_DataOver(); 
   Delay5Ms(); 
    
   LCD_SendCD(0xC6, CMD);      // Initial Escape 
   LCD_DataOver(); 
    
   LCD_SendCD(0xB9, CMD);      // Refresh set 
   LCD_SendCD(0x00, DATA); 
   LCD_DataOver(); 
    
   LCD_SendCD(0xB6, CMD);      // Display Control 
   LCD_SendCD(128, DATA); 
   LCD_SendCD(128, DATA); 
   LCD_SendCD(129, DATA); 
   LCD_SendCD(84, DATA); 
   LCD_SendCD(69, DATA); 
   LCD_SendCD(82, DATA); 
   LCD_SendCD(67, DATA); 
   LCD_DataOver(); 
    
   LCD_SendCD(0xB3, CMD);      // Gray Scale Position 
   LCD_SendCD(1, DATA); 
   LCD_SendCD(2, DATA); 
   LCD_SendCD(4, DATA); 
   LCD_SendCD(8, DATA); 
   LCD_SendCD(16, DATA); 
   LCD_SendCD(30, DATA); 
   LCD_SendCD(40, DATA); 
   LCD_SendCD(50, DATA); 
   LCD_SendCD(60, DATA); 
   LCD_SendCD(70, DATA); 
   LCD_SendCD(80, DATA); 
   LCD_SendCD(90, DATA); 
   LCD_SendCD(100, DATA); 
   LCD_SendCD(110, DATA); 
   LCD_SendCD(127, DATA); 
   LCD_DataOver(); 
    
   LCD_SendCD(0xB5, CMD);      // Gamma Curve Set 
   LCD_SendCD(1, DATA); 
   LCD_DataOver(); 

   LCD_SendCD(0xBD, CMD);      // Power Control 
   LCD_SendCD(0x00, DATA); 
   LCD_DataOver(); 
    
   LCD_SendCD(0xBE, CMD);      // Power Control 
   LCD_SendCD(4, DATA); 
   LCD_DataOver(); 
    
   LCD_SendCD(0x11, CMD);      // Sleep out 
   LCD_DataOver(); 

   LCD_SendCD(0xBA, CMD);      // Power Control 
   LCD_SendCD(0x7F, DATA); 
   LCD_SendCD(0x03, DATA);
   LCD_DataOver(); 

   LCD_SendCD(0x36, CMD);      // 扫描方式
   LCD_SendCD(0xc0, DATA); 
   LCD_DataOver(); 
    
   LCD_SendCD(0xB7, CMD);      // Temperature gradient set 
   for(i=0; i<14; i++) { 
      LCD_SendCD(0, DATA); 
   } 
   LCD_DataOver(); 

   LCD_SendCD(0x29, CMD);      // Power Control 
   LCD_DataOver(); 
    
   LCD_SendCD(0x03, CMD);      // Booster Voltage ON 
   LCD_DataOver(); 
    
   for(i=0; i<8; i++) {   // Booster Voltage stabilisieren lassen 
      Delay5Ms(); 
   } 
    
   LCD_SendCD(0x20, CMD);      // Inversion control 
   LCD_DataOver(); 
    
   LCD_SendCD(0x25, CMD);      // Write contrast 
   LCD_SendCD(0x45, DATA); 
   LCD_DataOver(); 
}


⌨️ 快捷键说明

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