📄 lcd.txt
字号:
12864液晶控制程序[51单片机c程序]
//注意字符或图片取模方式为字节倒序,纵向取模
//2005.6.修改了部分显示函数,使用时不再用考虑左右屏
#include "lcdriver.h"
//lcdriver.c
void Delay(long v)
{
while(--v);
}
void Write_Command(uchar cmdcode,uchar cs1,uchar cs2) //写命令到LCD
{
CS1=(cs1?1:0);
CS2=(cs2?1:0);
DI=0;
RW=0;
lcd_data_bus=cmdcode;//写命令
E=0;
Delay(1);
E=1;
E=0;
}
void Write_Data(uchar disp_data,uchar cs1,uchar cs2) //写数据到LCD
{
CS1=(cs1?1:0);
CS2=(cs2?1:0);
DI=1;
RW=0;
lcd_data_bus=disp_data;//写显示数据
E=0;
Delay(1);
E=1;
E=0;
}
uchar Read_data(uchar cs1,uchar cs2)//read data from lcd
{
unsigned char get_data;
CS1=(cs1?1:0);
CS2=(cs2?1:0);
DI=1;
RW=1;
E=1;
Delay(1);
E=0;
E=1;
E=0;
get_data=lcd_data_bus;
return get_data;
}
void Lcd_Init() //初始化LCD屏
{
RST=0; //复位 如是上电复位就不用
Delay(100);
RST=1;
Delay(100);
Write_Command(Disp_Off,1,1); //关显示
Write_Command(Row_Add+0,1,1);
Write_Command(Start_Line+0,1,1); //设置首行为起始行
Write_Command(Col_Add+0,1,1);
Write_Command(Disp_On,1,1); //开显示
}
void Clr_Screen(void)
{
uchar row,col;
for(row=0;row<8;row++)
{
for(col=0;col<128;col++)
{
lcd_row_col_data(row,col,0x00);
}
}
}
/*
void Full_Screen(void)
{
uchar row,col;
for(row=0;row<8;row++)
{
for(col=0;col<128;col++)
{
lcd_row_col_data(row,col,0xFF);
}
}
}
*/
uchar read_lcd_data(uchar row,uchar col)//新增函数 从lcd读取数据
{
uchar get_data;
Write_Command(Row_Add+row,1,1);
if(col<64)
{
Write_Command(Col_Add+col,1,0);
get_data=Read_Data(1,0);
}
else
{
Write_Command(Col_Add+col-64,0,1);
get_data=Read_Data(0,1);
}
return get_data;
}
void lcd_dot_disp(uchar x,uchar y)//新增函数 以点形式显示x 0-127; y 0-63 左下角为坐标原点
{
uchar byte_dot[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
if(((x==127)&&(y==0))||(x==126)&&(y==0)||(x==125)&&(y==0)||(x==124)&&(y==0)) //避免显示小图标
return;
Write_Command(Start_Line,1,1);
if(y<8)
{
lcd_row_col_data(7,x,byte_dot[y]);
return;
}
else if(y<16)
{
lcd_row_col_data(6,x,byte_dot[y-8]);
return;
}
else if(y<24)
{
lcd_row_col_data(5,x,byte_dot[y-16]);
return;
}
else if(y<32)
{
lcd_row_col_data(4,x,byte_dot[y-24]);
return;
}
else if(y<40)
{
lcd_row_col_data(3,x,byte_dot[y-32]);
return;
}
else if(y<48)
{
lcd_row_col_data(2,x,byte_dot[y-40]);
return;
}
else if(y<56)
{
lcd_row_col_data(1,x,byte_dot[y-48]);
return;
}
else if(y<64)
{
lcd_row_col_data(0,x,byte_dot[y-56]);
return;
}
}
void lcd_row_col_data(uchar row,uchar col,uchar disp_data)//新增函数2005.6 以字节形式显示
{
Write_Command(Row_Add+row,1,1);
if(col<64)
{
Write_Command(Col_Add+col,1,0);
Write_Data(disp_data,1,0);
}
else
{
Write_Command(Col_Add+col-64,0,1);
Write_Data(disp_data,0,1);
}
}
void signal_disp(uchar t,uchar on_off) //右上角标志显示
{
Write_Command(Row_Add+8,0,1);
Write_Command(Col_Add+59+t,0,1);
Write_Data(on_off?0x80:0x00,0,1);
}
void Ch_Display(uchar row, uchar col, uchar const *ch_data,uchar w,uchar dir) //--指定位置显示字符w*16-////////row*col /////////////max=8*128//2005.6精简
{
uchar j,i=0;
for(j=0;j<2;j++)
{
for(i=0;i<w;i++)
{
if(dir==1)
lcd_row_col_data(j+row,col+i,~ch_data[2*i+j]);//反显
else
lcd_row_col_data(j+row,col+i,ch_data[2*i+j]);//正显
}
}
}
void Ch_Display_8(uchar row, uchar col, uchar const *ch_data,uchar w,uchar dir) //--指定置显示字符///////////
////////w*8---------row*col max=8*128//2005.6精简
{
uchar i=0;
for(i=0;i<w;i++)
{
if(dir==1)
lcd_row_col_data(row,col+i,~ch_data[2*i]);//反显
else
lcd_row_col_data(row,col+i,ch_data[2*i]);//正显
}
}
void Bmp_display(uchar const *bmp)//2005.6精简 //显示128*64位图
{
uchar j,k;
Write_Command(Start_Line,1,1);
for(k=0;k<8;k++)
{
for(j=0;j<128;j++)
lcd_row_col_data(k,j,bmp[8*j+k]);
}
}
//以下程序待检测(430单片机上可以用 )
/*
void Fun_display(uchar const *bmp) //动画效果--右移
{
char j,k,x=64;
while(x--)
{
Write_Command(Row_Add,1,1);
Write_Command(Col_Add,1,1);
for(k=0;k<8;k++)
{
Write_Command(Row_Add+k,1,0); //先写左屏
for(j=0;j<64;j++)
{
if(8*j+k+8*(x-1)>1023)// 先要判断是否超出128*64的范围
Write_Data(0x00,1,0);//
else
Write_Data(bmp[8*j+k+8*(x-1)],1,0);
}
Write_Command(Row_Add+k,0,1); //写右屏
for(j=0;j<64;j++)
{
if((8*j+k+512+8*(x-1))>1023) //先要判断是否超出128*64的范围
Write_Data(0x00,0,1);
else
Write_Data(bmp[8*j+k+512+8*(x-1)],0,1);
}
}
}
}
void Fun2_display(uchar const *bmp) //动画--下移--
{
char j,k,x=63;
while(x--)
{
Write_Command(Col_Add,1,1);
for(k=7;k>=0;k--)
{
Write_Command(Row_Add+k,1,0);
for(j=0;j<64;j++)
{
if(8*j+k+x>1023)
Write_Data(0x00,1,0);// 先要判断是否超出128*64的范围
else
Write_Data(bmp[8*j+k+x],1,0);
}
Write_Command(Row_Add+k,0,1);
for(j=0;j<64;j++)
{
if((8*j+k+512+x)>1023) //先要判断是否超出128*64的范围
Write_Data(0x00,0,1);
else
Write_Data(bmp[8*j+k+512+x],0,1);
}
}
Delay(50000);
}
}
void Fun3_display(uchar const *bmp,uint h) //动画--上移 该函数实现了显示大于128*64图象的方法,
{ //现在只能实现显示128*h的图象
char j,k; //并且h为8的倍数
uint a, b,c,x;
x=h-1;
a=h/8;
b=128*a-1;
c=64*a;
while(x--)
{
Write_Command(Col_Add,1,1);
for(k=7;k>=0;k--)
{
Write_Command(Row_Add+k,1,0);
for(j=0;j<64;j++)
{
if(a*j+k-x>b) //x前的系数如为-1则是上移,是+1为下移;
Write_Data(0x00,1,0); //先要判断是否超出128*h的范围
else
Write_Data(bmp[a*j+k-x],1,0);
}
Write_Command(Row_Add+k,0,1);
for(j=0;j<64;j++)
{
if((a*j+k+c-x)>b) //先要判断是否超出128*h的范围
Write_Data(0x00,0,1);
else
Write_Data(bmp[a*j+k+c-x],0,1);
}
}
Delay(40000) ;
}
}
void Fun4_display(uchar const *bmp)
{
char j,k,x=64;
while(x--)
{
Write_Command(Col_Add,1,1);
for(k=7;k>=0;k--)
{
Write_Command(Row_Add+k,1,0);
for(j=0;j<64;j++)
{
if(16*j+k+3*x>2047)
Write_Data(0x00,1,0);// 先要判断是否超出128*64的范围
else
Write_Data(bmp[16*j+k+3*x],1,0);
}
Write_Command(Row_Add+k,0,1);
for(j=0;j<64;j++)
{
if((16*j+k+1024+3*x)>2047) //先要判断是否超出128*64的范围
Write_Data(0x00,0,1);
else
Write_Data(bmp[16*j+k+1024+3*x],0,1);
}
}
Delay(10000);
}
}
*/
//上面程序的.h文件
#ifndef LCDRIVER
#define LCDRIVER
#include "init.h"
/*-----------定义寄存器的指令代码----------*/
#define Disp_On 0x3f
#define Disp_Off 0x3e
#define Col_Add 0x40
#define Row_Add 0xb8
#define Start_Line 0xc0
#define signal1 1
#define signal2 2
#define signal3 3
#define signal4 4
#define ON 1
#define OFF 0
#define lcd_data_bus P2
sbit DI =P3^1;
sbit RW =P3^3;
sbit E =P3^7;
sbit CS1=P3^4;
sbit CS2=P3^5;
sbit RST=P3^0; //复位
void Delay (long v) ;
void Write_Command(uchar cmdcode,uchar cs1,uchar cs2) ; //写命令到LCD
void Write_Data(uchar Dispdata,uchar cs1,uchar cs2) ; //写数据到LCD
uchar Read_Data(uchar cs1,uchar cs2); //read data from lcd
void Lcd_Init(void) ; //初始化LCD屏
void Clr_Screen(void) ; //清屏
//void Full_Screen(void); //满屏
uchar read_lcd_data(uchar row,uchar col); //新增函数 读数据从lcd
void lcd_row_col_data(uchar row,uchar col,uchar disp_data); //新增函数 字节形式显示
void signal_disp(uchar t,uchar on_off); //右上角标志显示
void lcd_dot_disp(uchar x,uchar y); //新增函数 以点形式显示 x 0-127; y 0-63 左下角为原点
void Ch_Display_8(uchar row, uchar col, uchar const *ch_data,uchar w,uchar dir);//指定位置显示字符w*8
void Ch_Display(uchar row, uchar col, uchar const *ch_data,uchar w,uchar dir); //指定位置显示字符w*16
void Bmp_display(uchar const *bmp); //显示128*64位图
/*
void Fun_display(uchar const *bmp); //动画效果-----右移
void Fun2_display(uchar const *bmp); //动画--下移
void Fun3_display(uchar const *bmp,uint h) ; //动画--上移//该函数实现了显示大于128*64图象的方法, 现在只能实现显示128*h的图象
void Fun4_display(uchar const *bmp);
*/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -