LCD12864.docx
- 文档编号:28277167
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:14
- 大小:16.29KB
LCD12864.docx
《LCD12864.docx》由会员分享,可在线阅读,更多相关《LCD12864.docx(14页珍藏版)》请在冰豆网上搜索。
LCD12864
#include
#include"lcd12864.h"
/********数据传输*********/
#defineLCD2MCU_Data(GPIOB->IDR>>8)&0xff
#defineMCU2LCD_DataGPIOB->ODR
/********数据控制*********/
#defineLCD_RSPCout(3)
#defineLCD_RWPCout
(2)
#defineLCD_ENPCout(0)
voidDataControl(void)
{
RCC->APB2ENR|=1<<4;
GPIOC->CRL&=0XFFFF00F0;
GPIOC->CRL|=0X00002202;
}
voidDataPort_Out(void)
{
RCC->APB2ENR|=1<<3;
GPIOB->CRH&=0X00000000;
GPIOB->CRH|=0X22222222;
}
voidDataPort_In(void)
{
RCC->APB2ENR|=1<<3;
GPIOB->CRH&=0X00000000;
GPIOB->CRH|=0X88888888;
GPIOB->ODR|=0xffffffff;
}
/*********写指令函数*********/
voidWrite_Cmd(u8cmd)
{
u8lcdtemp=0;
DataControl();
LCD_RS=0;
LCD_RW=1;
DataPort_In();
do
{
LCD_EN=1;
lcdtemp=LCD2MCU_Data;
LCD_EN=0;
}
while(lcdtemp&0x80);
DataPort_Out();
LCD_RW=0;
MCU2LCD_Data=(cmd<<8)&0xff00;
LCD_EN=1;
;
LCD_EN=0;
}
/******写数据函数******/
voidWrite_Data(u8dat)
{
u8lcdtemp=0;
DataControl();
LCD_RS=0;
LCD_RW=1;
DataPort_In();
do
{
LCD_EN=1;
lcdtemp=LCD2MCU_Data;
LCD_EN=0;
}
while(lcdtemp&0x80);
DataPort_Out();
LCD_RS=1;
LCD_RW=0;
MCU2LCD_Data=(dat<<8)&0xff00;
LCD_EN=1;
LCD_EN=0;
}
u8Read_Data(void)/*******读数据函数********/
{
u8read_value,lcdtemp=0;
DataControl();
LCD_RS=0;
LCD_RW=1;
DataPort_In();
do
{
LCD_EN=1;
;
lcdtemp=LCD2MCU_Data;
LCD_EN=0;
}
while(lcdtemp&0x80);
DataPort_Out();
MCU2LCD_Data=(0xff>>8)&0xff;
DataPort_In();
LCD_RS=1;
LCD_RW=1;
LCD_EN=0;
;
LCD_EN=1;
read_value=LCD2MCU_Data;
;
LCD_EN=0;
returnread_value;
}
voidInit_Lcd(void)/****液晶初始化****/
{
DataControl();
DataPort_Out();
delay_ms(500);
Write_Cmd(0x30);//基本指令集
delay_ms
(1);
Write_Cmd(0x02);//地址归位
delay_ms
(1);
Write_Cmd(0x0c);//整体显示打开,游标关闭
delay_ms
(1);
Write_Cmd(0x01);//清除显示
delay_ms
(1);
Write_Cmd(0x06);//游标右移
delay_ms
(1);
Write_Cmd(0x80);//设定显示的起始地址
}
/*******************************************
函数名称:
Disp_HZ
功能:
控制液晶显示汉字
参数:
addr--显示位置的首地址
pt--指向显示数据的指针
num--显示字符个数
返回值:
无
********************************************/
voidDisp_HZ(u8addr,uc8*pt,u8num)
{
u8i;
DataControl();
DataPort_Out();
Write_Cmd(addr);
for(i=0;i<(num*2);i++)
Write_Data(*(pt++));
}
/*******************************************
函数名称:
Clear_GDRAM
功能:
清除液晶GDRAM中的随机数据
参数:
无
返回值:
无
********************************************/
voidClear_GDRAM(void)
{
u8i,j,k;
DataControl();
DataPort_Out();
Write_Cmd(0x34);//打开扩展指令集
i=0x80;
for(j=0;j<32;j++)
{
Write_Cmd(i++);//在写入地址时,要先输入垂直地址,再输入水平地址这是规定好的
Write_Cmd(0x80);//第一行水平的起始地址为80H
for(k=0;k<16;k++)//写入以后数据后,地址计数器(AC)会自动加一
{
Write_Data(0x00);
}
}
i=0x80;
for(j=0;j<32;j++)
{
Write_Cmd(i++);//写入第一行8个32*16模块的垂直起始地址
//在写入地址时,要先输入垂直地址,再输入水平地址这是规定好的
Write_Cmd(0x88);//第二行的水平起始地址为88H
//以后写入数据后,地址计数器(AC)会自动加一
for(k=0;k<16;k++)
{
Write_Data(0x00);
}
}
Write_Cmd(0x30);//回到基本指令集
}
/*******************************************
函数名称:
Check_GDRAM
功能:
点亮全屏,检查坏点
参数:
无
返回值:
无
********************************************/
voidCheck_GDRAM(void)
{
u8i,j,k;
DataControl();
DataPort_Out();
Write_Cmd(0x34);//打开扩展指令集
i=0x80;
for(j=0;j<32;j++)
{
Write_Cmd(i++);//在写入地址时,要先输入垂直地址,再输入水平地址这是规定好的
Write_Cmd(0x80);//第一行水平的起始地址为80H
for(k=0;k<16;k++)//写入以后数据后,地址计数器(AC)会自动加一
{
Write_Data(0xff);
}
}
i=0x80;
for(j=0;j<32;j++)
{
Write_Cmd(i++);//写入第一行8个32*16模块的垂直起始地址
//在写入地址时,要先输入垂直地址,再输入水平地址这是规定好的
Write_Cmd(0x88);//第二行的水平起始地址为88H
//以后写入数据后,地址计数器(AC)会自动加一
for(k=0;k<16;k++)
{
Write_Data(0xff);
}
}
Write_Cmd(0x36);
Write_Cmd(0x30);//回到基本指令集
}
/*******************************************
函数名称:
Draw_PM
功能:
在整个液晶屏幕上画图
参数:
无
返回值:
无
********************************************/
voidDraw_PM(uc8*ptr)
{
u8i,j,k;
DataControl();
DataPort_Out();
Write_Cmd(0x34);//打开扩展指令集
i=0x80;
for(j=0;j<32;j++)
{
Write_Cmd(i++);
Write_Cmd(0x80);
for(k=0;k<16;k++)
{
Write_Data(*ptr++);
}
}
i=0x80;
for(j=0;j<32;j++)
{
Write_Cmd(i++);
Write_Cmd(0x88);
for(k=0;k<16;k++)
{
Write_Data(*ptr++);
}
}
Write_Cmd(0x36);
Write_Cmd(0x30);
}
voidDraw_TX(u8Yaddr,u8Xaddr,uc8*dp)
{
u8j;
u8k=0;
DataControl();
DataPort_Out();
Write_Cmd(0x01);
Write_Cmd(0x34);
for(j=0;j<16;j++)
{
Write_Cmd(Yaddr++);
Write_Cmd(Xaddr);
Write_Data(dp[k++]);
Write_Data(dp[k++]);
}
Write_Cmd(0x36);
Write_Cmd(0x30);
}
voidDraw_Point(u8X,u8Y,u8Color)
{
u8Row,Tier,Tier_bit;
u8ReadH,ReadL;
Write_Cmd(0x34);
Write_Cmd(0x34);
Tier=X>>4;
Tier_bit=X&0x0f;
if(Y<32){Row=Y;}
else{Row=Y-32;Tier=Tier+8;}
Write_Cmd((Row|0x80));
Write_Cmd((Tier|0x80));
Read_Data();
ReadH=Read_Data();
ReadL=Read_Data();
Write_Cmd((Row|0x80));
Write_Cmd((Tier|0x80));
if(Tier_bit<8)
{
switch(Color)
{
case0:
ReadH&=(~(0x01<<(7-Tier_bit)));break;
case1:
ReadH|=(0x01<<(7-Tier_bit));break;
case2:
ReadH^=(0x01<<(7-Tier_bit));break;
default:
break;
}
Write_Data(ReadH);
Write_Data(ReadL);
}
else
{
switch(Color)
{
case0:
ReadL&=(~(0x01<<(15-Tier_bit)));break;
case1:
ReadL|=(0x01<<(15-Tier_bit));break;
case2:
ReadL^=(0x01<<(15-Tier_bit));break;
default:
break;
}
Write_Data(ReadH);
Write_Data(ReadL);
}
Write_Cmd(0x36);
Write_Cmd(0x30);
}
voidDraw_ZB(void)
{
u8i,j;
for(i=0;i<128;i++)
{
Draw_Point(i,63,1);
}
for(j=0;j<64;j++)
{
Draw_Point(0,j,1);
}
}
#ifndef__LCD12864_H
#define__LCD12864_H
#include
#include"sys.h"
#include"delay.h"
voidDataControl(void);//数据控制端初始化
voidDataPort_Out(void);//数据输出端初始化
voidDataPort_In(void);//数据输入端初始化
voidWrite_Cmd(u8cmd);/******写指令程序******/
voidWrite_Data(u8dat);/******写数据函数******/
u8Read_Data(void);/*****读数据函数*******/
voidInit_Lcd(void);/******液晶初始化******/
voidDisp_HZ(u8addr,uc8*pt,u8num);
voidClear_GDRAM(void);
voidCheck_GDRAM(void);
voidDraw_PM(uc8*ptr);
voidDraw_TX(u8Yaddr,u8Xaddr,uc8*dp);
voidDraw_Point(u8X,u8Y,u8Color);
voidDraw_ZB(void);
#endif
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LCD12864