本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
#include<REG51.H>
#define uchar unsigned char
#define uint unsigned int
#define DATAPORT P1
sbit RST = P0^5;
sbit CS1 = P0^4;
sbit CS2 = P0^3;
sbit RS = P0^2;
sbit RW = P0^1;
sbit EN = P0^0;
uchar code HZ[]={
/*-- 文字: 天 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x3F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x7F,0xFE,0x01,0x00,
0x01,0x00,0x02,0x80,0x02,0x40,0x04,0x20,0x08,0x18,0x10,0x0E,0x20,0x04,0x40,0x00,
/*-- 文字: 下 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x04,0x7F,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0xC0,0x01,0x60,0x01,0x30,
0x01,0x20,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,
/*-- 文字: I --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,
0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: I --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,
0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,
}
/******************************************************************
US延时函数
*******************************************************************/
void delay_US(uint x)
{
while(x=x--)
{;}
}
/**************************************************
判断LCM忙子函数
***************************************************/
void lcd_BUSY()
{
RS=0;
RW=1;
DATAPORT=0xff;
while(1)
{
EN=1;
if(DATAPORT<0x80)
break;
EN=0;
}
EN=0;
}
/****************************************************
写LCM指令子函数
*****************************************************/
void WCODE(uchar C,uchar CSL,uchar CSR)
{
CS1=CSL; //C为指令,CSL/CSR为片选CS1/CS2
CS2=CSR;
lcd_BUSY();
RS=0;
RW=0;
DATAPORT=C;
EN=1;
EN=0;
}
/*****************************************************
写LCM数据子函数
*******************************************************/
void WDATA(uchar C,uchar CSL,uchar CSR)
{
CS1=CSL; //C为数据,CSL/CSR为片选CS1/CS2
CS2=CSR;
lcd_BUSY();
RS=1;
RW=0;
DATAPORT=C;
EN=1;
EN=0;
}
/********************************************************
设定起始行子函数
*********************************************************/
void SET_STARTLINE(uchar I)
{
I=0XC0+I; //I为起始行数
WCODE(I,1,1);
}
/********************************************************
定位X方向、Y方向子函数
*********************************************************/
void SET_XY(uchar X,uchar Y)
{
X=X+0X40; //设定X列的指令代码
Y=Y+0XB8; //设定Y页的指令代码
WCODE(X,1,1);
WCODE(Y,1,1);
}
/**********************************************************
屏幕开户关闭子函数
***********************************************************/
void DISON_OFF(uchar O)
{
O=O+0X3E; //O为1开,O为0关
WCODE(O,1,1);
}
/************************************************************
复位子函数
*************************************************************/
void RESET()
{
RST=0;
delay_US(20);
RST=1;
delay_US(20);
}
/**************************************************************
根据X、Y地址定位,将数据写入LCM或右半屏子函数
**************************************************************/
void LW(uchar X,uchar Y,uchar DD)
{
if(X>=64) //X/Y为坐标,DD为数据
{
SET_XY(X-64,Y);
WDATA(DD,0,1);
}
else
{
SET_XY(X,Y);
WDATA(DD,1,0);
}
}
/****************************************************************
显示汉字子函数
****************************************************************/
void DISPLAY_HZ(uchar XX,uchar YY,uchar N,uchar FB)
{
uchar I,DX; //XX/YY为列、页定位值,N为字码表中的
for(I=0;I<16;I++) //第N个汉字,FB为反白显示选项
{
DX=HZ[2*I+N*32];
if(FB)
DX=255-DX;
LW(XX*8+I,YY,DX);
DX=HZ[(2*I+1)+N*32];
if(FB)
DX=255-DX;
LW(XX*8+I,YY+1,DX);
}
}
/******************************************************************
LCM初始化子函数
*******************************************************************/
void lcd_INIT(void)
{
uchar X,Y;
RESET();
SET_STARTLINE(0);
DISON_OFF(0);
for(Y=0;Y<8;Y++)
{
for(X=0;X<128;X++);
LW(X,Y,0);
}
DISON_OFF(1);
}
void MAIN()
{
lcd_INIT();
while(1)
{
LW(0,0,25);
}
}
[ 此帖被553849186在2010-12-18 09:21重新编辑 ] |