pdb1985108 发表于 2009-5-11 10:49:06

根据魏坤程序的显示移动的正弦波形

/*************************************************************
**文件名:         command
**功能描述:       lcd驱动
**说明:         RA8802STC89C58RD+
**
**作者:          与狼为舞
**日前:                        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={                        //一个周期显示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;
unsigned char xdata lcd_buff=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;
                        else if(i==1)y=120-sine;
                        else if(i==2)y=120+sine;
                        else if(i==3)y=120+sine;
                        else y=120-sine;
                        temp=y;
               }
           }       
}

/************************************************************
** 函数名称:        Draw_wave
** 功能描述:         显示波形
** 输 入:                 无
** 输 出 :         无
** 全局变量:        无
** 调用模块:
**
** 作 者:
** 日 期:                 2009-5-5
**************************************************************/
void Draw_Wave(void)
{
/*        unsigned char i,j,k;
        int m,n,cl;
        k=temp;
           Draw_Point(x,temp,1);
        for(j=1;j<200;j++)
        {
                x+=1;
                Draw_Point(x,temp,1);
                m=temp;
                n=temp;
                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=temp;
        }
        temp=k;
*/


        unsigned char i,j,m,k,h,n;
        n=temp;
        for(j=0;j<25;j++)
        {
                m=0x80;
                for(i=j*8;i<(j+1)*8;i++)
                {
                        k=temp;
                        lcd_buff=(lcd_buff|m);
                        if(i!=199)
                        {
                        if(temp<temp)
                        {
                                for(k=temp;k<temp;k++)
                                {
                                        lcd_buff=(lcd_buff|m);               
                                }
                        }
                        else
                        {
                                for(k=temp;k>temp;k--)
                                {
                                        lcd_buff=(lcd_buff|m);               
                                }       
                        }
                        m>>=1;
                        temp=temp;
                  }
                  }
                        for(h=0;h<240;h++)
                        {       
                                GotoXY(j,h);
                                LCD_DataWrite(lcd_buff);
                                lcd_buff=0;        
                        }
                }       
        temp=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();
       }
}
我有个问题,感觉波形刷新有闪动,是单片机速度不够快,还是液晶屏刷新速度慢?

gdrc 发表于 2009-5-11 12:48:17

好,最好弄个完整的项目上来,俺也想试试.手头正好有这种屏.

pdb1985108 发表于 2009-5-11 15:32:11

这是完整项目。点击此处下载 ourdev_444128.rar(文件大小:1.98M) (原文件名:示波器.rar)

90999 发表于 2009-5-11 21:29:29

这个是用来替代魏昆的M128 显示驱动部分吗? STC89C58RD+ 速度够吗?

zbh-avr 发表于 2009-5-15 11:22:52

魏坤的示波器程序,应该是使波形不移动的吧~

我的波形也是在移动。。

最好的效果应该是使波形停下来的吧

2nd090215 发表于 2009-7-23 23:08:45

关注并谢谢楼主
页: [1]
查看完整版本: 根据魏坤程序的显示移动的正弦波形