📄 lcd_b.h
字号:
/**************************************************************************************
CSA----选择IC1,低有效 即 (左)64列
CSB----选择IC2,低有效 即 (右)64列
---------------------------------------------------------------------------------------
RS: D/I=H,表示DB7~DB0为显示数据
D/I=L,表示DB7~DB0为指令数据
---------------------------------------------------------------------------------------
R/W: R/W=H,E=H数据被读到DB7~DB0
R/W=L,E信号下降沿,DDRAM数据被写到IR或DR
---------------------------------------------------------------------------------------
E: R/W=L,E信号下降沿锁存DB7~DB0
R/W=H,E=H DDRAM数据读到DB7~DB0
---------------------------------------------------------------------------------------
|DB0-----D7.0 | DB4-----D7.4 | CSA-------P3.2 |
|DB1-----D7.1 | DB5-----D7.5 | CSB-------P3.3 |
|DB2-----D7.2 | DB6-----D7.6 | RS-------P3.4 |
|DB3-----D7.3 | DB7-----D7.7 | RW-------P3.5 |
|17脚---A正电源 18脚----K地 | E-------P3.6 | |
|VO-------0V | |
****************************************************************************************/
#define CSA PTE_PTE3//片选信号 低有效
#define CSB PTE_PTE4//片选信号 低有效
#define RS PTE_PTE0//数据 指令选择信号 1-数据操作 0-写指令或读状态
#define RW PTE_PTE1//读写选择信号 1-读选通 0-写选通
#define E PTE_PTE2//读写使能信号
#define RST PTE_PTE5//复位信号 无须考虑
#define LC_DIS_OP 0x3F//显示开指令
#define LC_DIS_CLS 0x3E//显示关指令
#define DIS_ROW_SET 0xC0//显示起始行设置指令
#define X_ADDR_SET 0xB8//页设置指令 X
#define Y_ADDR_SET 0x40//列地址设置指令 Y
#define LCD_DATA PTG
#define D0 PTG_PTG0
#define D1 PTG_PTG1
#define D2 PTG_PTG2
#define D3 PTG_PTG3
#define D4 PTG_PTG4
#define D5 PTG_PTG5
#define D6 PTG_PTG6
#define D7 PTG_PTG7
#define LCD_DDR DDRG
#define DDR0 DDRG_DDRG0
#define DDR1 DDRG_DDRG1
#define DDR2 DDRG_DDRG2
#define DDR3 DDRG_DDRG3
#define DDR4 DDRG_DDRG4
#define DDR5 DDRG_DDRG5
#define DDR6 DDRG_DDRG6
#define DDR7 DDRG_DDRG7
//sys_data_type status0,status1,status2,status3,status4,status5,status6,status7,status8;
unsigned int lcd_sec;
unsigned char lcd_min,min,lcd_hour,hour;
//unsigned char lcd_sec,lcd_min=0,lcd_hour=0; //分、小时
unsigned char minh=0,minl=0,hourh=0,hourl=0;//分钟、小时得高位、低位
//分钟、小时得高位、低位 用于判断时间是否变化
//unsigned char sech0=0,secl0=0,minh0=0,minl0=0,hourh0=0,hourl0=0; //后来自己添加
//unsigned char flash=1; //后来添加
unsigned int clock_count0=0/*,clock_count1=0*/; //系统时钟定时器
unsigned int clock_change=0;
sys_data_type light_fault_flags;
#define light_fault1 light_fault_flags.Bit.BIT0
#define light_fault2 light_fault_flags.Bit.BIT1
#define light_fault3 light_fault_flags.Bit.BIT2
#define light_fault4 light_fault_flags.Bit.BIT3
#define flash light_fault_flags.Bit.BIT7
#define lcd_dl_timer 8
//#define lcd_dl_timer0 80
/*--------------------------------------------------------------------------------------
| R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
| 1 0 BUSY 0 ON/OFF REST 0 0 0 0
| 该指令用于查询液晶显示模块内部控制器的状态
| BUSY 1-内部在工作 0-正常状态 ON/OFF 1-显示关闭 0-显示打开
| REST 1-复位状态 0-正常状态 在BUSY和REST状态时 除读状态指令外其它指令均不对
| 液晶显示模块产生作用
| 在对液晶显示模块操作之前要查询BUSY状态 以确定是否可以对液晶显示模块进行操作
|----------------------------------------------------------------------------------------
| R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
| 0 1 写 数 据
| 写数据指令
|----------------------------------------------------------------------------------------
| R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
| 1 1 读 显 示 数 据
| 读数据指令
读写数据指令每执行完一次读写操作列地址就自动增一 必须注意的是进行
读操作之前 必须有一次空读操作 紧接着再读 才会读出所要读的单元中的数据
--------------------------------------------------------------------------------------*/
/****************************************************************************************
//函数: void writMI(unsigned char i)
//描述: 主控制器 发指令
//参数: i数据或指令
//返回值:none
*****************************************************************************************/
void writeMI(unsigned char wdata)
{
do
{
CSA=0;
delay(lcd_dl_timer);
CSB=0;//00-禁止
E=0;
delay(lcd_dl_timer);
RS=0;//写指令或读状态
delay(lcd_dl_timer);
RW=1;//读选通
delay(lcd_dl_timer);
DDR7=0;//方向
delay(lcd_dl_timer);
CSA=1;//选择主片
delay(lcd_dl_timer);
E=1;//读数据
delay(lcd_dl_timer);
__RESET_WATCHDOG(); //喂狗
}while(D7);//判断主控制器忙
CSA=0;
delay(lcd_dl_timer);
E=0;
delay(lcd_dl_timer);
RS=0;//写指令
delay(lcd_dl_timer);
RW=0;//写选通
LCD_DDR=0xff;//数据方向
delay(lcd_dl_timer);
LCD_DATA=wdata;//写IO
delay(lcd_dl_timer);
CSA=1;//01-片选主
delay(lcd_dl_timer);
E=1;
delay(lcd_dl_timer);
E=0;//数据锁存
delay(lcd_dl_timer);
}
/*****************************************************************************************
//函数: void writSI(unsigned char i)
//描述: 从控制器发指令
//参数: i数据或指令
//返回值:none
******************************************************************************************/
void writeSI(unsigned char wdata)
{
do
{
CSA=0;
delay(lcd_dl_timer);
CSB=0;//001-禁止
delay(lcd_dl_timer);
E=0;
delay(lcd_dl_timer);
RS=0;//写指令或读状态
delay(lcd_dl_timer);
RW=1;//读选通
delay(lcd_dl_timer);
DDR7=0;//数据方向
delay(lcd_dl_timer);
CSB=1;//片选从
delay(lcd_dl_timer);
E=1;//读数据
delay(lcd_dl_timer);
__RESET_WATCHDOG(); //喂狗
}while(D7);//判断从控制器忙?
CSB=0;
delay(lcd_dl_timer);
E=0;
delay(lcd_dl_timer);
RS=0;//写指令
delay(lcd_dl_timer);
RW=0;//写选通
LCD_DDR=0xff;//数据方向
delay(lcd_dl_timer);
LCD_DATA=wdata;//写IO
delay(lcd_dl_timer);
CSB=1;//10-片选从
delay(lcd_dl_timer);
E=1;
delay(lcd_dl_timer);
E=0;//数据锁存
delay(lcd_dl_timer);
}
/****************************************************************************************
//函数: void writMD (unsigned char i)
//描述: 主控制器 发数据
//参数: i数据或指令
//返回值:none
*****************************************************************************************/
void writeMD(unsigned char wdata)
{
do
{
CSA=0;
delay(lcd_dl_timer);
CSB=0;//00-禁止
delay(lcd_dl_timer);
E=0;
delay(lcd_dl_timer);
RS=0;//写指令或读状态
delay(lcd_dl_timer);
RW=1;//读选通
delay(lcd_dl_timer);
DDR7=0;//数据方向
delay(lcd_dl_timer);
CSA=1;//片选主
delay(lcd_dl_timer);
E=1;//读数据
delay(lcd_dl_timer);
__RESET_WATCHDOG(); //喂狗
}while(D7);//判断主控制器忙
CSA=0;
delay(lcd_dl_timer);
E=0;
delay(lcd_dl_timer);
RS=1;//数据操作
delay(lcd_dl_timer);
RW=0;//写选通
LCD_DDR=0xff;//数据方向
delay(lcd_dl_timer);
LCD_DATA=wdata;
delay(lcd_dl_timer);
CSA=1;//01-片选主
delay(lcd_dl_timer);
E=1;
delay(lcd_dl_timer);
E=0;//数据锁存
delay(lcd_dl_timer);
}
/***************************************************************************************
//函数: void writeSD(unsigned char i)
//描述: 从控制器 发数据
//参数: i数据或指令
//返回值:none
***************************************************************************************/
void writeSD(unsigned char wdata)
{
do
{
CSA=0;
delay(lcd_dl_timer);
CSB=0;//11-禁止
delay(lcd_dl_timer);
E=0;
delay(lcd_dl_timer);
RS=0;//写指令或读状态
delay(lcd_dl_timer);
RW=1;//读选通
delay(lcd_dl_timer);
DDR7=0;//数据方向
delay(lcd_dl_timer);
CSB=1;//片选从
delay(lcd_dl_timer);
E=1;//读数据
delay(lcd_dl_timer);
__RESET_WATCHDOG(); //喂狗
}while(D7);//判断主控制器忙
CSB=0;
delay(lcd_dl_timer);
E=0;
delay(lcd_dl_timer);
RS=1;//数据操作
delay(lcd_dl_timer);
RW=0;//写选通
LCD_DDR=0xff;//数据方向
delay(lcd_dl_timer);
LCD_DATA=wdata;
delay(lcd_dl_timer);
CSB=1;//10-片选从
delay(lcd_dl_timer);
E=1;
delay(lcd_dl_timer);
E=0;
delay(lcd_dl_timer);
}
/****************************************************************************************
//函数: unsigned char readMD()
//描述: 主控制器 读 数据
//参数: i数据或指令
//返回值:读取的数据
*****************************************************************************************/
/*unsigned char readMD()
{
unsigned char tmpin;
__RESET_WATCHDOG(); //喂狗
CSA=0;
CSB=0;
delay(lcd_dl_timer);
E=0;
delay(lcd_dl_timer);
RS=1;//数据操作
delay(lcd_dl_timer);
RW=1;//读选通
delay(lcd_dl_timer);
DDR7=0;
delay(lcd_dl_timer);
CSA=1;
delay(lcd_dl_timer);
E=1;
delay(lcd_dl_timer);
E=0;
do
{
CSA=0;
CSB=0;//11-禁止
E=0;
RS=0;//写指令或读状态
RW=1;//读选通
DDR7=0;
CSA=1;
E=1;//判断主控制器忙
}while(D7);
RS=1;//数据操作
E=0;
LCD_DDR=0;
tmpin=LCD_DATA;
return tmpin;
}
*/
/****************************************************************************************
//函数: unsigned char readMD()
//描述: 从控制器 读 数据
//参数: i数据或指令
//返回值:读取的数据
*****************************************************************************************/
/*unsigned char readSD()
{
unsigned char tmpin;
__RESET_WATCHDOG(); //喂狗
CSA=0;
CSB=0;//11-禁止
E=0;
RS=1;//数据操作
RW=1;//读选通
DDR7=0;
asm(nop);
asm(nop);
CSB=0;
E=1;
asm(nop);
asm(nop);
E=0;
do
{
CSA=0;
CSB=0;//11-禁止
E=0;
RS=0;//写指令或读状态
RW=1;//读选通
DDR7=0;
CSB=0;
E=1;//判断主控制器忙
}while(D7);
RS=1;//数据操作
E=0;
LCD_DDR=0;
tmpin=LCD_DATA;
return tmpin;
}
*/
/***************************************************************************************
//函数: void SetPage(unsigned char page1,unsigned char page2)
//描述: 设置主/从窗口页面地址
//参数: page1主窗口页面地址 page2从窗口页面地址
//返回值:none
***************************************************************************************/
void SetPage(unsigned char page1,unsigned char page2)
{
writeMI(0xB8+page1);//设置主窗口页面地址
writeSI(0xB8+page2);//设置从窗口页面地址
}
/***************************************************************************************
//函数: void Clr_LCD(void)
//描述: 清屏函数
//参数: none
//返回值:none
****************************************************************************************/
void Clr_LCD(void)
{
unsigned char line;
unsigned char page;
for (page=0;page<8;page++)
{
SetPage(page,page);//设置页面地址
writeMI(0xB8|page); writeSI(0xB8|page);//设置主窗口页面地址
writeMI(0x40); writeSI(0x40);//设置主窗口显示地址
for(line=0;line<64;line++)
{
writeMD(0x00);
writeSD(0x00);//写数据
}
}
//RST=1;
}
/***************************************************************************************
//函数: void setdot(unsigned char x, unsigned char y)
//描述: 画点函数
//参数: x-X地址 y-Y地址
//返回值:none
****************************************************************************************/
/*void setdot(unsigned char x, unsigned char y)
{
unsigned char temp;
if (y<64)
{
writeMI(0xB8|x);//设置DDRAM中的页地址(X地址)
writeMI(0x40|y);//设置DDRAM中的地址(Y地址)
temp=readMD();//空读
temp=readMD();
writeMI(0xB8|x);//设置DDRAM中的页地址(X地址)
writeMD(temp&(temp|(1<<(y % 8))));//写数据
}
else
{
writeSI(0xB8|x);//设置DDRAM中的页地址(X地址)
writeSI(0x40|(y-64));//设置DDRAM中的地址(Y地址)
temp=readSD();//空读
temp=readSD();
writeSI(0xB8|x);//设置DDRAM中的页地址(X地址)
writeSD(temp|(1<<(y % 8)));//写数据
}
writeMI(0xc0);writeSI(0xc0);//设置显示起始行
}
*/
/***************************************************************************************
//函数: void clrdot(unsigned char x, unsigned char y)
//描述: 消点函数
//参数: x-X地址 y-Y地址
//返回值:none
****************************************************************************************/
/*void clrdot(unsigned char x, unsigned char y)
{
unsigned char temp;
if (x<64)
{
writeMI(0xB8|x);//设置DDRAM中的页地址(X地址)
writeMI(0x40|y);//设置DDRAM中的地址(Y地址)
temp=readMD();//空读
temp=readMD();
writeMI(0xB8|x);//设置DDRAM中的页地址(X地址)
writeMD(temp&(0xff-(1<<(y % 8))));//写数据
}
else
{
writeSI(0xB8|x);//设置DDRAM中的页地址(X地址)
writeSI(0x40|y);//设置DDRAM中的地址(Y地址)
temp=readSD();//空读
temp=readSD();
writeSI(0xB8|x);//设置DDRAM中的页地址(X地址)
writeSD(temp&(0xff-(1<<(y % 8))));//写数据
}
writeMI(0xc0);writeSI(0xc0);//设置显示起始行
}
*/
/***************************************************************************************
//函数: void DispImg(unsigned char *img)
//描述: 显示128*64图片
//参数: 图片字模
//返回值:none
****************************************************************************************/
void DispImg(const unsigned char *img)
{
unsigned char j,k;
for(k=0;k<8;k++)
{
writeMI(0xB8+k);writeSI(0xB8+k);//设置DDRAM中的页地址(X地址)
writeMI(0x40);writeSI(0x40);//设置DDRAM中的地址(Y地址)
for(j=0;j<64;j++)
{
writeMD(img[k*128+j]);//写数据
}
for(j=64;j<128;j++)
{
writeSD(img[k*128+j]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -