当前位置:文档之家› 51单片机LCD_12864驱动

51单片机LCD_12864驱动

/*****************************************************
函数组名: LCD_12864
包含函数: void LCD_Screen(); //屏幕清除
void LCD_init(); //屏幕初始化
void LCD_Location(unsigned char X,unsigned char Y) //设置文字显示坐标
void PrintString(unsigned char *str) //输出文字
void PrintNum(unsigned int num) //输出数字
版本:V1.1


*****************************************************/
#include
#include

/************* 12864LCD引脚定义 *************/
#define LCD_data P0 //数据口
sbit LCD_RS = P2^5; //寄存器选择输入
sbit LCD_RW = P2^6; //液晶读/写控制
sbit LCD_EN = P2^7; //液晶使能控制
sbit LCD_PSB = P2^2; //串/并方式控制 1并口 0串口
sbit LCD_RST = P2^4; //液晶复位端口

/***************************************************/

#define delayNOP(); _nop_();_nop_();_nop_();_nop_();

void lcd_delay(unsigned int ms)
{
unsigned char i;
while(ms--)
{
for(i=124;i>1;i--);
}
}

void delay(unsigned int m) //延时程序
{
unsigned int i,j;
for(i=0;ifor(j=0;j<10;j++);
}

/*******************************************************************/
/* */
/*检查LCD忙状态 */
/*LCD_busy为1时,忙,等待。LCD-busy为0时,闲,可写指令与数据。 */
/* */
/*******************************************************************/
bit LCD_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(LCD_data&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
/*******************************************************************/
void LCD_wcmd(unsigned char cmd)
{
// while(LCD_busy());
LCD_RS = 0;
LCD_RW = 0;
delay(1);
LCD_data = cmd;
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/
void LCD_wdat(unsigned

char dat)
{
//while(LCD_busy());
LCD_RS = 1;
LCD_RW = 0;
delay(1);
LCD_data = dat;
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}

/*********************************************************
* *
* 清屏函数 *
* *
*********************************************************/
void LCD_ClearScreen()
{
LCD_wcmd(0x34); //扩充指令操作
lcd_delay(5);
LCD_wcmd(0x30); //基本指令操作
lcd_delay(5);
LCD_wcmd(0x01); //清屏
lcd_delay(5);
}
/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/

void LCD_Init()
{

LCD_PSB = 1; //并口方式

LCD_RST = 0; //液晶复位
lcd_delay(3);
LCD_RST = 1;
lcd_delay(3);

delay(40); //大于40MS的延时程序
LCD_PSB=1; //设置为8BIT并口工作模式
delay(1); //延时
LCD_RST=0; //复位
delay(1); //延时
LCD_RST=1; //复位置高
delay(10);
LCD_wcmd(0x30); //Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFF
delay(100); //大于100uS的延时程序
LCD_wcmd(0x30); //Function Set
delay(37); ////大于37uS的延时程序
LCD_wcmd(0x08); //Display on Control
delay(100); //大于100uS的延时程序
LCD_wcmd(0x10); //Cursor Display Control光标设置
delay(100); //大于100uS的延时程序
LCD_wcmd(0x0c); //Display Control,D=1,显示开
delay(100); //大于100uS的延时程序
LCD_wcmd(0x01); //Display Clear
delay(10); //大于10mS的延时程序
LCD_wcmd(0x06); //Enry Mode Set,光标从右向左加1位移动
delay(100); //大于100uS的延时程序

LCD_ClearScreen();
}
/*********************************************************/
/* */
/* 设定显示位置 */
/* */
/*********************************************************/
void LCD_Location(unsigned char y,unsigned char x)
{
unsigned char pos;
if (y==0)
{y=0x80;}
else if (y==1)
{y=0x90;}
else if (y==2)
{y=0x88;}
else if (y==3)
{y=0x98;}
pos = x+y ;

LCD_wcmd(pos); //显

示地址
}

/***********************************************************
*
* 显示字符串
*
*************************************************************/

void LCD_PrintStr(unsigned char *str)
{

while(*str)
{
LCD_wdat(*str++);

}
}
//显示数字
void LCD_PrintNum(unsigned int num,unsigned char wei)//wei 数字占的位数
{
unsigned char tempstring[6];
unsigned char n[5];
unsigned char i,j=0;
n[0]=num/10000;
n[1]=num%10000/1000;
n[2]=num%1000/100;
n[3]=num%100/10;
n[4]=num%10;
i=5-wei;

for(i;i<5;i++)
{
tempstring[j++]=n[i]+'0';
}
tempstring[j]='\0';
LCD_PrintStr(tempstring);
//*/
}
/****************************************************************/

unsigned char hour,min,sec;

void time_init()
{
hour=12;
min=sec=0;
ET0 = 1;
EA = 1;
TMOD = 0x01;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
TR0 = 1;
}

void time0_isr() interrupt 1
{
static unsigned char time_cnt=0;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
if(++time_cnt>=20)
{
time_cnt=0;
if(++sec>59)
{
sec=0;
if(++min>59)
{
min=0;
if(++hour>23)
{
hour=0;
}
}
}
}
}


void main()
{
time_init();
LCD_Init();
LCD_Location(0,0);
LCD_PrintStr("时间显示");
while(1)
{
LCD_Location(3,0);
LCD_PrintNum(hour,2);
LCD_PrintStr(":");
LCD_PrintNum(min,2);
LCD_PrintStr(":");
LCD_PrintNum(sec,2);
}


}



相关主题
文本预览
相关文档 最新文档