/*==============================硬件连接========================================
P4 输入/输出数据 P5.5-A0 P5.6-LCD_ENABLE P5.7-READ/WRITE
===============================================================================*/
#include "io430.h"
#define LCD_DATA_IN P4IN
#define LCD_DATA_OUT P4OUT
#define LCD_COMMAND_OUT P4OUT
#define LCD_DIR P4DIR
#define LCD_READ P5OUT |= BIT7
#define LCD_WRITE P5OUT &= ~BIT7
#define LCD_ENABLE_H P5OUT |= BIT6
#define LCD_ENABLE_L P5OUT &= ~BIT6
#define LCD_DATA P5OUT |= BIT5
#define LCD_COMMAND P5OUT &= ~BIT5
void initCLK(); //初始化时钟
void initLCD(); //初始化LCD
void initport(); //初始化端口
char LCD_busy(); //检测是否忙
void delay_us(); //延时
void delay_ms(); //延时
void clearLCD(unsigned char m); //擦除LCD
void write_data(unsigned char DATA); //写数据
void write_command(unsigned char COMMAND); //写命令
void LCD_set_xy( unsigned char x, unsigned char y );//设定坐标
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s); //写字符串
char *str1,*str2,*str3,*str4,*str5; //定义字符串指针
/*============================主函数==============================================*/
main( void )
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset
str2="河北科技大学";
str3="信息学院";
str4="电科专业";
str5="凡夫俗子";
P6SEL &= 0x4; //板子上有D12和LCD共享数据线,初始化,防止冲突
P6DIR |= 0x4; //初始化D12的片选
P6OUT |=0x4; //使CS输出为高,否则为使数据线冲突
initCLK(); // 时钟初始化一定要有!!!
initport(); // 端口出事化一定要有!!!
initLCD();
delay_ms(1);
write_command(0x01); //清屏
LCD_write_string(0,0,str2); //写字符串
LCD_write_string(0,1,str3);
LCD_write_string(0,2,str4);
LCD_write_string(0,3,str5);
//
while(1)
{
delay_ms(100); //个人设置 按需更改
clearLCD(0);
delay_ms(1);
//个人设置 按需更改
delay_ms(100);
clearLCD(1);
delay_ms(1);
}
return 0;
}
/*==================================时钟初始化=======================================*/
void initCLK()
{
unsigned char i;
WDTCTL = WDTPW + WDTHOLD; //Stop WDT
BCSCTL1 &= ~XT2OFF; //Enable high frequency oscillator 12M
BCSCTL2 = SELM1 + SELS; //0X88 MCLK = SMCLK = 6M Hz
do
{
IFG1 &= ~OFIFG; //Clear OSCFault flag
for (i = 0xff; i > 0; i--); //Time for flag to set
}
while ((IFG1 & OFIFG) == OFIFG); //OSCFault flag still set?
BCSCTL2 = SELM1 + SELS; //0X88 MCLK = SMCLK = 6M Hz
}
/*=================================LCD初始化=======================================*/
void initLCD()
{
write_command(0x01);
delay_us(20);
write_command(0x80);
}
/*================================busy检测==========================================*/
char LCD_busy()
{
char status;
P4DIR = 0;
LCD_ENABLE_L;
LCD_COMMAND;
LCD_READ;
delay_us(2);
LCD_ENABLE_H;
delay_us(2);
status = P4IN&BIT7;
LCD_ENABLE_L;
P4DIR = 0XFF;
return status;
}
/*=================================写命令==============================================*/
void write_command(unsigned char COMMAND)
{
while(LCD_busy());
P4DIR=0xff;
P5DIR=0xff;
LCD_ENABLE_L;
LCD_COMMAND;
LCD_WRITE;
delay_us(2);
LCD_ENABLE_H;
LCD_COMMAND_OUT = COMMAND;
delay_us(2);
LCD_ENABLE_L;
}
/*==================================写数据==============================================*/
void write_data(unsigned char DATA)
{
while(LCD_busy());
P4DIR=0xff;
P5DIR=0xff;
LCD_ENABLE_L;
LCD_DATA;
LCD_WRITE;
delay_us(2);
LCD_ENABLE_H;
LCD_COMMAND_OUT = DATA;
delay_us(2);
LCD_ENABLE_L;
}
/*===================================擦除===============================================*/
void clearLCD(unsigned char m)
{
unsigned char count;
if(m==0)
count = 0xff; //绘图区写入0xff 汉字反显
else
count = 0x00; //绘图区写入0x00 汉字正常
int i,j;
for(j=0;j<64;j++)
{
if(j<32)
{
write_command(0x36);
write_command(0x80+j); //行地址
write_command(0x80); //列地址
write_command(0x30);
for(i=0;i<16;i++)
{
delay_ms(100);
write_data(count);
}
}
else
{
write_command(0x36);
write_command(0x80+j-32); //行地址
write_command(0x88); //列地址
write_command(0x30);
for(i=0;i<16;i++)
{
delay_ms(100);
write_data(count);
}
}
}
}
/*======================================延时===========================================*/
void delay_us(int time)
{
do
{
time--;
}
while(time>1);
}
void delay_ms(unsigned int time)
{
while(time != 0)
{
delay_us(100);
time--;
}
}
/*========================================端口============================================*/
void initport()
{
P4SEL = 0;
P5SEL = 0;
P4DIR = 0XFF;
P5DIR = 0XFF;
}
/*=======================================设定位置=========================================*/
void LCD_set_xy( unsigned char x, unsigned char y )
{
unsigned char address;
switch(y){
case 0:
address = 0x80 + x;
break;
case 1:
address = 0x90 + x;
break;
case 2:
address = 0x88 + x;
break;
case 3:
address = 0x98 + x;
break;
default:address = 0x80 + x;}
write_command( address);
}
/*======================================写字符串=========================================*/
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
{
LCD_set_xy( X, Y );
while (*s)
{
write_data( *s );
s ++;
delay_ms(1000);
}
}