📄 lcd_plug_12864j.c
字号:
/*=====================================================================*\
| |
|名称:LCD功能模块集 |
| |
|工作模块:XYadr() 位置输入函数 |
| wcode() 工作状态输入函数 |
| wdata() 数据输入函数 |
| read() 数据读出函数 |
| LCDc() 清屏函数 |
| Display() 显示开/关控制函数 |
| startline() 开始行设置函数 |
| reset() 复位函数 |
| time() 延时函数 |
| |
|调用函数:_nop_ () 空操作函数 |
| |
\*=====================================================================*/
#include <AT89X52.H>
sbit E = P2^0; //时钟端(从高变低时数据输入)
sbit RW = P2^7; //数据读(H)/写(L)选择
sbit RS = P2^6; //数据(H)/状态(L)寄存器选择
sbit busy = P0^7; //lcd busy bit
#define LOW 0
#define HIGH 1
#define comm 0
#define dat 1
#define ystart 0x80
#define xustart 0x80
#define xdstart 0x88
//初始化指令
#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H
#define AC_INIT 0x02 //将AC设置为00H。且游标移到原点位置
#define CURSE_ADD 0x06 //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)
#define FUN_MODE 0x30 //工作模式:8位基本指令集
#define EXT_MODE 0x36 //工作模式:8位扩展指令集
#define DISPLAY_ON 0x0f //显示开,显示游标,且游标位置反白
#define DISPLAY_OFF 0x08 //显示关
#define CURSE_DIR 0x14 //游标向右移动:AC=AC+1
#define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH
#define SET_DD_AC 0x80
void wr_lcd(bit dat_comm,unsigned char content);
void chk_busy (void);
//void delay_us(unsigned char i);
//void delay_ms(unsigned char i);
void _nop_ (void);
void init_lcd (void)
{
wr_lcd(comm,0x30); /*30---基本指令动作*/
wr_lcd(comm,0x01); /*清屏,地址指针指向00H*/
wr_lcd(comm,0x0c); /*开显示,关游标*/
wr_lcd(comm,0x06); /*光标的移动方向*/
}
void wr_lcd(bit dat_comm,unsigned char content) //工作状态(1)/数据(0)输入函数
{
chk_busy ();
if(dat_comm)
{
RS = 1; //data
RW = 0; //write
}
else
{
RS = 0; //command
RW = 0; //write
}
P0=content; //output data or comm
E=0;
_nop_();
E=1;
_nop_();
E=0;
}
unsigned char rd_lcd(void) //数据读出函数
{
unsigned char a;
chk_busy ();
RS = 1;
RW = 1; //read
P1 = 0xFF;
E = 1;
a = P0;
E = 0;
RW = 0; //write
return(a);
}
void XYadr(unsigned char x,unsigned char y)
{
if(y > 31)
{
x = x + xdstart;
y = y - 32 + ystart;
}
else
{
x = x + xustart;
y = y + ystart;
}
wr_lcd(comm,y);
wr_lcd(comm,x);
}
//使用前先用 wr_lcd(comm,0x02);//对游标地址复位
void cursor_disp(bit open, unsigned char mode) //游标反显,显示开关移动控制函数
{
if(open)
{
switch (mode)
{
case 0:
wr_lcd(comm,0x0e); /*开游标,关反显,游标不移*/
break;
case 1:
wr_lcd(comm,0x0e); /*开游标,关反显,游标左移*/
wr_lcd(comm,0x10);
break;
case 2:
wr_lcd(comm,0x0e); /*开游标,关反显,游标右移*/
wr_lcd(comm,0x14);
break;
case 3:
wr_lcd(comm,0x0d); /*关游标,开反显,反显不移*/
break;
case 4:
wr_lcd(comm,0x0d); /*关游标,开反显,反显左移*/
wr_lcd(comm,0x10);
break;
case 5:
wr_lcd(comm,0x0d); /*关游标,开反显,反显右移*/
wr_lcd(comm,0x14);
break;
case 6:
wr_lcd(comm,0x0f); /*开游标,开反显,不移*/
break;
case 7:
wr_lcd(comm,0x0f); /*开游标,开反显,一起左移*/
wr_lcd(comm,0x10);
break;
case 8:
wr_lcd(comm,0x0f); /*开游标,开反显,一起右移*/
wr_lcd(comm,0x14);
break;
}
}
else
{
wr_lcd(comm,0x0c); /*关游标,关反显*/
}
}
void LCDc(unsigned char a) //清屏函数
{
unsigned char x,y;
wr_lcd(comm,0x30);
wr_lcd(comm,0x01); /*清屏,地址指针指向00H*/
wr_lcd(comm,0x34);
for(y=0;y<32;y++)
{
wr_lcd(comm,y + ystart);
wr_lcd(comm,xustart);
for(x=0;x<32;x++)
{
wr_lcd(dat,a);
}
}
wr_lcd(comm,0x30);
}
void chk_busy(void)
{
P0 = 0xff;
RS = 0;
RW = 1;
E = 1;
while(busy == 1);
E = 0;
}
/*
void delay_us(unsigned char i)
{
while(i!=0)i--;
}
void delay_ms(unsigned char ms)
{
unsigned char i,j;
for(i=0;i<ms;i++)
for(j=0;j<15;j++)
_nop_();
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -