#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/* 12864端口定义*/
#define LCD_data P0 //带字库液晶12864数据口
sbit LCD_RS = P2^3; //寄存器选择输入
sbit LCD_RW = P2^4; //液晶读/写控制
sbit LCD_EN = P2^1; //液晶使能控制
sbit PSB=P2^0; //并口控制
sbit RES=P2^2;
//*****************DEFINITION***********************//
//**************LCD COMMAND DEFINITION**************//
// ---/---/---/RES/R/W/E /PSB/RS
//RES:L
//R/W:H/L
//RS :H COM L DATA
//E :L
//PSB:H
// PA7/PA6/PA5/PA4/PA3/PA2/PA1/PA0
//DATA:PORTB
#define LCD_READ_COMMAND_ENABLE 0X1A //00011010
#define LCD_READ_DATA_ENABLE 0X1B //00011011
#define LCD_WRITE_COMMAND_ENABLE 0X12 //00010010
#define LCD_WRITE_DATA_ENABLE 0X13 //00010011
#define LCD_READ_COMMAND_DISABLE 0X1E //00011110
#define LCD_READ_DATA_DISABLE 0X1F //00011111
#define LCD_WRITE_COMMAND_DISABLE 0X16 //00010110
#define LCD_WRITE_DATA_DISABLE 0X17 //00010111
//******************DELAY PROGRAM******************//
void delay_ms(unsigned char ms)
{
int i,j;
for(i=0;i<1000;i++)
for(j=0;j<ms;j++){
}
}
void delay_us(unsigned char us)
{
int i,j;
for(i=0;i<5;i++)
for(j=0;j<us;j++){
}
}
//*****************LCD 12864**********************//
//*****************READ BUSY***********************//
char IF_LCD_BUSY(void)
{
char READ_LCD_BUSY_SIGNAL;
RES=0;
LCD_RW=1;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delay_ms(5);
READ_LCD_BUSY_SIGNAL = (P0&0x80);
LCD_EN = 0;
return READ_LCD_BUSY_SIGNAL;
}
//*****************WRITE COMMAND TO LCD************//
void LCD_WRITE_Command(unsigned char command)
{
while(IF_LCD_BUSY());
DDRA=0XFF;
PORTA=LCD_WRITE_COMMAND_ENABLE;
delay_us(2);
PORTA=LCD_WRITE_COMMAND_DISABLE;
DDRB=0XFF;
PORTB=command;
delay_us(2);
PORTA=LCD_WRITE_COMMAND_ENABLE;
}
//*****************WRITE DATA TO LCD***************//
void LCD_WRITE_BYTE(unsigned char data)
{
while(IF_LCD_BUSY());
DDRA=0XFF;
PORTA=LCD_WRITE_DATA_ENABLE;
delay_us(2);
PORTA=LCD_WRITE_DATA_DISABLE;
DDRB=0XFF;
PORTB=data;
delay_us(2);
PORTA=LCD_WRITE_DATA_ENABLE;
}
//*****************LCD INITIAL*********************//
void LCD_Init(void)
{
DDRB=0XFF;
DDRA=0XFF;
LCD_WRITE_Command(0X38);
LCD_WRITE_Command(0X38);
LCD_WRITE_Command(0X38);
LCD_WRITE_Command(0X38);
LCD_WRITE_Command(0X08);
LCD_WRITE_Command(0X01); //CLEAR LCD
LCD_WRITE_Command(0X06); //AC++
LCD_WRITE_Command(0X0C);
}
//*****************DISPLAY ONE CHAR***************//
void DisplayOneChar(unsigned char x_direction,unsigned char y_direction,unsigned char one_char)
{
unsigned char initial_direction;
switch(y_direction)
{
case 0:initial_direction=0X80;
break;
case 1:initial_direction=0X90;
break;
case 2:initial_direction=0X88;
break;
case 3:initial_direction=0X98;
break;
default:initial_direction=0X80;
break;
}
initial_direction=initial_direction+x_direction;
LCD_WRITE_Command(initial_direction);
LCD_WRITE_BYTE(one_char);
}
//*****************TRAN TO ASCII******************//
void ASCII_TRAN(unsigned char *asc)
{
while((*asc)!=0)
{
LCD_WRITE_BYTE(*asc);
asc++;
}
}
//***************DISPLAY STRING********************//
void DisplayString(unsigned char x_direction,unsigned char y_direction,unsigned char str[])
{
unsigned char initial_direction;
switch(y_direction)
{
case 0:initial_direction=0X80;
break;
case 1:initial_direction=0X90;
break;
case 2:initial_direction=0X88;
break;
case 3:initial_direction=0X98;
break;
default:initial_direction=0X80;
break;
}
initial_direction=initial_direction+x_direction;
LCD_WRITE_Command(initial_direction);
ASCII_TRAN(str);
delay_ms(10);
}
//*****************LCD PROGRAM END*****************//
void main(void)
{
LCD_Init();
while(1)
{
DisplayString(1,0,"中国计量学院");
DisplayString(2,1,"质安学院");
}
}