typedef unsigned char uint8 ;
typedef unsigned int uint16;
typedef unsigned long uint32;
#define BIT(x) (1 << (x))
/***************************************
* 液晶控制IO的宏定义
***************************************/
#define cyCS 3 // P2.3,片选信号
#define cySID 4 // P2.4,串行数据
#define cyCLK 5 // P2.5,同步时钟
#define cyPORT P2OUT
#define cyDDR P2DIR
/*******************************************
*功 能:延时 t us
********************************************/
void Delay_Nus(uint16 t)
{
while (t--)
{
_NOP();
}
}
/*******************************************
*功 能:延时 1 ms
********************************************/
void Delay_1ms(void)
{
uint16 i;
for (i=1000; i>0; i--)
{
_NOP();
}
}
/*******************************************
*功 能:延时 t ms
********************************************/
void Delay_Nms(uint16 t)
{
while (t--)
{
Delay_1ms();
}
}
void Write_Com(uint8 com) // Write one byte command to LCD12864
{
uint8 FirstByte = 0xF8;
uint8 temp = 0;
uint8 i = 0;
uint8 j = 3;
cyPORT |= BIT(cyCS);
cyPORT &= ~BIT(cyCLK);
while (j > 0)
{
if (j == 3)
{
temp = FirstByte;
}
else if (j == 2)
{
temp = com & 0xf0;
}
else
{
temp = (com<<4) & 0xf0;
}
for (i=8; i>0; i--)
{
if (temp & 0x80)
{
cyPORT |= BIT(cySID);
}
else
{
cyPORT &= ~BIT(cySID);
}
cyPORT |= BIT(cyCLK);
temp <<= 1;
cyPORT &= ~BIT(cyCLK);
}
if (j == 3)
{
Delay_Nus(600); //三个字节之间一定要有足够的延时,否则易出现时序问题
}
else
{
Delay_Nus(200);
}
j--;
}
cyPORT &= ~BIT(cySID);
cyPORT &= ~BIT(cyCS);
}
void Write_Data(uint8 dat) // Write one byte data to LCD12864
{
uint8 FirstByte = 0xFA;
uint8 temp = 0;
uint8 i = 0;
uint8 j = 3;
cyPORT |= BIT(cyCS);
cyPORT &= ~BIT(cyCLK);
while (j > 0)
{
if (j == 3)
{
temp = FirstByte;
}
else if (j == 2)
{
temp = dat & 0xf0;
}
else
{
temp = (dat<<4) & 0xf0;
}
for (i=8; i>0; i--)
{
if (temp & 0x80)
{
cyPORT |= BIT(cySID);
}
else
{
cyPORT &= ~BIT(cySID);
}
cyPORT |= BIT(cyCLK);
temp <<= 1;
cyPORT &= ~BIT(cyCLK);
}
if (j == 3)
{
Delay_Nus(600); //三个字节之间一定要有足够的延时,否则易出现时序问题
}
else
{
Delay_Nus(200);
}
j--;
}
cyPORT &= ~BIT(cySID);
cyPORT &= ~BIT(cyCS);
}
void SET_XY(uint8 x, uint8 y)
{
uint8 Add = 0;
if (x == 1) // 第一行
{
Add = 0x80 + y;
}
else if (x == 2) // 第二行
{
Add = 0x90 + y;
}
else if (x == 3) // 第三行
{
Add = 0x88 + y;
}
else if (x == 4) // 第四行
{
Add = 0x98 + y;
}
Write_Com(Add);
}
/********************************************************************
*功 能:MCU向液晶模块发送1一个字节的数据
*参 数:type--数据类型:0--控制命令,1--显示数据,,data--发送的数据
********************************************************************/
void WriteOneChar(uint8 x, uint8 y, uint8 dat)
{
SET_XY(x, y);
Write_Data(dat);
}
/******************************************************************************
*功 能:显示字符串
*参 数:addr--显示位置的首地址,pt--指向显示字符串的首地址(指针)
*******************************************************************************/
void Write_String(uint8 x, uint8 y, uint8 *pt)
{
SET_XY(x, y);
while (*pt != '\0')
{
Write_Data(*pt++);
}
}
/******************************************************************************
*功 能:显示汉字程序
*参 数:x,y--显示位置的首地址,pt--指向显示数据的指针,n--显示汉字的个数
*******************************************************************************/
void WriteChineseCharacters(uint8 x, uint8 y, uint8 *pt, uint8 n)
{
uint8 i;
SET_XY(x, y);
for (i=0; i<(n*2); i++)
{
Write_Data(*pt++);
}
}
/************************************************************
*功 能:显示一个四位数
*参 数:x,y--显示地址,数字--显示的数字
*************************************************************/
void Write_Number(uint8 x, uint8 y, uint16 Num)
{
uint8 temp[4];
temp[0] = Num / 1000;
temp[1] = Num % 1000 / 100;
temp[2] = Num % 100 / 10;
temp[3] = Num % 10;
SET_XY(x, y);
Write_Data('0' + temp[0]);
Write_Data('0' + temp[1]);
Write_Data('0' + temp[2]);
Write_Data('0' + temp[3]);
}
/************************************************************
*功 能:显示一个由四位数字(含三位小数)表示的电压幅值,单位V
*参 数:addr--显示地址,数字--显示的数字
*************************************************************/
void DisVoltage(uint8 x, uint8 y, uint16 Vol)
{
uint8 temp[5];
temp[0] = Vol / 10000;
temp[1] = Vol % 10000 / 1000;
temp[2] = Vol % 1000 / 100;
temp[3] = Vol % 100 / 10;
temp[4] = Vol % 10;
SET_XY(x, y);
Write_Data('0' + temp[0]);
Write_Data('0' + temp[1]);
Write_Data('.');
Write_Data('0' + temp[2]);
Write_Data('0' + temp[3]);
Write_Data('V');
}
/*******************************************
*功 能:初始化液晶模块
********************************************/
void LCD12864_Init(void)
{
cyDDR |= BIT(cyCLK) + BIT(cySID) + BIT(cyCS); //相应的位端口设置为输出
Delay_Nms(100); //延时等待液晶完成复位
Write_Com(0x30); /*功能设置:一次送8位数据,基本指令集*/
Delay_Nus(50);
Write_Com(0x02); /*DDRAM地址归位*/
Delay_Nus(50);
Write_Com(0x0C); /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/
Delay_Nus(50);
Write_Com(0x01); /*清屏,将DDRAM的位址计数器调整为“00H”*/
Delay_Nus(50);
Write_Com(0x06); /*功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1*/
Delay_Nus(50);
//Write_String(1, 2, "重邮信科");
//Write_String(2, 0, "abcd");
//Write_String(3, 0, "123456");
//Write_String(4, 0, "gh");
//WriteChineseCharacters(4, 2, "逸夫楼", 3);
Write_String(1, 0, " Us = 60.00V");
Write_String(2, 0, " Ud = ");
WriteChineseCharacters(3, 0, "输入电压:", 5);
WriteChineseCharacters(4, 0, "系统负载:", 5);
}
这个是3线控制的程序,时钟为1MHz,这个是我在LaunchPad上跑过的程序,IO随便接三个就行,只要是1MHz的时钟其他型号的430都是可以用的,如果用不同时钟频率修改下延时函数就OK了~