📄 12864.c
字号:
#include <msp430x14x.h>
#include "cry12864.h"
#define uchar unsigned char
#define uint unsigned int
#define LCD_DataIn P2DIR=0x00 //数据口方向设置为输入
#define LCD_DataOut P2DIR=0xff //数据口方向设置为输出
#define LCD2MCU_Data P2IN
#define MCU2LCD_Data P2OUT
#define LCD_CMDOut P6DIR|=0xff //P6口的三位设置为输出
#define LCD_RS_H P6OUT|=BIT3 //P6.3
#define LCD_RS_L P6OUT&=~BIT3 //P6.3
#define LCD_RW_H P6OUT|=BIT4 //P6.4
#define LCD_RW_L P6OUT&=~BIT4 //P6.4
#define LCD_EN_H P6OUT|=BIT5 //P6.5
#define LCD_EN_L P6OUT&=~BIT5 //P6.5
/*******************************************
函数名称:Delay_1ms
功 能:延时约1ms的时间
参 数:无
返回值 :无
********************************************/
void Delay_1ms(void)
{
uchar i;
for(i = 150;i > 0;i--) _NOP();
}
/*******************************************
函数名称:Delay_Nms
功 能:延时N个1ms的时间
参 数:n--延时长度
返回值 :无
********************************************/
void Delay_Nms(uint n)
{
uint i;
for(i = n;i > 0;i--)
Delay_1ms();
}
/*******************************************
函数名称:Write_Cmd
功 能:向液晶中写控制命令
参 数:cmd--控制命令
返回值 :无
********************************************/
void Write_Cmd(uchar cmd)
{
uchar lcdtemp = 0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do //判忙
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp & 0x80);
LCD_DataOut;
LCD_RW_L;
MCU2LCD_Data = cmd;
LCD_EN_H;
_NOP();
LCD_EN_L;
// Delay_1ms();
}
/*******************************************
函数名称:Write_Data
功 能:向液晶中写显示数据
参 数:dat--显示数据
返回值 :无
********************************************/
void Write_Data(uchar dat)
{
uchar lcdtemp = 0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do //判忙
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp & 0x80);
LCD_DataOut;
LCD_RS_H;
LCD_RW_L;
MCU2LCD_Data = dat;
LCD_EN_H;
_NOP();
LCD_EN_L;
// Delay_1ms();
}
/**************************************************
函数名称:lcd_read_data
功 能:读取12864中一个字节的数据
参 数:无
返回值 :显示的数据
**************************************************/
unsigned char lcd_read_data(void)
{
unsigned char Data_Temp;
unsigned char lcdtemp;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp&0x80);
LCD_RS_H;
LCD_RW_H;
LCD_DataIn;
LCD_EN_H;
_NOP();
Data_Temp = LCD2MCU_Data;
LCD_EN_L;
return Data_Temp;
}
/*******************************************
函数名称:Ini_Lcd
功 能:初始化液晶模块
参 数:无
返回值 :无
********************************************/
void Ini_Lcd(void)
{
LCD_CMDOut; //液晶控制端口设置为输出
// Delay_Nms(500);
Write_Cmd(0x30); //基本指令集
Write_Cmd(0x02); // 地址归位
Write_Cmd(0x0c); //整体显示打开,游标关闭
Write_Cmd(0x01); //清除显示
Write_Cmd(0x06); //游标右移
Write_Cmd(0x80); //设定显示的起始地址
}
/*******************************************
函数名称:Clear_GDRAM
功 能:清除液晶GDRAM中的随机数据
参 数:无
返回值 :无
********************************************/
void Clear_GDRAM(void)
{
uchar i,j,k;
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(0x00);
}
}
i = 0x80;
for(j = 0;j < 32;j++)
{
Write_Cmd(i++);
Write_Cmd(0x88);
for(k = 0;k < 16;k++)
{
Write_Data(0x00);
}
}
Write_Cmd(0x30); //回到基本指令集
}
/*******************************************
函数名称:Draw_TX
功 能:显示一个16*16大小的图形
参 数:Yaddr--Y地址
Xaddr--X地址
dp--指向图形数据存放地址的指针
返回值 :无
********************************************/
void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp)
{
uchar j;
uchar k=0;
// Write_Cmd(0x01); //清屏,只能清除DDRAM
Write_Cmd(0x34); //使用扩展指令集,关闭绘图显示
for(j=0;j<16;j++)
{
Write_Cmd(Yaddr++); //Y地址
Write_Cmd(Xaddr); //X地址
Write_Data(dp[k++]);
Write_Data(dp[k++]);
}
Write_Cmd(0x36); //打开绘图显示
// Write_Cmd(0x30); //回到基本指令集模式
}
/*******************************************
函数名称:Disp_YGHZ
功 能:控制液晶任意位置显示一个汉字
参 数:addr--显示位置的首地址
ptH--指向显示汉字的编码高8位
ptL--指向显示汉字的编码低8位
返回值 :无
********************************************/
void Disp_YGHZ(uchar addr,uchar ptH,uchar ptL)
{
Write_Cmd(addr);
Write_Data(ptH);
Write_Data(ptL);
}
/************************************
显示小数点
***********************************************/
void Disp_DIAN(uchar addr,uchar data)
{
Write_Cmd(addr);
Write_Data(data);
}
/*******************************************
函数名称:Disp_HZ
功 能:控制液晶显示汉字
参 数:addr--显示位置的首地址
pt--指向显示数据的指针
num--显示字符个数
返回值 :无
********************************************/
void Disp_HZ(uchar addr,const uchar * pt,uchar num)
{
uchar i;
Write_Cmd(addr);
for(i = 0;i < (num*2);i++)
Write_Data(*(pt++));
}
/*****************************************
把某一行写入空白
******************************************/
void Disp_white(uchar addr)
{ uchar i;
Write_Cmd(addr);
for(i = 0;i < 16;i++)
Write_Data(0x20);
}
/*******************************************
函数名称:Draw_PM
功 能:在整个液晶屏幕上画图
参 数:无
返回值 :无
********************************************/
void Draw_PM(const uchar *ptr)
{
uchar i,j,k;
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); //回到基本指令集
}
/**************************************************
函数名称:lcd_setxy
功 能:设置显示位置
参 数:X(1~16),Y(1~4)
返回值 :无
**************************************************/
void lcd_setxy(unsigned char x,unsigned char y)
{
switch(y)
{
case 1:
Write_Cmd(0x7F+x);break;
case 2:
Write_Cmd(0x8F+x);break;
case 3:
Write_Cmd(0x87+x);break;
case 4:
Write_Cmd(0x97+x);break;
default:break;
}
}
/**************************************************/
/**************************************************
函数名称:display_line
功 能:在指定位置显示字符串
参 数:坐标x y 字符串str
返回值 :无
**************************************************/
void display_line(unsigned char x,unsigned char y,const char* str)
{
unsigned char LCD_temp;
lcd_setxy(x,y);
LCD_temp=*str;
while(LCD_temp != 0x00)
{
Write_Data(LCD_temp);
LCD_temp=*(++str);
}
}
/**************************************************/
/**************************************************
函数名称:my_abs
功 能:求绝对值 调用math。h中的abs总是有警告 于是自己写
参 数:a
返回值 :无
**************************************************/
unsigned int my_abs(int a)
{
if(a<0)
a=-a;
return a;
}
/**************************************************/
/**************************************************
函数名称:clr_screen
功 能:清除显示
参 数:无
返回值 :无
**************************************************/
void clr_screen(void)
{
Write_Cmd(0x01);
//delay_ms(15);
}
/**************************************************/
/**************************************************
函数名称:set_white
功 能:任意位置反白
参 数:行数y 起始x 结束end_x 模式clear 0反白 1复原
返回值 :无
**************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -