📄 lcd320240.h
字号:
#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 + -