fhy-123 发表于 2013-4-17 22:26:47

如何用stc12c5a60s2的eeprom保存显示在12864上的波形

我看过数据手册,大概明白eeprom的运用,保存一个数据就明白,但是保存波形就不明白了,因为波形是有很多数据的,而且12864的画点函数返回的值不是一个字节的数,不知道如何把波形数据写进去eeprom,下面我粘贴的是在12864上面显示波形的程序,怎样才能保存波形,希望有人指点一下,最好写一段程序(在哪里插入eeprom函数),这样易懂一点,拜托了。


//----------------在带字库12864屏上显示波形------------//
#include <stc12c5a60s2.h>
#include <intrins.h>
#include <math.h>
#include <eeprom.h>
//------------定义接口-------------//
sbit RS=P1^0 ;
sbit RW=P1^1 ;
sbit E=P1^2 ;
sbit RES=P1^4 ;
sfr Lcd_Bus=0xA0;
// 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("xxxx");
   
    write_com(0x90);
    //第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示)
    hzkdis("xxxxx");
   
    write_com(0x88);
    //第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示)
    hzkdis("xxxx");
   
    write_com(0x98);
    //第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示)
    hzkdis("xxxx");
}
//------------------清整个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) //12864字节读程序
{
    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 ;
    unsigned char i=0;
        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)                   //少于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                                                    //大于8位
    {
      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);
   
}

fhy-123 发表于 2013-4-17 22:44:39

我想说明一下,我想保存的不是一个点,而是所有点,即是整个波形

fhy-123 发表于 2013-4-17 22:46:55

保存这个波形

YS126 发表于 2013-4-17 22:55:50

最笨的办法,LZ既然你会保存一个数据(点),那你就每次只保存一个啊(快速的存N个)。 这样不是也都存了吗?

fhy-123 发表于 2013-4-18 23:05:30

没有人吗,想不到啊,{:cry:}

mbass51 发表于 2013-4-19 09:50:43

好易理解,用uchar條線,每條線只有一點坐標,save 128次就可以了

miaomiao1121 发表于 2014-8-7 09:28:29

你把点存进去一个多维的数组里面

laotui 发表于 2014-8-7 20:22:26

stc的eeprom其实是flash。这个数组擦除后连着写,之前搞清页的大小。

dongjiren2012 发表于 2014-8-8 16:07:40

没用过啊

uylor 发表于 2014-10-7 22:25:15

楼主有好办法了么,我也打算弄这个!EEPROM存储,12864加载显示!
页: [1]
查看完整版本: 如何用stc12c5a60s2的eeprom保存显示在12864上的波形