搜索
bottom↓
回复: 5

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

[复制链接]

出0入0汤圆

发表于 2009-5-11 10:49:06 | 显示全部楼层 |阅读模式
/*************************************************************
**文件名:         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();
         }
}
我有个问题,感觉波形刷新有闪动,是单片机速度不够快,还是液晶屏刷新速度慢?

出0入0汤圆

发表于 2009-5-11 12:48:17 | 显示全部楼层
好,最好弄个完整的项目上来,俺也想试试.手头正好有这种屏.

出0入0汤圆

 楼主| 发表于 2009-5-11 15:32:11 | 显示全部楼层
这是完整项目。点击此处下载 ourdev_444128.rar(文件大小:1.98M) (原文件名:示波器.rar)

出0入0汤圆

发表于 2009-5-11 21:29:29 | 显示全部楼层
这个是用来替代魏昆的M128 显示驱动部分吗? STC89C58RD+ 速度够吗?

出0入0汤圆

发表于 2009-5-15 11:22:52 | 显示全部楼层
魏坤的示波器程序,应该是使波形不移动的吧~

我的波形也是在移动。。

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

出0入0汤圆

发表于 2009-7-23 23:08:45 | 显示全部楼层
关注并谢谢楼主
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-3 18:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表