📄 lcd.h
字号:
#include<reg52.h>
#include <absacc.h>
#define LEDcom1 XBYTE[0X4FF0]
#define LEDcom2 XBYTE[0X4FF1]
#define LEDcom3 XBYTE[0X4FF2]
#define LEDcom4 XBYTE[0X4FF3]
#define LEDcom5 XBYTE[0X4FF4]
#define LEDcom6 XBYTE[0X4FF5]
#define LEDcom7 XBYTE[0X4FF6]
#define LEDcom8 XBYTE[0X4FF7]
#define Lcd_Bus P0 //MCU P0<--信号-->LCM
#define uchar unsigned char
sbit RS=P2^0; //并行的指令/数据选择信号;串行的片选信号
sbit RW=P2^1; //并行的读/写选择信号;串行的数据口
sbit E=P2^2; //并行的使能信号;串行同步时钟
unsigned char Command;//状态
unsigned char LCDData;//数据
unsigned char COUNT3,COUNT2,COUNT1,COUNT,LCD_X,LCD_Y;
void qingpin()
{
LEDcom1=0;LEDcom2=0;LEDcom3=0;LEDcom4=0;
LEDcom5=0;LEDcom6=0;LEDcom7=0;LEDcom8=0;
}
//延时子程序
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++); //t*10 us
}
void busy()
{ unsigned char temp;
do{
Lcd_Bus=0xff; //
E=1;
delay(20);
temp=Lcd_Bus;
E=0;
}while(temp&0x80);
}
//写指令代码
void WriteCommand(){
RS=0;
RW=1;
busy();
RW=0;
Lcd_Bus=Command;
E=1;
E=0;
}
//写显示数据
void WriteData(){
RS=0;
RW=1;
busy();
RS=1;
RW=0;
Lcd_Bus=LCDData;
E=1;
E=0;
}
//初始化程序
void LCDInit(){
delay(20);
Command=0x30;//选择基本指令集
WriteCommand();
delay(10);
Command=0x30;//选择8bit数据流
WriteCommand();
delay(5);
Command=0x0c;//开显示(无游标.不反白)
WriteCommand();
delay(10);
Command=0x01;//清DDRAM,清显示并设地址指针为00H
WriteCommand();
delay(10);
Command=0x06;//设定游标方向及显示移位
WriteCommand();
delay(10);
}
//显示字符串
void HZdisp(unsigned char *s)
{
while(*s!='\0')
{
LCDData=*s;
WriteData();
s++;
delay(50);
}
}
/*void dis_1_line(unsigned char *disdata1,unsigned char x1)
{ Command=0x06;
WriteCommand();
delay(5);
Command=x1;
WriteCommand();
HZdisp(disdata1);
} */
//LCD清屏
void clearLCD()
{
Command=0x01;
WriteCommand(); //清除显示
Command=0x06;
WriteCommand();
delay(5);
}
//显示汉字或字符
void Test(unsigned char *disdata,unsigned char coordinate,unsigned char rid) //数据和坐标,清屏与否
{
if(rid==1) clearLCD();
Command=coordinate;
WriteCommand(); //写指令
HZdisp(disdata);
}
//设定图片显示地址
void address_set(uchar LCD_x,uchar LCD_y) //图片的横向和纵向地址
{
Command=0x36; //扩充指令集动作,绘图ON;注意基本指令集动作中不能开绘图
WriteCommand();
Command=LCD_y;
WriteCommand();
Command=LCD_x;
WriteCommand();
Command=0x30; //关绘图
WriteCommand();
}
void Photoclear(const uchar *picture,uchar LCD_X,uchar LCD_Y)
{ uchar a,Line,Row,Byte;//共16(2位)大块,每大块共32(0-31)行,每次写16字节的数据
Line=2; /*写数据的格式如下:从左上角(0x80,0x80)开始,分为两大块,先写第一大块(0-8)的第0行的128(8×16,*/
Row=32; /*1次写1个字(8位),共写16次)个数据,行号加1,列号不变,再写0-8块的第1行的128个数据,依此类推*/
Byte=16; /*写第二大块时,列号加8,但行仍从第0行开始写,即行地址要复原为原地址重复写第一块的过程写第二大块液晶*/
a=LCD_Y;
for (;Line!=0;Line--)
{ LCD_Y=a; //注意写第二大块时,列号加8,但行仍从第0行开始写
Row=32;
for (;Row!=0;Row--)
{ Byte=16; //Byte=8,只写左边;Byte=16,写整块
address_set(LCD_X,LCD_Y);
for (;Byte!=0;Byte--)
{ LCDData=*picture++;
WriteData();
}
LCD_Y++;//列加1
}
LCD_X=0X88; //行以
}
Command=0x36; //开绘图
WriteCommand();
Command=0x30;
WriteCommand(); //关绘图
}
/* 图片显示 */
/*写数据的格式如下:从左上角(0x80,0x80)开始,分为两大块,先写第一大块(0-8)的第0行的128(8×16,
1次写1个字(8位),共写16次)个数据,行号加1,列号不变,再写0-8块的第1行的128个数据,依此类推。写第
二大块时,列号加8,但仍从第0行开始写,即行地址要复原为原地址重复写第一块的过程写第二大块液晶。
*/
void Photo(const uchar *picture,uchar LCD_X,uchar LCD_Y)
{ uchar a,Line,Row,Byte;//共16(2位)大块,每大块共32(0-31)行,每次写16字节的数据
Line=2; /*写数据的格式如下:从左上角(0x80,0x80)开始,分为两大块,先写第一大块(0-8)的第0行的128(8×16,*/
Row=32; /*1次写1个字(8位),共写16次)个数据,行号加1,列号不变,再写0-8块的第1行的128个数据,依此类推*/
Byte=8; /*写第二大块时,列号加8,但行仍从第0行开始写,即行地址要复原为原地址重复写第一块的过程写第二大块液晶*/
a=LCD_Y;
for (;Line!=0;Line--)
{ LCD_Y=a; //注意写第二大块时,列号加8,但行仍从第0行开始写
Row=32;
for (;Row!=0;Row--)
{ Byte=8; //Byte=8,只写左边;Byte=16,写整块
address_set(LCD_X,LCD_Y);
for (;Byte!=0;Byte--)
{ LCDData=*picture++;
WriteData();
}
LCD_Y++;//列加1
}
LCD_X=0X88; //行以
}
Command=0x36; //开绘图
WriteCommand();
Command=0x30;
WriteCommand(); //关绘图
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -