#include <REG51.H>
#include <STDIO.H>
#include <INTRINS.H>
//#include "hzk16x16.h"
#define uchar unsigned char
#define uint unsigned int
#define LCD_BUS P1
sbit cs =P3^2 ; //片选信号
sbit WR1 = P3^3; //写控制信号
sbit RD1 = P3^4; //读控制信号
sbit CD1 = P3^5; //通道信号, cd=1指令 cd=0 数据
void delay(uchar t); //延时
void wr_com ( uchar wr_com ); //写命令
void wr_data( uchar wr_data); //写数据
ReadSdate() ;
void delay(uchar t) ;
void RWcheck();
void WriteData(uchar dat);
void AutoRcheck(void);
void AutoWcheck(void);
void AutoWriteData( uchar dat) ;
void ClearScreen(unsigned int ram) ;
void draw_dot(uchar x,uchar y,uchar mode);
void WriteCmd1(unsigned char cmd);
void WriteCmd2(unsigned char dat,unsigned char cmd);
void WriteCmd3(unsigned char dat1,unsigned char dat2,unsigned char cmd);
void CursorPosSet(unsigned char x,unsigned char y) ;
unsigned char Cursor_X,Cursor_Y; //光标的坐标
/************************************************************
指令代码定义
************************************************************/
#define CursorPointer 0x21 // 光标地址设置
#define OffsetReg 0x22 // CGRAM偏移地址设置
#define AddrSet 0x24 // 显示地址设置
#define TextHomeAddr 0x40 // 文本首地址
#define TextArea 0x41 // 文本宽度设置
#define GraHomeAddr 0x42 // 图形首地址设置
#define GraArea 0x43 // 图形宽度设置
#define OrMode 0x80 // 或模式显示
#define ExorMode 0x81 // 异或模式显示
#define AndMode 0x83 // 与模式显示
#define TextAttMode 0x84 // 文本属性模式
#define InterCGROM 0 // 内部CGROM
#define ExCGRAM 0x08 // 外部CGRAM
#define DisplayOff 0x90 // 显示关闭
#define CursorOn 0x92 // 光标显示,但不闪烁
#define CursorBlink 0x93 // 光标闪烁
#define TextOn 0x94 // 文本模式打开
#define GraOn 0x98 // 图形模式打开
#define TGAllOn 0x9c // 文本图形模式都打开
#define DataAutoWrite 0xb0 // 数据自动写
#define DataAutoRead 0xb1 // 数据自动读
#define ExitAutoRW 0xb2 // 退出数据自动读写模式
#define DataWAddrI 0xc0 // 数据写,地址加1
#define DataWAddrD 0xc2 // 数据写,地址减1
#define DataWAddrNV 0xc4 // 数据写,地址不变
#define DataRAddrI 0xc1 // 数据读,地址加1
#define DataRAddrD 0xc3 // 数据读,地址减1
#define DataRAddrNV 0xc5 // 数据读,地址不变
#define ScreenPeek 0xe0 // 屏读
#define ScreenCopy 0xe1 // 屏拷贝
#define LineChar 32 // 设置宽度
/********************************************************************************
函数名: ReadSdate(void)
函数功能: IOPORT输出数据并检查LCD忙数据。
返回数据:checkbusy
/********************************************************************************/
ReadSdate()
{
uchar checkbusy;
LCD_BUS = 0xff;
CD1=1;
RD1=0;
checkbusy=LCD_BUS;
RD1=1;
return ( checkbusy );
}
/********************************************************************************
函数名: Void RWcheck()
函数功能: 判断状态位STA1,STA0子程序(读写指令和读写数据状态),在写指令的读,
写数据之前这两个标志位必须同时为1
/********************************************************************************/
void RWcheck(void)
{
uchar databusy;
do{ databusy=ReadSdate();}
while( !(databusy&0x03) );
}
/********************************************************************************
函数名: Void AutoRcheck()
函数功能: 判断状态位STA2的子程序(数据自动读状态),该位在数据自动读操作过程中
取代STA0和STA1有效。在连续读过程中每读一次之前都要确认STA2=1
********************************************************************************/
void AutoRcheck(void)
{
uchar databusy;
do{databusy=ReadSdate(); }
while( !(databusy&0x04) );
}
/********************************************************************************
函数名: Void AutoWcheck()
函数功能: 判断状态位STA3子程序(数据自动写状态)
********************************************************************************/
void AutoWcheck(void)
{
uchar databusy;
do{databusy=ReadSdate(); }
while( !(databusy&0x08) );
}
/********************************************************************************
函数名: Void WriteCmd1(uchar cmd)
Void WriteCmd2(uchar dat1,uchar cmd)
Void WriteCmd3(uchar dat1,uchar dat2,uchar cmd)
Void WriteData(uchar dat)
函数功能: 写指令和写数据子程序
********************************************************************************/
void WriteData(uchar dat)
{
RWcheck();
CD1=0;
LCD_BUS=dat;
WR1=0;
WR1=1;
}
void WriteCmd1(unsigned char cmd)
{
RWcheck();
CD1=1;
LCD_BUS=cmd;
WR1=0;
WR1=1;
}
void WriteCmd2(uchar dat,uchar cmd)
{
WriteData(dat);
WriteCmd1(cmd);
}
void WriteCmd3(uchar dat1,uchar dat2,uchar cmd)
{
WriteData(dat1);
WriteData(dat2);
WriteCmd1(cmd);
}
void AutoWriteData( uchar dat)
{
AutoWcheck();
CD1 = 0;
LCD_BUS= dat;
WR1=0;
WR1=1;
}
/********************************************************************************
函数名: void lcd_init (void)
函数功能:LCD初始化设置
********************************************************************************/
void lcd_init (void)
{
WriteCmd3(0x00,0x00,0x40); //文本首地址
WriteCmd3(0x20,0x00,0x41); //文本宽度设置
WriteCmd3(0x00,0x00,0x42); // 图形首地址
WriteCmd3(0x20,0x00,0x43); //设置图形宽度
//即一行显示所占字节数
WriteCmd1(0xa1); //光标设置
WriteCmd1(0x80); //显示方式设置 逻辑"或"合成
WriteCmd1(0x9f); //显示开关
Cursor_X=0x08;
Cursor_Y=0x4f;
CursorPosSet(Cursor_X,Cursor_Y);
ClearScreen(0x2000);
}
/********************************************************************************
函数名: Void ClearScreen(unsigned int ram)
函数功能: 清除整个屏幕
ram : 需要清零的单元数
********************************************************************************/
void ClearScreen(uint ram)
{
unsigned int i;
// 清显示 RAM 区 0000h--2000h (8k)
WriteCmd3(0x00,0x00,0x24); // 设置指针地址0000H
WriteCmd1(0xb0); // 设置自动写状态
for(i=0x00;i<RAM;I++) if(Cursor_Y { CursorUp() void ******************************************************************************** 光标向上移动一格 函数功能: Void 函数名: } X的取值范围0-20;Y的取值范围0-15; WriteCmd3(x,y,CursorPointer); y) char x,unsigned CursorPosSet(unsigned 光标位置设置 Y) X,uchar CursorPosSet(uchar WriteCmd1(t); t="n|((~(x%8))&0x07);" n="0xf8;" else if(mode) WriteCmd3(dat11,dat22,0x24); delay(20); dat
评论0