📄 lcd12864.c
字号:
/*******************************************************************/
// 12864液晶模块驱动程序 (for MSP430f14x)
//
// 2005年4月
//
// MCLK=1.13MHz时测试通过,如使用更高频率时钟
// 参照时序图,在适当位置添加延时
/*******************************************************************/
#include "LCD12864.h"
/*******************************************************************/
// 读取标志位,判断控制器是否为忙状态
/*******************************************************************/
void LCD_Busy()
{
char BF = 0;
LCD_RS_L;
LCD_RW_H;
P4DIR = 0x0;
do
{
LCD_EN_H;
BF = P4IN;
LCD_EN_L;
} while(BF & 0x80);
P4DIR = 0xff;
}
/*******************************************************************/
// 写入命令
/*******************************************************************/
void LCD_WriteCom(char dis_com)
{
LCD_Busy();
LCD_RS_L;
LCD_RW_L;
LCD_EN_H;
LCDDAT = dis_com;
LCD_EN_L;
}
/*******************************************************************/
// 写入一字节数据
/*******************************************************************/
void LCD_WriteDat(char dis_dat)
{
LCD_Busy();
LCD_RS_H;
LCD_RW_L;
LCD_EN_H;
LCDDAT = dis_dat;
LCD_EN_L;
}
/*******************************************************************/
// 设置显示位置 X(1~8),Y(1~4)
/*******************************************************************/
void LCD_SetAddr(char dis_addr_x,char dis_addr_y)
{
switch(dis_addr_y)
{
case 1:LCD_WriteCom(0x7f + dis_addr_x);
break;
case 2:LCD_WriteCom(0x8f + dis_addr_x);
break;
case 3:LCD_WriteCom(0x87 + dis_addr_x);
break;
case 4:LCD_WriteCom(0x97 + dis_addr_x);
}
}
/*******************************************************************/
// 在指定位置显示字符
/*******************************************************************/
void LCD_WriteDBC(char dis_addr_x,char dis_addr_y,char dis_dat)
{
LCD_SetAddr(dis_addr_x,dis_addr_y);
LCD_WriteDat(dis_dat);
}
/*******************************************************************/
// 在指定位置显示字符串
/*******************************************************************/
void LCD_WriteStr(char dis_addr_x,char dis_addr_y,char* str)
{
char LCD_temp;
LCD_SetAddr(dis_addr_x,dis_addr_y);
LCD_temp=*str;
while(LCD_temp != 0x00)
{
LCD_WriteDat(LCD_temp);
LCD_temp=*(++str);
}
}
/*******************************************************************/
// 显示一个整形数字
/*******************************************************************/
#define DISPLAY if(flag | LCD_temp) \
{ \
LCD_WriteDat(0x30 + LCD_temp); \
flag = 1; \
}
void LCD_WriteNum(char dis_addr_x,char dis_addr_y,int dis_num)
{
char LCD_temp = 0,flag = 0;
LCD_SetAddr(dis_addr_x,dis_addr_y);
if(dis_num < 0)
{
LCD_WriteDat(0x2d);
dis_num = - dis_num;
}
LCD_temp = dis_num/10000;
DISPLAY
dis_num -= LCD_temp*10000;
LCD_temp = dis_num/1000;
DISPLAY
dis_num -= LCD_temp*1000;
LCD_temp = dis_num/100;
DISPLAY
dis_num -= LCD_temp*100;
LCD_temp = dis_num/10;
DISPLAY
dis_num -= LCD_temp*10;
LCD_temp = dis_num;
DISPLAY
if(!flag) LCD_WriteDat(0x30);
}
#undef DISPLAY
/*******************************************************************/
// 绘制一幅图片
/*******************************************************************/
void LCD_DrawPic(char *gImage)
{
char X = 0x80,Y = 0x80;
char i,j;
for(i=0;i<64;i++)
{
for(j=0;j<16;j++)
{
LCD_WriteCom(0x34);
LCD_WriteCom(Y);
LCD_WriteCom(X);
LCD_WriteDat(*(gImage+i*16+j)); // low 8 bits
LCD_WriteDat(*(gImage+i*16+j+1)); // high 8 bits
LCD_WriteCom(0x36);
X++;
j++;
}
Y++;
if(Y>0x9f)
Y=0x80;
X=0x80+((i+1)/32)*8;
}
LCD_WriteCom(0x30);
}
/*******************************************************************/
// 初始化设置
/*******************************************************************/
void LCD_Init()
{
P3DIR = 0xff; // control port
P4DIR = 0xff; // data port
LCD_WriteCom(0x30); // 8 bits interface,basic instrument
LCD_WriteCom(0x0c); // display,cursor on
LCD_WriteCom(0x01); // clear DDRAM
LCD_WriteCom(0x02); // cursor return
LCD_WriteCom(0x06);
}
/*******************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -