📄 lcd.h
字号:
/*-----------------------------------------------------
显示开/关: 0x3E:Off,0x3F:On
设置列(y)地址: 0x40+y,y:0-63
设置页(x)地址: 0xB8+x,x:0-7
设置起始行: 0xC0+l,l:0-63
写显示数据: 0x**
DI R/W Function
0 0 写指令
1 0 写数据
引脚连接:
CS1:PA0
CS2:PA1
DI: PA2
RW: PA3
E: PA4
DB0-DB7:PB0-PB7
------------------------------------------------------*/
#define uchar unsigned char
#define uint unsigned int
#define L 0x10
#define R 0x20
#define LR 0x30
#define CS1_PORT PORTA
#define CS2_PORT PORTA
#define DI_PORT PORTA
#define RW_PORT PORTA
#define E_PORT PORTA
#define CS1_DDR DDRA
#define CS2_DDR DDRA
#define RW_DDR DDRA
#define E_DDR DDRA
#define DI_DDR DDRA
#define DATA_PORT PORTB
#define DATA_DDR DDRB
#define DATA_IN PINB
#define LCD_DI (1<<PA2)
#define LCD_CS1 (1<<PA0)
#define LCD_CS2 (1<<PA1)
#define LCD_RW (1<<PA3)
#define LCD_E (1<<PA4)
#define LCD_DATA_OUT 0xff
#define LCD_DATA_IN 0x00
#define Set_RW_0 RW_PORT&=~LCD_RW
#define Set_RW_1 RW_PORT|=LCD_RW
#define Set_E_0 E_PORT&=~LCD_E
#define Set_E_1 E_PORT|=LCD_E
#define Set_DI_I DI_PORT&=~LCD_DI //instruction
#define Set_DI_D DI_PORT|=LCD_DI //data
#define Set_CS1_0 CS1_PORT&=~LCD_CS1
#define Set_CS1_1 CS1_PORT|=LCD_CS1
#define Set_CS2_0 CS2_PORT&=~LCD_CS2
#define Set_CS2_1 CS2_PORT|=LCD_CS2
void LCD_WriteC(uchar cmd)
{Set_RW_0;
Set_DI_I;
Set_E_0;
DATA_PORT=cmd;
Set_E_1;
delay_nus(1);
Set_E_0;
delay_nus(20);
}
void LCD_WriteD(uchar data)
{Set_RW_0;
Set_DI_D;
Set_E_0;
DATA_PORT=data;
Set_E_1;
delay_nus(1);
Set_E_0;
delay_nus(20);
}
/*------------------------------------
设置显示位置坐标
x:页地址:0-7 :0xB8+x
y:列地址:0-63:0x40+y
-------------------------------------*/
void Set_XY(uchar x,uchar y)
{x+=0xB8;
y+=0x40;
LCD_WriteC(x);
LCD_WriteC(y);
}
/*-------------------------------------
设置起始行 0xC0+i,i:0-63
-------------------------------------*/
void Set_Startline(uchar i)
{
LCD_WriteC(i+0xC0);
}
/*-------------------------------------
左右屏幕选择:
L:左;R:右;LR:左右
---------------------------------------*/
void LCD_Select(uchar x)
{if(x==L){
Set_CS1_1;
Set_CS2_0;}
else if(x==R){
Set_CS1_0;
Set_CS2_1;}
else if(x==LR){
Set_CS2_1;
Set_CS1_1;}
else{
Set_CS1_0;
Set_CS2_0;}
}
/*-----------------------------------
清屏:
从k(0-7)行开始清屏
------------------------------------*/
void LCD_Clear(uchar k)
{uchar i,j;
LCD_Select(LR);
for(i=k;i<8;i++){
Set_XY(i,0);
for(j=0;j<64;j++){
LCD_WriteD(0x00);}}
}
/*---------------------------
LCD初始化
显示开/关:0x3E:Off,0x3F:On
----------------------------*/
void LCD_Init()
{CS1_DDR|=LCD_CS1;
CS2_DDR|=LCD_CS2;
RW_DDR|=LCD_RW;
E_DDR|=LCD_E;
DI_DDR|=LCD_DI;
DATA_DDR=LCD_DATA_OUT;//设置各端口为输出
LCD_WriteC(0x3F); //开显示
LCD_WriteC(0xC0);//设置起始行为0
Set_XY(0,0); //设置显示位置坐标(0,0);
}
/*-------------------------------------------------
LCD汉字显示函数:
x:页地址,y:列地址,cs:屏幕选择,x:0-7;y:0-63
在cs选择的LCD x行y列显示hz[]所存的汉字(16*16)
-------------------------------------------------*/
void LCD_WriteHZ(uchar x,uchar y,uchar cs,uchar const *hz)
{uchar i;
LCD_Select(cs);
Set_XY(x,y);
for(i=0;i<16;i++){
LCD_WriteD(*hz);
hz++;}
Set_XY(x+1,y);
for(i=0;i<16;i++){
LCD_WriteD(*hz);
hz++;}
}
/*--------------------------------------------------
LCD字符显示函数:
x:页地址,y:列地址,cs:屏幕选择,
在cs选择的LCD x行y列显示ch[]所存的字符(8*16)
----------------------------------------------------*/
void LCD_WriteCH(uchar x,uchar y,uchar cs,uchar const *ch)
{uchar i;
LCD_Select(cs);
Set_XY(x,y);
for(i=0;i<8;i++){
LCD_WriteD(*ch);
ch++;}
Set_XY(x+1,y);
for(i=0;i<8;i++){
LCD_WriteD(*ch);
ch++;}
}
/*-------------------------------------------------
LCD图象显示函数
i:起始行,j:结束行
从LCD的i行到j行显示数组pic[]所存的图象
--------------------------------------------------*/
void LCD_WritePIC(uchar i,uchar j,uchar const *pic)
{uchar ii,jj,kk;
ii=0;jj=0;kk=0;
for(ii=i;ii<j;ii++){
for(kk=0;kk<64;kk++){ //写左屏幕
LCD_Select(L);
Set_XY(ii,kk);
LCD_WriteD(*pic);
pic++;}
for(kk=0;kk<64;kk++){ //写右屏幕
LCD_Select(R);
Set_XY(ii,kk);
LCD_WriteD(*pic);
pic++;}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -