/***************************************************************/
/*****************本程序提供的外部函数:
extern void Lcd_Write_Str(UCHAR l_line,UCHAR l_site,UCHAR * words);//写字符串
extern void Lcd_Init(void);//初始化
extern void Lcd_Write_Bmp(unsigned char *puts); //写图片
void Lcd_Clr_Scr(void); //清屏
/*********************************************************************/
#include <reg52.h>
#include <intrins.h>
#include <12864bmp.h>
//数据类型定义
typedef unsigned char UCHAR;
typedef unsigned int UINT;
//功能管脚定义
sbit LCM_CS = P2^4; //片选
sbit LCM_SCK = P2^6; //时钟
sbit LCM_SID = P2^5; //数据
sbit PSB =P2^1;
//sbit LCM_BLK = P1^3; //背光
//sbit LCM_RST = P2^3; //复位
char LCD0[]={" 自动寻迹小车"};
char LCD1[]={"设定距离:20M "};
char LCD2[]={"时间: 分 秒 "};
char LCD3[]={"行驶方向:东 "};
idata char LCD4[]={"行驶方向:西"};
idata char LCD5[]={"行驶方向:北"};
unsigned char *p0,*p1,*p2,*p3;
////////////////////////////////////////////
//延时子程序
void delay(UINT t)
{ UINT i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++);
}
//--------------------------------------------------------------------
//功能说明:串行发送一个字节
//输入参数:欲发送字节,输出参数:无
void Send_Byte(UCHAR lcd_byte)
{
register UCHAR i;
LCM_SCK = 0;
for(i=0;i<8;i++)
{
LCM_SID = (bit)(lcd_byte&0x80); //移出的位给SID
lcd_byte <<= 1; //左移一位
LCM_SCK = 1;
LCM_SCK = 0;
}
}
//-------------------------------------------------------------------
//功能说明:串行读取一个命令字节
//输入参数:无,输出参数:读取的字节数据
UCHAR Lcd_Read_Cmd(void)
{
register UCHAR i;
register UCHAR temp;
LCM_CS = 0;
LCM_SID = 0;
LCM_SCK = 0;
LCM_CS = 1;
Send_Byte(0xfc); //首先发送读命令 1111 1100
//11111,RW(1),RS(0),0
temp = 0;
for (i=0;i<8;i++)
{
LCM_SCK = 1;
temp <<=1;
temp |= LCM_SID;
LCM_SCK = 0;
} //读出高四位
temp >>= 4;
for (i=0;i<4;i++)
{
LCM_SCK = 1;
temp <<=1;
temp |= LCM_SID;
LCM_SCK = 0;
} //读出低四位
for (i=0;i<4;i++)
{
LCM_SCK = 1;
LCM_SCK = 0; //第三字节低四位忽略
}
LCM_CS = 0;
LCM_SID = 0;
LCM_SCK = 0;
return temp;
}
//--------------------------------------------------------------------
//功能说明:串行写入一个字节
//输入参数:lcd_data-欲写入字节,cmd_data-数据/命令选择位
//输出参数:无
void Lcd_Write_Byte(UCHAR lcd_data,bit cmd_data)
{
UCHAR lcdopt;
register UCHAR temp;
//EA = 0; //禁用所有中断
lcdopt = 0;
do
{
lcdopt = Lcd_Read_Cmd();
}
while (lcdopt&0x80); //查LCD内部忙信号
LCM_CS = 0;
LCM_SID = 0;
LCM_SCK = 0;
LCM_CS = 1;
// 1111 1 RW RS 0
//RW为0,选择写;RS为1,选择数据;RS为0,选择指令
if(cmd_data==1)
Send_Byte(0xfa);//发送数据 1111 1010
else
Send_Byte(0xf8);//发送指令 1111 1000
//////////////////////////////////////////////////
temp = lcd_data&0xf0;
Send_Byte(temp); //传输高四位
temp = (lcd_data<<4)&0xf0;
Send_Byte(temp); //传输低四位
LCM_CS = 0;
LCM_SID = 0;
LCM_SCK = 0;
//EA=1; //恢复中断
}
//--------------------------------------------------------------------
//功能说明:写入一个命令
//输入参数:写入命令字节,输出参数:无
void Lcd_Write_Cmd(UCHAR lcd_data)
{
Lcd_Write_Byte(lcd_data,0);
}
//--------------------------------------------------------------------
//功能说明:写入一个数据
//输入参数:欲写入数据,输出参数:无
void Lcd_Write_Data(UCHAR lcd_data)
{
Lcd_Write_Byte(lcd_data,1);
}
/////////////////////////////////////////////////
void WriteStr( char temp[])
{
UCHAR *s;
s=temp;
while(*s>0)
{ Lcd_Write_Data(*s);
delay(2000);
s++;
}
}
//--------------------------------------------------------------------
//功能说明:12864初始化
//输入输出参数:无
void Lcd_Init(void)
{
PSB = 0;
Lcd_Write_Cmd(0x30); //基本命令集
Lcd_Write_Cmd(0x30);
Lcd_Write_Cmd(0x0C); //显示ON,游标OFF,游标位反白OFF
Lcd_Write_Cmd(0x06); //写入时,游标右移动
Lcd_Write_Cmd(0x01); //清除显示
//Os_Wait2(K_TMO,1);
Lcd_Write_Cmd(0x02); //位址归位
Lcd_Write_Cmd(0x06); //写入时,游标右移动
//Os_Wait2(K_TMO,1); //根据所用单片机晶振加入等待
}
/****************************************************/
void LCD_bmp_init(void) //LCD显示图片(扩展)初始化程序
{
PSB=0;
Lcd_Write_Cmd(0x34);
Lcd_Write_Cmd(0x34);
Lcd_Write_Cmd(0x36);
Lcd_Write_Cmd(0x01);
}
///////////////////////////////////////////////////////////////////////////////
void DisplayGraphic(unsigned char code *adder)
{
int i,j;
//*******显示上半屏内容设置
for(i=0;i<32;i++)
{
Lcd_Write_Cmd((0x80 + i));
Lcd_Write_Cmd(0x80);
for(j=0;j<16;j++)
{
Lcd_Write_Data(*adder);
adder++;
}
}
//*******显示下半屏内容设置
for(i=0;i<32;i++)
{
Lcd_Write_Cmd((0x80 + i)); //SET 垂直地址 VERTICAL ADD
Lcd_Write_Cmd(0x88); //SET 水平地址 HORIZONTAL ADD
for(j=0;j<16;j++)
{
Lcd_Write_Data(*adder);
adder++;
}
}
}
//////////////////////////////////////////////////
void hzDisp()
{ UCHAR jj=1;
p0=LCD0;p1=LCD1;p2=LCD2;p3=LCD3;
LCD2[6]=0x20;LCD2[7]=0x34;LCD2[10]=0x38;LCD2[11]=0x39;
if(jj==1)
{ p3=LCD3;
}
else if(jj==2)
{ p3=LCD4;
}
else if(jj==3)
{ p3=LCD5;
}
Lcd_Write_Cmd(0x80);
WriteStr(p0);
Lcd_Write_Cmd(0x90);
WriteStr(p1);
Lcd_Write_Cmd(0x88);
WriteStr(p2);
Lcd_Write_Cmd(0x98);
WriteStr(p3);
}
//////////////////////////////////////////////////////
void main()
{ //Lcd_Init();
LCD_bmp_init();
while(1)
{
//hzDisp(); //显示汉字
DisplayGraphic(pic4);
delay(6000); delay(4000);delay(4000);
Lcd_Write_Cmd(0x01); //清除显示,并且设定地址指针为00H
delay(5);
}
}
评论2
最新资源