📄 lcd12864.c
字号:
#include <msp430x14x.h>
#include "Lcd12864.h"
//=========================================
//函数功能:显示字符串(第x行,第y列)
//=========================================
void DisplayString(unsigned char x,unsigned char y,unsigned char *s)
{
switch(x)
{
case 1 : x = 0x80; break;
case 2 : x = 0x90; break;
case 3 : x = 0x88; break;
case 4 : x = 0x98; break;
}
LcdWriteCommand(x + y - 1);
while(*s)
{
LcdWriteData(*s);
s++;
}
}
//=========================================
//函数功能:显示bmp图像(GDRAM)
//=========================================
void DisplayBMP(unsigned char *bmp)
{
unsigned char i = 0,j = 0;
LcdWriteCommand(0x36); //扩充指令,绘图打开
for(i=0;i<32;i++)
{
LcdWriteCommand(0x80+i);//先送垂直地址
LcdWriteCommand(0x80); //再送水平地址,显示图片的上半部分
for(j=0;j<16;j++)
{
LcdWriteData(*bmp++);
}
}
for(i=0;i<32;i++)
{
LcdWriteCommand(0x80+i); //先送垂直地址
LcdWriteCommand(0x88); //显示图片的下半部分
for(j=0;j<16;j++)
{
LcdWriteData(*bmp++);
}
}
LcdWriteCommand(0x30); //基本指令,绘图关闭
}
/*******************************************************************************
初始化LCD 保证LCD 可靠工作
采用常用的初始化步骤
******************************************************************************/
void InitLcd12864()
{
SET_LCD_PSB; //并口方式
P5DIR |= 0xff;
Delay_352us(200);//;延时70.4ms > 40ms
LcdWriteCommand(0X30);//30---基本指令操作
Delay_352us(1); //延迟352us > 100 us
LcdWriteCommand(0X30);//30---基本指令操作
Delay_us(40); //延迟80us >37 us
LcdWriteCommand(0X0c);//显示状态设置 整体显示 游标打开 游标位置打开
Delay_352us(1); //延迟352us >100 us
LcdWriteCommand(0X01);//指令#01H为:清除屏幕文字,把地址指针指向00H单元
Delay_352us(100); //延迟35.2ms > 10ms
LcdWriteCommand(0X06);//指定在资料写入或读取时,设定游标的移动方向及指定显示的移位
Delay_352us(1); //简短延时
}
/*****************************************************************************
352us 延时函数
****************************************************************************/
void Delay_352us(unsigned int i)//352us延时程序
{
unsigned char j;
while(i--)
{
for(j=0;j<255;j++)
{
_NOP();
_NOP();
_NOP();
_NOP();
}
}
}
/***************************************************************************
延时函数
delay 2.5us at 8M
*****************************************************************************/
void Delay_us(unsigned char i)//
{
unsigned char ii;
for(ii =i;ii > 0;ii--)
{
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
}
}
/****************************************************************************
向LCD写命令字函数
******************************************************************************/
void LcdWriteCommand(unsigned char i)//;向12864写命令的子程序
{
LcdCheckBusy();//;判断忙标,以确保上一指令/数据模块已经接收处理完
LCD_DATA_DIR_OUT;//把IO 口设置为输出
LCD_RS_LOW; //RS=0 选择指令寄存器 写指令设置
LCD_E_LOW;
LCD_WRITE; //RW=0 选择写操作
LCD_E_HIGE; //E=1,12864使能
LCD_OUT=i; //往液晶数据口送指令
Delay_us(100);
LCD_E_LOW; //关LCD使能
Delay_us(100);
}
/***************************************************************************
判断忙标子程序
******************************************************************************/
void LcdCheckBusy()
{
LCD_DATA_DIR_IN; // 把数据口置1,准备读入数据
LCD_E_LOW;
LCD_RS_LOW; // RS = 0 选择指令寄存器
LCD_READ; // 读操作
LCD_E_HIGE; // 将E 置高电平, 12864使能
Delay_us(1);
while(LCD_IN & 0X80);// 忙碌标志为1,则停在此处
LCD_E_LOW; // 将 E 置低
Delay_us(100);
}
/*******************************************************************************
向LCD写数据函数
*****************************************************************************/
void LcdWriteData(unsigned char i)//;写数据子程序
{
LcdCheckBusy();//判断忙标,以确保上一指令/数据模块已经接收处理完
LCD_DATA_DIR_OUT;//设置io 为输出 要想LCD 写数据
LCD_E_LOW;
LCD_RS_HIGE; //RS=1选择数据寄存器,设置为写数据
LCD_WRITE; //RW=0 选择写操作
LCD_E_HIGE;//LCD 使能
Delay_us(1);
LCD_OUT=i; //往LCD 送数据
Delay_us(100); //延时
LCD_E_LOW; //关使能
Delay_us(100); // 延迟
}
/*******************************************************************************
向LCD读数据函数
*****************************************************************************/
unsigned char LcdReadData()//;写数据子程序
{
unsigned char data;
LcdCheckBusy(); //判断忙标,以确保上一指令/数据模块已经接收处理完
LCD_DATA_DIR_IN; //设置io 为输入 要想LCD 读数据
LCD_E_LOW;
LCD_RS_HIGE;
LCD_READ; //RW=1 选择读操作
Delay_us(5);
LCD_E_HIGE; //LCD 使能
Delay_us(1);
data = LCD_IN; //往LCD 送数据
Delay_us(100); //延时
LCD_E_LOW; //关使能
Delay_us(10); // 延迟
return (data);
}
/******************************************************************************
数据填充函数
设置为扩充指令,关闭绘图模式
连续写两个字节的GDRAM地址,先写垂直地址,后写水平地址
写两个字节数据,先写高8位数据,后写低8位数据
打开绘图模式
设置回基本指令集
*******************************************************************************/
void FillGdram(unsigned char data)
{
unsigned char i;
unsigned char j;
unsigned char k;
unsigned char xAddress = 0x80;
unsigned char yAddress = 0x80;
for( i = 0;i < 2;i++ )
{
for(j = 0;j <32;j++)
{
for(k = 0;k < 16;k++)
{
LcdWriteCommand(0x34);
LcdWriteCommand(yAddress + j);//GDRAM垂直地址Y
LcdWriteCommand(xAddress + k);//GDRAM水平地址X
LcdWriteData(data);
LcdWriteData(data);
}
}
xAddress = 0x88;
}
LcdWriteCommand(0x36);
LcdWriteCommand(0x30);
}
/****************************************************************************
画点函数(过程:读->修改->写)
x,y坐标区间分别为[0,127]、[0,63](即:0<= x <=127,0<= y <=63)
4个顶点坐标:
(0,0)________________(127,0)
| |
| 12864 |
| LCD |
(0,63)|_______________ |(127,63)
(X, Y )为点坐标; color = 1,该点填充1 ,color = 0 该点填充0
***************************************************************************/
void DrawPoint(unsigned char x,unsigned char y,unsigned char color)
{
unsigned char Row,Tier,Tier_bit;
unsigned char ReadOldH,ReadOldL;
LcdWriteCommand(0x34);
LcdWriteCommand(0x36);//设定为扩展指令,8位数据操作
Tier = x >> 4;
Tier_bit = x & 0x0f;
if(y < 32)
{
Row = y;
}
else
{
Row = y -32;
Tier += 8;
}
LcdWriteCommand(0x80 + Row);
LcdWriteCommand(0x80 + Tier);
LcdReadData(); //预读数操作
ReadOldH = LcdReadData(); //读取当前显示高8位数据
ReadOldL = LcdReadData(); //读取当前显示低8位数据
Delay_us(250);
LcdWriteCommand(0x80 + Row);
LcdWriteCommand(0x80 + Tier);
Delay_us(250);
if(Tier_bit < 8)//判断当前是高8位还是低8位
{
switch(color)
{
case 0: ReadOldH &= (~(0x01 << (7 - Tier_bit)));break;
case 1: ReadOldH |= (0x01 << (7 - Tier_bit)) ;break;
case 2: ReadOldH ^= (0x01 << (7 - Tier_bit)) ;break;
default:break;
}
LcdWriteData(ReadOldH);
LcdWriteData(ReadOldL);
}
else
{
switch(color)
{
case 0: ReadOldL &= (~(0x01 << (15 - Tier_bit)));break;
case 1: ReadOldL |= (0x01 << (15 - Tier_bit)) ;break;
case 2: ReadOldL ^= (0x01 << (15 - Tier_bit)) ;break;
default:break;
}
LcdWriteData(ReadOldH);
LcdWriteData(ReadOldL);
}
LcdWriteCommand(0x30);
}
/******************************************************************************
画水平直线
垂直于y轴的直线
x0起点,x1终点
*******************************************************************************/
void DrawHorizontalLine(unsigned char x0,unsigned char x1,unsigned char y,unsigned char color)
{
unsigned char temp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -