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

📄 lcd320240.h

📁 LCD320240的AVR单片机驱动程序,显示的字模需行列式取模,液晶驱动芯片是1335
💻 H
📖 第 1 页 / 共 2 页
字号:
#ifndef LCD320240
#define LCD320240

#include"delay.h" 
#include"charactor.h"

#define uchar unsigned char
#define uint unsigned int

//液晶与单片机接口
//---------------------       

#define PORT_WR PORTA.3
#define PORT_RD PORTA.4
#define PORT_CS PORTA.5
#define PORT_A0 PORTA.6

#define DDR_WR DDRA.3
#define DDR_RD DDRA.4
#define DDR_CS DDRA.5
#define DDR_A0 DDRA.6

#define PORT_LCD PORTC
#define DDR_LCD DDRC
#define PIN_LCD PINC
//--------------------- 

//系统控制
//-----------------------------------------------------------------------------
#define SYSTEMSET       0x40    //初始化
const uchar SYSTEMSET_DATA[]={0x30,0x87,0x07,0x27,0x55,0xef,0x28,0x00};    // P1-P8参数 
#define SLEEP_IN        0x53    //空闲操作 
//-----------------------------------------------------------------------------
//显示操作
//----------------------------------------------
#define DISP_ON         0x59    //显示开
#define DISP_OFF        0x58    //显示关
#define SCROLL	        0x44    //设置显示区域,卷动
#define AREA1    0x00
#define AREA2    0x28
#define AREA3    0x60
#define AREA4    0x00
const uchar SCROLL_DATA[]={0x00,AREA1,0xf0,0x00,AREA2,0xf0,0x00,AREA3,0x00,AREA4};
#define CSRFORM         0x5D    //设置光标形状
#define CGRAM_ADR       0x50    //设置CGRAM起始地址
#define CSRDIR_R        0x4C    //设置光标移动方向
#define CSRDIR_L        0x4D
#define CSRDIR_U        0x4E
#define CSRDIR_D        0x4F
#define HDOT_SCR        0x5A    //设置点单元卷动位置
#define OVLAY           0x5B    //设置合成显示方式
//----------------------------------------------
//绘制操作
//----------------------------------------------
#define CSRW            0x46    //设置光标地址
#define CSRR            0x47    //读光标地址
//---------------------------------------------- 
//存储操作
//----------------------------------------------
#define MWRITE          0x42    //数据写入显示缓冲区
#define MREAD           0x43    //从显示缓冲区读出数据    
//----------------------------------------------

//函数声明
//======================================================================================================
///////////////////////////////////////底层驱动/////////////////////////////////////////////////////////
void  Init_LCD( void );                             //LCM初始化
void  LCD_write_cmd( unsigned char cmd );          //写指令
void  LCD_write_data( unsigned char data );        //写数据 
uchar LCD_read_data( void );                        //读数据 
void  LCD_locate_xy(uchar x,uchar y, uchar area); //放置光标

//////////////////////////////////////基本操作///////////////////////////////////////////////////////////
void  display_char ( uchar x, uchar y, uchar area,uchar data_char); //显示一个字节内容
uchar read_data ( uchar x, uchar y, uchar area); //读回一个字节数据

//////////////////////////////////////文本操作///////////////////////////////////////////////////////////
void  display_string ( uchar x, uchar y,uchar *string);//显示一串字符
void  display_string_flash ( uchar x, uchar y,uchar flash *string);//显示一个串字符,被其它函数调用
void  num(unsigned char x,unsigned char y,unsigned int n);//显示整型数据n
void  num16(unsigned char x,unsigned char y,unsigned int n);//显示16进制数据n 
void  num_float(unsigned char x,unsigned char y,float n);//显示浮点数    

//////////////////////////////////////图形操作//////////////////////////////////////////////////////////
//图形数据全是纵向取模
void  clear_screen( uchar area, uchar color);      //显示区清屏,area可选1区或2区,color:0,填充白,1,填充黑
void  clear_part(uint locate_x,uint locate_y,uchar area,uint x,uint y,uchar color);//清除(locate_x,locate_y)处大小为x*y的区域
void  show_string ( uchar x, uchar y,uchar flash *string);//图像方式显示一串字符
void  number(unsigned char x,unsigned char y,unsigned int n);//显示整型数据n
void  number16(unsigned char x,unsigned char y,unsigned int n);//功能:在第y行,x列处显示16进制数据n
void  number_float(unsigned char x,unsigned char y,float n);//显示浮点数
void  draw_picture(uint locate_x,uint locate_y,uchar area,uint x,uint y,uchar *bmp);//画图  
void  draw_picture_flash(uint locate_x,uint locate_y,uchar area,uint x,uint y,uchar flash *bmp);//画图   
//在(locate_x,locate_y),(范围达320*240)处显示每个大小为x*y的n个汉字或图片
void  draw_anywhere(uint locate_x,uint locate_y,uchar area,uint x,uint y,uchar n,uchar flash *bmp);
void  hanzi(uchar locate_x,uchar locate_y,uchar x,uchar y,uchar n,uchar flash *zi);//显示n个汉字,40*240 
void  draw_dot(uint x,uint y);//在第y行,x列画一点   
void  clear_dot(uint x,uint y);//在第y行,x列擦除一点     
void  line(float x1,float y1,float x2,float y2);//画线 
void  box(uint x1,uint y1,uint x2,uint y2); //画矩形 
void  circuit(uint x1,uint y1,uint r); //画圆                                                                      
//======================================================================================================

/*====================底层驱动================================================================*/
//液晶初始化
//---------------------------------------------------------------------------------- 
void Init_LCD( void ) 
{ 
	uchar i; 	
	PORT_WR=1;
	PORT_RD=1;
	PORT_A0=1;
	PORT_CS=0;
		
	DDR_WR=1;
	DDR_RD=1;
	DDR_A0=1;
	DDR_CS=1;
	
    PORT_LCD=0xFF;
    DDR_LCD=0xFF;
    
    LCD_write_cmd( SYSTEMSET );            // 系统参数设置 
    
    for (i=0;i<8;i++) 
    {                 
        LCD_write_data( SYSTEMSET_DATA[i] );  
    } 

    LCD_write_cmd( SCROLL );               //设定显示区域起始地址 
    for (i=0;i<10;i++) 
    { 
        LCD_write_data( SCROLL_DATA[i] ); 
    } 

    LCD_write_cmd( HDOT_SCR );             // 写入点位移指令代码 
    LCD_write_data( 0 );                   // 写入P1参数 
    LCD_write_cmd( OVLAY );                // 显示合成方式设置 
    LCD_write_data( 0x00);                 // 0000 0100 显示一区图形,三区图形属性,二重"或"合成 
    LCD_write_cmd( DISP_ON );              // 写入指令代码 
    LCD_write_data( 0x54 );                // 显示 1~4 区开显示,光标关显示 
}
//----------------------------------------------------------------------------------- 
 
// 写指令代码子程序
//--------------------------------- 
void LCD_write_cmd( uchar cmd ) 
{  
	PORT_A0=1;
	PORT_RD=1;
	PORT_WR=0;
	PORT_LCD = cmd;
	PORT_WR=1;
} 
//---------------------------------

// 写参数及显示数据子程序 
//--------------------------- 
void LCD_write_data( uchar data ) 
{ 
	PORT_A0=0;
	PORT_RD=1;
	PORT_WR=0;
	PORT_LCD = data;
	PORT_WR=1;
}
//---------------------------
 
// 读参数及显示数据子程序 
//--------------------------- 
uchar LCD_read_data( void ) 
{
	uchar data; 
	PORT_A0=1;
	PORT_WR=1;
	PORT_RD=0;
	DDR_LCD  = 0x00;
	#asm("nop");#asm("nop");
	data = PIN_LCD;
	PORT_RD=1;
	DDR_LCD  = 0xff;
    return data; 
} 
//--------------------------- 
/*================================================================================================*/


