只是在前一个驱动程序上加了俩子函数。
#include <reg52.h>
#include <intrins.h>
#include <math.h>
//------------定义接口-------------//
sbit RS="P2"^5 ;
sbit RW="P2"^6 ;
sbit E="P2"^7 ;
sbit RES="P2"^1 ;
#define Lcd_Bus P1
// P1 接 LCM
#define uchar unsigned char
#define FIRST_ADDR 0
//定义字符/汉字显示起始位置
/*------------------检查忙位-----------------------------*/
void chk_busy()
{
RS="0" ;
RW="1" ;
E="1" ;
Lcd_Bus=0xff ;
while((Lcd_Bus&0x80)==0x80);
E="0" ;
}
/*------------------延时子程序-----------------------------*/
void delay(unsigned int t)
{
unsigned int i,j ;
for(i=0;i<t;i++)
for(j=0;j<10;j++);
}
/*------------------写命令到LCD------------------------------*/
void write_com(unsigned char cmdcode)
{
chk_busy();
RS="0" ;
RW="0" ;
E="1" ;
Lcd_Bus=cmdcode ;
delay(5);
//------------------在数据写入的时候加入适当的延时
E="0" ;
delay(5);
}
/*-------------------写数据到LCD----------------------------*/
void write_data(unsigned char Dispdata)
{
chk_busy();
RS="1" ;
RW="0" ;
E="1" ;
Lcd_Bus=Dispdata ;
delay(5);
//------------------在数据写入的时候加入适当的延时
E="0" ;
delay(5);
}
/*------------------初始化LCD屏--------------------------*/
void lcdreset()
{
delay(2000);
write_com(0x30);
delay(10);
//选择基本指令集
write_com(0x30);
//选择8bit数据流
delay(5);
write_com(0x0c);
//开显示(无游标、不反白)
delay(10);
write_com(0x01);
//清除显示,并且设定地址指针为00H
delay(500);
write_com(0x06);
//指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
delay(0);
}
/*------------------显示字符串--------------------------*/
void hzkdis(unsigned char code*s)
{
while(*s>0)
{
write_data(*s);
s++;
delay(50);
}
}
/*------------------首屏显示--------------------------*/
void ceshi()
{
write_com(0x01);
//清除显示,并且设定地址指针为00H
delay(5);
write_com(0x80);
//第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)
hzkdis("中国计量学院");
write_com(0x90);
//第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示)
hzkdis("光电学院");
write_com(0x88);
//第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示)
hzkdis("06光信2");
write_com(0x98);
//第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示)
hzkdis("测试程序");
}
//------------------清整个GDRAM空间----------------------------
void clrgdram()
{
unsigned char x,y ;
for(y=0;y<64;y++)
for(x=0;x<16;x++)
{
write_com(0x34);
write_com(y+0x80);
//行地址
write_com(x+0x80);
//列地址
write_com(0x30);
write_data(0x00);
write_data(0x00);
}
}
//------------------------------------------------------------
void clrscreen()
{
write_com(0x01);
delay(10);
}
unsigned char ReadByte(void)
{
unsigned char byReturnValue ;
chk_busy();
Lcd_Bus=0xff ;
RS="1" ;
RW="1" ;
E="0" ;
E="1" ;
byReturnValue="Lcd"_Bus ;
E="0" ;
return byReturnValue ;
}
//增加画点子程序
void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color)
{
unsigned char Row,Tier,Tier_bit ;
unsigned char ReadOldH,ReadOldL ;
write_com(0x34);
write_com(0x36);
Tier="X">>4 ;
Tier_bit=X&0x0f ;
if(Y<32)
{
Row="Y" ;
}
else
{
Row="Y-32" ;
Tier+=8 ;
}
write_com(Row+0x80);
write_com(Tier+0x80);
ReadByte();
ReadOldH="ReadByte"();
ReadOldL="ReadByte"();
write_com(Row+0x80);
write_com(Tier+0x80);
if(Tier_bit<8)
{
switch(Color)
{
case 0 :
ReadOldH&=(~(0x01<<(7-Tier_bit)));
break ;
case 1 :
ReadOldH|=(0x01<<(7-Tier_bit));
break ;
case 2 :
ReadOldH^=(0x01<<(7-Tier_bit));
break ;
default :
break ;
}
write_data(ReadOldH);
write_data(ReadOldL);
}
else
{
switch(Color)
{
case 0 :
ReadOldL&=(~(0x01<<(15-Tier_bit)));
break ;
case 1 :
ReadOldL|=(0x01<<(15-Tier_bit));
break ;
case 2 :
ReadOldL^=(0x01<<(15-Tier_bit));
break ;
default :
break ;
}
write_data(ReadOldH);
write_data(ReadOldL);
}
write_com(0x30);
}
void main(void)
{
uchar i,j,colour=1 ;
// uint ADzhi;
RW="0" ;
lcdreset();
ceshi();
clrgdram();
delay(5000);
clrscreen();
for(i=4;i<124;i++)
{
j="35-27"*sin((i-4)*3.14/30);
//正弦波显示
DrawPoint(i,j,colour);
}
delay(5000);
while(1);
}
用户377235 2013-6-22 10:46
13510179723_912348475 2012-7-27 23:24
用户1548781 2012-7-27 09:25
用户403664 2012-7-23 10:35
13510179723_912348475 2012-7-21 23:39