|
/*************************************************************
**文件名: command
**功能描述: lcd驱动
**说明: RA8802 STC89C58RD+
**
**作者: 与狼为舞
**日前: 2009-5-5
***************************************************************/
#include"STC89C51RC.h"
#include<intrins.h>
#define LCD_BUS P1
sbit LCD_WR = P3^1;
sbit LCD_RD = P3^3;
sbit LCD_CS = P3^4;
sbit LCD_RS = P3^0;
sbit LCD_RST = P3^7;
sbit LCD_BUSY = P3^5;
unsigned char code sine[50]={ //一个周期显示200个点80*sin(i*pi/100)
0 ,3 ,5 ,8 ,10,13,15,17,20,22,
25,27,29,32,34,36,39,41,43,45,
47,49,51,53,55,57,58,60,62,63,
65,66,68,69,70,71,72,73,74,75,
76,77,77,78,79,79,79,80,80,80
};
unsigned char xdata temp[200];
unsigned char xdata lcd_buff[240]=0;
/************************************************************
** 函数名称: delay
** 功能描述: 延迟子程序
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者:
** 日 期: 2009-5-5
**************************************************************/
void delay(unsigned int i)
{
int k;
for(k=0;k<i;k++);
}
/************************************************************
** 函数名称: LCD_ChkBusy
** 功能描述: 检查忙碌旗标子程序
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者:
** 日 期: 2009-5-5
**************************************************************/
void LCD_ChkBusy(void)
{
do
{
}
while(LCD_BUSY ==1);
}
/************************************************************
** 函数名称: LCD_CmdWrite
** 功能描述: 缓冲区写入子程序
** 输 入: cmdReg 缓存器地址 cmdData 缓存器数据
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者:
** 日 期: 2009-5-5
**************************************************************/
void LCD_CmdWrite(unsigned char cmdReg,unsigned char cmdData)
{
LCD_BUS=cmdReg;
LCD_CS=0;
LCD_RD=1;
LCD_RS=0;
LCD_WR=0;
LCD_WR=1;
LCD_RS=1;
LCD_CS=1;
LCD_BUS=cmdData;
LCD_CS=0;
LCD_RD=1;
LCD_RS=0;
LCD_WR=0;
LCD_WR=1;
LCD_RS=1;
LCD_CS=1;
}
/************************************************************
** 函数名称: LCD_DataWrite
** 功能描述: 写入数据至显示内存子程序
** 输 入: WrData 缓存器数据
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者:
** 日 期: 2009-5-5
**************************************************************/
void LCD_DataWrite(unsigned char WrData)
{
LCD_ChkBusy();
LCD_BUS=WrData;
LCD_CS=0;
LCD_RD=1;
LCD_RS=1;
LCD_WR=0;
LCD_WR=1;
LCD_RS=1;
LCD_CS=1;
}
/************************************************************
** 函数名称: LCD_DataRead
** 功能描述: 读出显示内存数据子程序
** 输 入: WrData 缓存器数据
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者:
** 日 期: 2009-5-5
**************************************************************/
unsigned char LCD_DataRead(void)
{
unsigned char DATA_Read;
LCD_BUS=0xff;
LCD_CS=0;
LCD_WR=1;
LCD_RS=1;
LCD_RD=0;
DATA_Read=LCD_BUS;
LCD_RD=1;
LCD_RS=1;
LCD_CS=1;
return DATA_Read;
}
/************************************************************
** 函数名称: LCD_Reset
** 功能描述: 重置子程序
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者:
** 日 期: 2009-5-5
**************************************************************/
void LCD_Reset(void)
{
LCD_BUS=0xff;
LCD_CS=0;
delay(1000);
LCD_RST=0;
delay(11000);
LCD_RST=1;
delay(1000);
}
/************************************************************
** 函数名称: LCD_CmdRead
** 功能描述: 缓存器读取子程序
** 输 入: cmdReg 缓存器地址
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者:
** 日 期: 2009-5-5
**************************************************************/
unsigned char LCD_CmdRead(unsigned char cmdReg)
{
unsigned char REG_Read;
LCD_ChkBusy();
LCD_BUS=cmdReg;
LCD_CS=0;
LCD_RD=1;
LCD_RS=1;
LCD_WR=0;
LCD_WR=1;
LCD_RS=1;
LCD_CS=1;
LCD_BUS=0xff;
LCD_CS=0;
LCD_WR=1;
LCD_RS=0;
LCD_RD=0;
REG_Read=LCD_BUS;
LCD_RD=1;
LCD_RS=1;
LCD_CS=1;
return REG_Read;
}
/************************************************************
** 函数名称: LCD_Clear
** 功能描述: 清除显示内存子程序
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者:
** 日 期: 2009-5-5
**************************************************************/
void LCD_Clear(void)
{
unsigned char READ_REG;
LCD_CmdWrite(0xE0,0x00);
READ_REG=LCD_CmdRead(0xF0);
READ_REG&=0xF7;
READ_REG|=0x08;
LCD_CmdWrite(0xF0,READ_REG);
delay(1000);
}
/************************************************************
** 函数名称: GotoXY
** 功能描述: 设定显示坐标(内存地址)子程序
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者:
** 日 期: 2009-5-5
**************************************************************/
void GotoXY(unsigned char x,unsigned char y)
{
LCD_CmdWrite(0x60,x);
LCD_CmdWrite(0x70,y);
}
/************************************************************
** 函数名称: LCD_Initial
** 功能描述: 定义所有缓存器的初始值
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者:
** 日 期: 2009-5-5
**************************************************************/
void LCD_Initial(void)
{
LCD_CmdWrite(0x00,0xC9);
// LCD_CmdWrite(0x01,0xF1);
// LCD_CmdWrite(0x02,0x10);
// LCD_CmdWrite(0x03,0x80);
LCD_CmdWrite(0x08,0x73);
LCD_CmdWrite(0x10,0x79);
// LCD_CmdWrite(0x11,0x22);
// LCD_CmdWrite(0x12,0x91);
LCD_CmdWrite(0x18,0x20);
LCD_CmdWrite(0x20,0x27);
LCD_CmdWrite(0x30,0xEF);
LCD_CmdWrite(0x40,0x00);
LCD_CmdWrite(0x50,0x00);
LCD_CmdWrite(0x28,0x27);
LCD_CmdWrite(0x38,0xEF);
LCD_CmdWrite(0x48,0x00);
LCD_CmdWrite(0x58,0x00);
/* LCD_CmdWrite(0x60,0x00);
LCD_CmdWrite(0x61,0x00);
LCD_CmdWrite(0x70,0x00);
LCD_CmdWrite(0x71,0x00);
LCD_CmdWrite(0x72,0xEF);
*/
LCD_CmdWrite(0x80,0x33);
// LCD_CmdWrite(0x81,0x00);
LCD_CmdWrite(0x90,0x06);
// LCD_CmdWrite(0x91,0x00);
LCD_CmdWrite(0xA0,0x11);
/* LCD_CmdWrite(0xA1,0x00);
LCD_CmdWrite(0xA2,0x00);
LCD_CmdWrite(0xA3,0x00);
LCD_CmdWrite(0xB0,0x27);
LCD_CmdWrite(0xB1,0xEF);
LCD_CmdWrite(0xC0,0xD0);
LCD_CmdWrite(0xC1,0x0A);
LCD_CmdWrite(0xC8,0x80);
LCD_CmdWrite(0xC9,0x80);
LCD_CmdWrite(0xCA,0x00);
LCD_CmdWrite(0xD0,0x0C);
*/
LCD_CmdWrite(0xE0,0x00);
LCD_CmdWrite(0xF0,0x90);
// LCD_CmdWrite(0xF1,0x0F);
}
/************************************************************
** 函数名称: PrintStr
** 功能描述: LCD显示字符串子程序
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者:
** 日 期: 2009-5-5
**************************************************************/
void PrintStr(char *ptr,int delay_time)
{
while(*ptr!='\0')
{
LCD_DataWrite(*ptr);
++ptr;
delay(delay_time);
}
}
/************************************************************
** 函数名称: line
** 功能描述: 画网格线
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块:
**
** 作 者:
** 日 期: 2009-5-5
**************************************************************/
void Line(void)
{
unsigned char i,k;
for(i=0;i<240;i++)
{
GotoXY(0,i);
LCD_DataWrite(0x80);
}
/* for(i=0;i<240;i+=2)
{
GotoXY(3,i);
LCD_DataWrite(0x02);
}
for(i=0;i<240;i+=2)
{
GotoXY(7,i);
LCD_DataWrite(0x08);
}
for(i=0;i<240;i+=2)
{
GotoXY(11,i);
LCD_DataWrite(0x20);
}
for(i=0;i<240;i++)
{
GotoXY(15,i);
LCD_DataWrite(0x80);
}
for(i=0;i<240;i+=2)
{
GotoXY(18,i);
LCD_DataWrite(0x02);
}
for(i=0;i<240;i+=2)
{
GotoXY(22,i);
LCD_DataWrite(0x08);
}
for(i=0;i<240;i+=2)
{
GotoXY(26,i);
LCD_DataWrite(0x20);
} */
for(i=0;i<240;i++)
{
GotoXY(30,i);
LCD_DataWrite(0x80);
}
for(k=0;k<240;k+=30)
{
for(i=0;i<30;i++)
{
GotoXY(i,k);
if(k==0||k==120)
{
LCD_DataWrite(0xff);
}
else
{
LCD_DataWrite(0xaa);
}
}
}
for(i=0;i<30;i++)
{
GotoXY(i,239);
LCD_DataWrite(0xff);
}
}
/************************************************************
** 函数名称: Draw_Point
** 功能描述: 画网格线
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块:
**
** 作 者:
** 日 期: 2009-5-5
**************************************************************/
void Draw_Point(unsigned int x,unsigned char y,bit status)
{
unsigned char m,n,LCD_Data;
m=x/8;
n=x%8;
n=128>>n;
GotoXY(m,y);
if(status)
LCD_Data=LCD_DataRead()|n;
else
{n=~n; LCD_Data=LCD_DataRead()&n;}
GotoXY(m,y);
LCD_DataWrite(LCD_Data);
}
/************************************************************
** 函数名称: Sin_wave
** 功能描述: 显示正波形
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块:
**
** 作 者:
** 日 期: 2009-5-5
**************************************************************/
void Sin_Wave(void)
{
unsigned char i,j,y;
for(i=0;i<5;i++)
{
for(j=0;j<50;j++)
{
if(i==0)y=120-sine[j];
else if(i==1)y=120-sine[49-j];
else if(i==2)y=120+sine[j];
else if(i==3)y=120+sine[49-j];
else y=120-sine[j];
temp[50*i+j]=y;
}
}
}
/************************************************************
** 函数名称: Draw_wave
** 功能描述: 显示波形
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块:
**
** 作 者:
** 日 期: 2009-5-5
**************************************************************/
void Draw_Wave(void)
{
/* unsigned char i,j,k;
int m,n,cl;
k=temp[0];
Draw_Point(x,temp[0],1);
for(j=1;j<200;j++)
{
x+=1;
Draw_Point(x,temp[j],1);
m=temp[j];
n=temp[j-1];
cl=m-n;
if((cl==0)|(cl==1)|(cl==-1)) continue;
else if(cl>1)
{
for(i=m-1;i>n;i--)
Draw_Point(x-1,i,1);
}
else
{
for(i=m+1;i<n;i++)
Draw_Point(x,i,1);
}
temp[j-1]=temp[j];
}
temp[200]=k;
*/
unsigned char i,j,m,k,h,n;
n=temp[0];
for(j=0;j<25;j++)
{
m=0x80;
for(i=j*8;i<(j+1)*8;i++)
{
k=temp;
lcd_buff[k]=(lcd_buff[k]|m);
if(i!=199)
{
if(temp<temp[i+1])
{
for(k=temp;k<temp[i+1];k++)
{
lcd_buff[k]=(lcd_buff[k]|m);
}
}
else
{
for(k=temp;k>temp[i+1];k--)
{
lcd_buff[k]=(lcd_buff[k]|m);
}
}
m>>=1;
temp=temp[i+1];
}
}
for(h=0;h<240;h++)
{
GotoXY(j,h);
LCD_DataWrite(lcd_buff[h]);
lcd_buff[h]=0;
}
}
temp[199]=n;
}
//主函数
#include"Command.c"
void main(void)
{
LCD_Reset();
LCD_Initial();
LCD_Clear();
LCD_CmdWrite(0x00,0xC5);
LCD_CmdWrite(0x10,0xE9);
//Line();
Sin_Wave();
while(1)
{
Draw_Wave();
}
}
我有个问题,感觉波形刷新有闪动,是单片机速度不够快,还是液晶屏刷新速度慢? |
|