t6963c.c
-----------------------------------------------
#include <msp430x14x.h>
#include "t6963c.h"
static char STA=0;
/*************************************
读液晶状态字到STA
功能:用于往液晶写数据或命令之前判断忙闲
*************************************/
void read_sta(void)
{
STA = 0;
P5DIR = 0x00; //P5数据输入
P5OUT = 0xff;
LCM2MSP2 //4245(x2)数据传送方向选择为:由液晶到430
SET_CMD //命令方式
SET_RD //read
//delay(1);
STA = P5IN; //读回状态
//delay(1);
CANCEL_RD //cancel read
P5DIR = 0xff; //P5口置为数据输出方式
MSP2LCM2 //4245(x2)数据传送方向选择为:由430到液晶
}
/******************************************
判状态位S1,S0 函数(读写指令和读写数据状态)
******************************************/
void ST01( void )
{
do
{
read_sta();
}
while( (STA &= STA01) != 0x03 );
}
/*****************************************
判状态位S2函数(数据自动读状态)
*****************************************/
void ST2( void )
{
do
{
read_sta();
}
while( (STA &= STA2) != STA2);
}
/*****************************************
判状态位S3函数(数据自动写状态)
******************************************/
void ST3( void )
{
do
{
read_sta();
}
while( (STA & STA3) != STA3 );
}
/***************************************
判状态位S6函数(屏读/拷贝状态)
***************************************/
void ST6( void )
{
// do
// {
// read_sta();
// }
// while( (STA & 0x08) != 0x08 );
}
/*************************************
写入数据字节
***************************************/
void write_data(unsigned char data)
{
ST01(); //检测确定LCM状态
P5DIR = 0xff; //数据输出
P5OUT = data;
MSP2LCM2
SET_DAT //数据方式
//delay(1);
SET_WR // write
//delay(1);
CANCEL_WR
//LCM2MSP2
}
/************************************
写入命令字
*************************************/
void write_cmd(unsigned char cmd )
{
ST01(); //检测确定LCM状态
P5DIR = 0xff; //数据输出
P5OUT = cmd;
MSP2LCM2
//delay(1);
SET_CMD //命令方式
// delay(1);
SET_WR // write
CANCEL_WR
//MSP2LCM2
}
/************************************
写只有一个参数的命令
************************************/
void write_onepara(unsigned char dat1,unsigned char cmd )
{
write_data( dat1 );
write_cmd( cmd );
}
/************************************
写含有双参数的命令
************************************/
void write_dou××epara(unsigned char dat1,unsigned char dat2,unsigned char cmd )
{
write_data( dat1 );
write_data( dat2 );
write_cmd( cmd );
}
/***********************************
从LCM中读一个数据
***********************************/
int read_data(void)
{
int temp;
ST01();
P5DIR = 0x00; //P5数据输入
LCM2MSP2 //4245(x1)数据传送方向选择为:由液晶到430
SET_DAT //数据方式
SET_RD //read
temp = P5IN; //读回状态
CANCEL_RD //cancel read
P5DIR = 0xff; //P5口置为数据输出方式
MSP2LCM2 //4245(x1)数据传送方向选择为:由430到液晶
return temp;
}
/***********************************
清显示缓冲的函数
***********************************/
void CLEAR_RAM( void )
{
int i;
write_dou××epara( 0x00,0x00,0x24 ); /* 设置显示RAM 首地址 */
write_cmd( 0xb0 ); /* 设置自动写方式 */
for(i=0;i<8192;i++) /* 清8K存储器 */
{
ST3(); /* 判状态位STA3 */
write_data(0x00); /* 写入数据 */
}
write_cmd( 0xb2 ); /* 设置自动写结束指令 */
}
/***********************************
对液晶屏的一些初始设置函数
***********************************/
void LcdInit( void )
{
P4SEL=0x00; //P4设为一般I/O
P4DIR=0xFF; //P4设为输出
P4OUT=0xF8; //初始化 WR=1;RD=1;C/D=1(即才C 命令方式)
//OE=0(4545使能) 地人DIR1=DIR2=0(从430到LCM)
P5SEL=0x00;
P5DIR=0xFF;
P5OUT=0x00;
MSP2LCM1 // 4245#1 从430到LCM
MSP2LCM2 //D0-D7 到LCM
SET_CMD
CANCEL_WR //WR=1;
CANCEL_RD //RD=1
RST
write_dou××epara(0x00,0x00,0x40); /*设文本显示区域首地址为 0*/
write_dou××epara(0x20,0x00,0x41); /*设文本显示区域宽度为 32个字符*/
write_dou××epara(0x03,0x00,0x22); /* 设置CGRAM偏置地址 */
write_dou××epara(0x00,0x08,0x42); /*设图形显示区(文本属性)域首地址为 0x800*/
write_dou××epara(0x20,0x00,0x43); /*设图形显示区域(文本属性)宽度为 32 */
//write_cmd(0xa2); /*光标形状设置*/
//write_dou××epara(0x00,0x00,0x21); /* 设置光标 位置*/
write_cmd(0x84); /*显示方式设置逻辑"或"合成, 内部字符发生器有效*/
write_cmd(0x94); /*显示开关设置 开文本和关图形显示*/
CLEAR_RAM();
write_dou××epara(0x03,0x00,0x24);
}
/*********************************×
显示一个英文字符(文本属性显示方式)
***********************************/
void display_onechar(int x, int y, unsigned char code)
{
unsigned int addr;
addr = y*32+x; //locate ram地址
write_dou××epara((unsigned char)addr,(unsigned char)(addr/256),0x24); //设置显示存储器地址
write_onepara(code,0xc4);
write_dou××epara((unsigned char)addr,0x08,0x24); //设置显示存储器地址
write_onepara(0,0xc4); //装入字符代码,写入数据,地址不变
}