/*=======================================基本操作==================================================*/
//光标定位
//-----------------------------------------------------------------------------
void LCD_locate_xy(uchar x,uchar y, uchar area) 
{ 
    uint temp,temp2,temp3,temp4; 
    temp = (uint) y*SYSTEMSET_DATA[6] + x;
    temp2=AREA2; 
    temp3=AREA3;
    temp4=AREA4;
    temp2<<=8;
    temp3<<=8;
    temp4<<=8;   
    switch( area )
    {
        case 2:temp += temp2; break;
        case 3:temp += temp3; break;
        case 4:temp += temp4; break;
    } 		
    LCD_write_cmd( CSRW );                      // 光标Locate,定位 
    LCD_write_data( (uchar)(temp & 0xff) );    // 写入参数CSRL设置参数光标指针低8位 
    LCD_write_data( (uchar)(temp >> 8 ) );     // 写入参数CSRH设置参数光标指针高8位 
} 
//-----------------------------------------------------------------------------

//显示一个字节内容
//-----------------------------------------------------------------------------
void display_char ( uchar x, uchar y, uchar area,uchar data_char)
{
    LCD_locate_xy(x,y,area);
	LCD_write_cmd( MWRITE );                    // 当前位置写入数据指令 
    LCD_write_data( data_char );                // 写入显示字符代码 
} 
//----------------------------------------------------------------------------- 

//读回一个字节数据
//-----------------------------------------------------------------------------
uchar read_data ( uchar x, uchar y, uchar area)
{
    LCD_locate_xy(x,y,area);
    LCD_write_cmd(MREAD); 
    return LCD_read_data();
} 
/*==============================================================================================*/



/*===============================文本方式操作====================================================*/
//显示一个串字符  
//-------------------------------------------------------------------------------
void display_string ( uchar x, uchar y,uchar *string)
{     
    uint i=0;
    while(string[i])
    {
        display_char(x,y,1,string[i]);
        i++;
        x++;
    }
} 
//-------------------------------------------------------------------------------

//显示一个串字符  
//-------------------------------------------------------------------------------
void display_string_flash ( uchar x, uchar y,uchar flash *string)
{     
    uint i=0;
    while(string[i])
    {
        display_char(x,y,1,string[i]);
        i++;
        x++;
    }
} 
//-------------------------------------------------------------------------------

//显示整型数据n
//---------------------------------------------------------------------
void num(unsigned char x,unsigned char y,unsigned int n)
{
    unsigned char i=0,length=0,a[7]={0,0,0,0,0,0,0};
	unsigned int nx=n;
	for(i=0;i<6;i++)
	{
	    if(nx>0)length++;
	    nx/=10;
	}
	nx=n;
    for(i=length;i>0;i--)
    {
        a[i-1]=nx%10+48;
        nx=nx/10;
    }
    if(n==0)a[0]='0';
	display_string(x,y,a);
}
//--------------------------------------------------------------------- 

//显示16进制数据n
//--------------------------------------------------------------------- 
void num16(unsigned char x,unsigned char y,unsigned int n)
{
	unsigned char i=0,a[7]={0,0,0,0,0,0,0};
	unsigned int nx=n;
	if(nx<=0xFF)
	{
		a[3]=nx%16;
		nx/=16;
		a[2]=nx%16;
		for(i=2;i<4;i++)
		{
			if(a[i]<10)a[i]+=48;
			else a[i]+=55;
		}
		a[4]=0x00;
	}
	else
	{
		a[5]=nx%16;
		nx/=16;
		a[4]=nx%16;
		nx/=16;
		a[3]=nx%16;
		nx/=16;
		a[2]=nx%16;
		for(i=2;i<6;i++)
		{
			if(a[i]<10)a[i]+=48;
			else a[i]+=55;
		}
	}
	a[1]='x';
	a[0]='0';
	display_string(x,y,a);
}
//---------------------------------------------------------------------

//显示浮点数
//---------------------------------------------------------------------
void num_float(unsigned char x,unsigned char y,float n)
{
	unsigned char i=0,numlength=0,xlength=0,zlength=0,flag=0;//numlength是数长,xlength是小数长度,zlength是整数长度
	unsigned char a[10]={0,0,0,0,0,0,0,0,0,0};
	float ftemp;
	long int ltemp=0;
	if(n<0)
	{
		n=-n;
		flag=1;
	}
	ftemp=n;
	//该循环计算出小数长度
	for(i=0;i<6;i++)
	{
		ltemp=ftemp;			//去掉小数
		if(ftemp>ltemp)
		{
			ftemp=ftemp*10;
			ltemp=ftemp;
			xlength++;
		}
	}
	ltemp=n;						//去掉小数
	//该循环计算出整数长zlength
	for(i=0;i<6;i++)
	{
		if(ltemp>=1)
		{
			ltemp=ltemp/10;
			zlength++;
		}
	}
	if(n<1)
		zlength=1;
	numlength=zlength+xlength;	//计算原数字及小数点的长度
	//将n去掉小数点放进ftemp
	ftemp=n;
	for(i=xlength;i>0;i--)
		ftemp=ftemp*10;
	//如果是负数,则置负号
	if(flag==1)
	{
		numlength++;
		zlength++;
	}
	//将ftemp变为长整型放进字符数组a[]
	ltemp=ftemp;
	for(i=numlength;i>zlength;i--)
	{
		a[i]=ltemp%10+48;
		ltemp/=10;
	}
	a[zlength]='.';
	for(i=zlength;i>0;i--)
	{
		a[i-1]=ltemp%10+48;
		ltemp/=10;
	}
	a[numlength+1]=0;
	ltemp=n;
	if(ltemp==n)a[numlength]=0x00;	//如果该n是整数则去掉小数点
	if(flag==1)a[0]='-';
	display_string(x,y,a);
}   
 
/*==============================================================================================*/


/*===================================图形操作====================================================*/
//清除显示区
//-----------------------------------------------------------------------------
void clear_screen( uchar area, uchar color) 
{ 
    uint i=9600; 

    LCD_write_cmd( CSRDIR_R );            // 光标移动方向定义:自动右移 
    LCD_write_cmd( CSRW  );               // 光标Locate,定位 
    LCD_write_data( 0 );                  // 写入参数CSRL设置参数光标指针低8位
    switch( area )                       // 写入参数CSRH设置参数光标指针高8位 
    {
        case 1:LCD_write_data( AREA1 );break;
        case 2:LCD_write_data( AREA2 );break;
    }              
    LCD_write_cmd( MWRITE  );              // 数据写入指令,代码0x42 
    while(i--)    
    { 
        switch( color )                        
        {
            case 0:LCD_write_data( 0x00 );break;
            case 1:LCD_write_data( 0xFF );break;
        } 
    }
    
    if(area==0)
    {
        LCD_write_data( AREA1 );
        while(i--)    
        { 
            switch( color )                        
            {
                case 0:LCD_write_data( 0x00 );break;
                case 1:LCD_write_data( 0xFF );break;
            } 
        }
        i=9600;
        LCD_write_cmd( CSRW  );
        LCD_write_data( 0 ); 
        LCD_write_data( AREA2 );
        while(i--)    
        { 
            switch( color )                        
            {
                case 0:LCD_write_data( 0x00 );break;
                case 1:LCD_write_data( 0xFF );break;
            } 
        }
    } 
}
//-----------------------------------------------------------------------------

//清除(locate_x,locate_y)处大小为x*y的区域,area:区,color:0白色,1黑色
//-----------------------------------------------------------------------------
void clear_part(uint locate_x,uint locate_y,uchar area,uint x,uint y,uchar color)
{
    uint i,j; 
    uchar x_begin=locate_x/8, x_end=(locate_x+x)/8;  //算出长的前后地址
    uchar y_end=locate_y+y;                          //算出宽的末地址
    uchar x_begin_mode=0, x_end_mode=0;  //x前后端余数
    uchar data_begin=0, data_end=0;      //每一行的前后两端的字节数据 
    uchar contain=0,contain_begin=0,contain_end=0; 
         
    x_begin_mode = (8-locate_x%8);
    x_end_mode = (locate_x+x)%8;
    
    if(color==0) contain=0;
    else contain=0xFF; 
    
    if(area==2)
    { 
        if(x_begin==x_end)
        {
            contain <<= (8-x_begin_mode);//保留前后,去掉中间
            contain >>= (8-x_begin_mode); 
            contain >>= (8-x_end_mode);

⌨️ 快捷键说明

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