搜索
bottom↓
回复: 14

AVRStudio+WinAVR代码生成的问题

[复制链接]

出0入0汤圆

发表于 2014-1-13 15:05:35 | 显示全部楼层 |阅读模式
终于开始折腾手上的几片LGT8F08A-16c了。先翻看论坛,按坛主的推荐,编译平台选择了AVRStudio+WinAVR,烧写器也是之前在论坛里邮购的。为了熟悉新东东,先按坛主的教程2烧了个流水灯,一次成功。紧接着移植了以前在CVAVR下编写的一个用M16采样小程序,修改了头文件及少量代码后,编译一次通过。还没来得及高兴,发现生的的代码下载后不能正常运行。反复检查了几遍,无奈回到CVAVR下将M16改成了M164P,修改头文件,编译...,重新回到AVRStudio+WinAVR下将hex文件烧写进LGT,竟然正常运行了现在有些犯昏,几乎一样的程序,难道AVRStudio+WinAVR生成了错误的代码?晚上上程序,请各位多多指导。

出0入0汤圆

发表于 2014-1-13 20:00:26 | 显示全部楼层
芯片型号一定要选M164,可用仿真器联调,找问题比较直观。

出0入0汤圆

 楼主| 发表于 2014-1-13 22:51:53 | 显示全部楼层
回楼上,我是按坛主的教程2里操作的 ,所选的芯片是M164P,没仔细去对比M164P与164头文件的差异。
晚上又发现一个更奇怪的问题:
     原代码中包含了一个6X8的字符点阵,用CVAVR生成的HEX文件烧录后,外接上96*68液晶能正常显示U,V,A以及0、1、2、3...等,但H、I、J字符不能正常显示。刚开始以为是字模点阵的问题,但将H、I、J等3个字模拷贝到字阵的其它位置时又能正确显示。将H、I、J位置的字符全部改为0x00或0xFF,显示也不正常,仿佛是在H、I、J这3个特定的位置,由于某种原因造成LGT不能正确写入。怀疑芯片坏了,于是花个半个小时重新焊了片LGT8F08A-16c上去,程序下载后问题依旧,这下真不明白是怎么回事了。

出0入0汤圆

 楼主| 发表于 2014-1-13 23:05:39 | 显示全部楼层
附上源程序,自己的程序写得很烂,请各位多多指教,另外感谢STMfans网友,1202字符字阵液晶驱动部分是照搬他的。
/*****************************************************
                 4 chanel Voltage-meter
Descript:可对5V以内的最多8路电压进行采样,并送至LCD1202实时显示。
         每路电压连续采样8次再取平均值,采样频率   ?? kHz.   
Chip type           : LGT8F08A_16C
Clock frequency     : 4.000000 MHz
Compiler: CVAVR
          AVRStudio+winavr
Author  :
Date    : 20140107
Version : original version  
*****************************************************/


#include <Mega164.h>
#include <iolgt8f0xa.h>
#include <delay.h>   
#include <font6x8.h>

/*******AD采样宏定义********/
#define ADC_VREF_TYPE 0x40
#define channel_num 4        //4路采样

/*********定义全局变量************/
unsigned int pin;               //定义采样针脚
unsigned char dis_buff[10];     //1202液晶96*68,每行最多显示16个6*8字符或12个8*16的字符
unsigned char x,y;             //1202坐标


/********LGT ADC config definition *****/
#define ADEN  7
#define ADSC  6
#define ADIF  4

/********1202LCD definition *****/
#define LCD_RES  4       //LCD复位引脚。
#define LCD_CS   5       //LCD片选引脚,只向1202写数据的话可以直接接电阻到地。
#define LCD_SDA  6       //LCD数据引脚 ,要先设置SDA,再发送SCK。
#define LCD_SCK  7       //LCD时钟引脚,上升沿时获取SDA引脚上的电平。
#define LCD_PORT  PORTD  //LCD连接MCU的端口,本例使用端口D。

#define LCD_RES_High() LCD_PORT|=(1<<LCD_RES)     //LCD各个引脚设置电平的宏定义
#define LCD_RES_Low()  LCD_PORT&=~(1<<LCD_RES)
#define LCD_CS_High()  LCD_PORT|=(1<<LCD_CS)
#define LCD_CS_Low()   LCD_PORT&=~(1<<LCD_CS)
#define LCD_SDA_High() LCD_PORT|=(1<<LCD_SDA)
#define LCD_SDA_Low()  LCD_PORT&=~(1<<LCD_SDA)
#define LCD_SCK_High() LCD_PORT|=(1<<LCD_SCK)
#define LCD_SCK_Low()  LCD_PORT&=~(1<<LCD_SCK)

/*NOKIA1202等低端手机液晶采用三线式接口,CS,SDA,SCK。
区别命令还是数据通过第一个BIT位识别,SDA为1,说明后面8BIT为数据;SDA为0,说明后面8BIT为命令。
完整一次数据为1BIT识别位+8BIT参数,个别命令是连续多个字节的,
其格式为1BIT识别位+第一字节8BIT参数 +第N字节8BIT参数.....*/

/*******向1202LCD发送命令*********/
void LCD_Write_Cmd (unsigned char Cmd)
{
   unsigned char i,j;
    LCD_SCK_Low();            //设置IO状态,可自行决定。      
    LCD_CS_Low();             //拉低CS。
   
    LCD_SDA_Low();            //将SDA拉低,代表后面的8BIT参数是命令。     
    LCD_SCK_High();           //SCK送出一个时钟。
    LCD_SCK_Low();   
    j=0x80;                   //二进制10000000。     
    for(i=0;i<8;i++)          //要发送8位,循环8次。
    {
        if(Cmd&j)                       
        {                                    
            LCD_SDA_High();        //SDA设置为1。
            LCD_SCK_High();         //SCK由之前的0转变为1,形成一个上升沿。
            LCD_SCK_Low();          //SCK再拉低,这样就送出一个时钟。
        }
        else                                    
        {
            LCD_SDA_Low();         //SDA设置为0。
            LCD_SCK_High();        //SCK由之前的0转变为1,形成一个上升沿。
            LCD_SCK_Low();         //SCK再拉低,这样就送出一个时钟。
        }
        j=j>>1;                           
    }
}

/*********向1202LCD发送数据函数*************/
void LCD_Write_Data (unsigned char Data)
{
    unsigned char i,j;
    LCD_SCK_Low();             //设置IO状态,可自行决定。         
    LCD_CS_Low();               //拉低CS。
   
    LCD_SDA_High();           //将SDA置高,代表后面的8BIT参数是数据。   
    LCD_SCK_High();            //SCK送出一个时钟。
    LCD_SCK_Low();
    j=0x80;                          //二进制10000000。   
    for(i=0;i<8;i++)             //要发送8位,循环8次。
    {
        if(Data&j)                 
        {                                    
            LCD_SDA_High();    //SDA设置为1。
            LCD_SCK_High();    //SCK由之前的0转变为1,形成一个上升沿。
            LCD_SCK_Low();     //SCK再拉低,这样就送出一个时钟。
        }
        else                                      
        {
            LCD_SDA_Low();     //SDA设置为0。   
            LCD_SCK_High();     //SCK由之前的0转变为1,形成一个上升沿。
            LCD_SCK_Low();       //SCK再拉低,这样就送出一个时钟。
        }
        j=j>>1;                           
    }
}

/*********1202LCD设置坐标***************/
void LCD_SET_XY(unsigned char x, unsigned char y)
{
    LCD_Write_Cmd(0xb0+y);                   //Set page address,设置页地址,范围:0xb0-0xb8。
    LCD_Write_Cmd(0x10 | ((x&0x7f)>>4));     //Set column address MSB,设置列地址高3位。
    LCD_Write_Cmd(0x0f & x);                 //Set column address LSB,设置列地址低4位。
}

/*********1202LCD显示英文6X8字符函数************/
void LCD_Show_Char6(unsigned char x, unsigned char y)
{
    unsigned char c,i,column;
    LCD_SET_XY(x,y);
    for(i=0;i<=8;i++)
    { c = dis_buff[i] - 0x20;
      for (column=0; column<6; column++)
       {   
          LCD_Write_Data(font6x8[c][column]);    //font6x8。
       }
    }
}

/*********1202LCD清屏函数******************/
void LCD_Clear(void)
{
    unsigned char i,j;
    LCD_SET_XY(0,0);   //设置坐标。
    for(i=0;i<9;i++)   
    {
        for(j=0;j<96;j++)   
        {
            LCD_Write_Data(0x00);
        }
    }
}

/*********1202LCD初始化******************/
void LCD_Init(void)
{
    LCD_RES_Low();          //拉低LCD复位引脚。
    delay_ms(10);
    LCD_RES_High();
    delay_ms(10);
   
    //delay_ms(10);
    //LCD_Write_Cmd(0x11);  //SoftReset,软件复位。
    //delay_ms(10);
   
    //LCD_Write_Cmd(0xa0);    //Segment driver direction select,方向开关。
    LCD_Write_Cmd(0xc0);    //    ???未知命令。
    LCD_Clear();
    LCD_Write_Cmd(0x2f);    //Power Control Set(2f=on/28=off),电源开关。
    LCD_Write_Cmd(0x90);    //Electronic volume,对比度。
    LCD_Write_Cmd(0xa6);    //Display normal/reverse(a6=nor/a7=rev),反显开关。
    LCD_Write_Cmd(0xb0);    //Page address set,b0-b8,页地址。
    LCD_Write_Cmd(0x10);    //Column address set,bit6,bit5,bit4, 列地址高三位。
    LCD_Write_Cmd(0x00);    //Column address set ,bit3,bit2,bit1,bit0,列地址低四位。
    LCD_Write_Cmd(0x40);    //Set initial display line,扫描起始线设置。
    LCD_Write_Cmd(0xc0);    //    ???未知命令
    LCD_Write_Cmd(0xa4);    //Display all points ON/OFF(24=off/a5=on),全显开关。
    LCD_Write_Cmd(0xaf);    //Display on/off(af=on/ae=off),显示开关。
}


/********AVR启动AD转换*********
unsigned int read_adc(void)
{
ADMUX=pin | (ADC_VREF_TYPE & 0xff);   
_mdelay_us(10);                 //mdelay needed for the stabilization of the ADC input voltage
ADCSRA|=0x40;                 //Start the AD conversion
while ((ADCSRA & 0x10)==0);   //Note the use of ";".For ADIF=0,AD is under processing,so nop.
ADCSRA|=0x10;                 //If ADIF=1,AD done,write ADIF "1" to clear ADIF flag.
return ADCW;                  //ADCW is one of pseudo 16bit registers of CVAVR compiler.
}
*/                       

/* LGT ADC */
unsigned int read_adc(void)
{
    unsigned int retval;
        
        DIDR0 = 0xFF;                //disable digital port
        ADMUX=pin | (ADC_VREF_TYPE & 0xff);   
        
        ADCSRA |= (1 << ADEN);   //enable ADC
        /*dummy read*/
        ADCSRA |= (1 << ADSC);   //enable conversion
        while(!(ADCSRA & (1 << ADIF)));
        ADCSRA |= (1 << ADIF);                  //clear ADC interrupt flag

        retval = ADCL;
        retval |= (ADCH << 8);
        /*available read*/
        ADCSRA |= (1 << ADSC);    //enable conversion
        while(!(ADCSRA & (1 << ADIF)));
        ADCSRA |= (1 << ADIF);                  //clear ADC interrupt flag

        retval = ADCL;
        retval |= (ADCH << 8);
        
        return retval;

}




/********AD采样值处理**********/
void adc_to_buff(void)
{unsigned int i,s=0;
    for(i=0;i<2;i++)   //抛弃前2次采样值
     read_adc();
    for(i=0;i<8;i++)
        {
          s+=read_adc();
        }
    s=s/8;             //8次采样值做平均值处理
  
   s=(int)(float)s*3300.0/1024.0;   
   
   if(pin%2==0)        //电流电压隔行显示,第一行显示U,第二行显示I...
    {dis_buff[0]='U';         
     dis_buff[8]='H';
     dis_buff[1]=pin/2+0x31;   //脚位显示,加0x31是为了从第1脚开始显示
    }
   else
    {dis_buff[0]='I';         
     dis_buff[8]='J';
     dis_buff[1]=pin/2+0x31;   
    }
   
   dis_buff[2]='=';  
   dis_buff[4]='.';                 
   
   dis_buff[3]=s/1000+0x30;      //ASCII
   dis_buff[5]=s/100%10+0x30;
   dis_buff[6]=s/10%10+0x30;
   dis_buff[7]=s%10+0x30;
   
}

/********采样值显示处理**********/
void disp(void)
{switch(pin)                       //确定各通道在1202液晶上的显示位置。
      {case(0):x=0,y=0;
                   break;
       case(1):x=0,y=1;
                   break;
       case(2):x=0,y=2;
                   break;        
       case(3):x=0,y=3;
                   break;        
       case(4):x=0,y=4;
                   break;
       case(5):x=0,y=5;
                   break;
       case(6):x=0,y=6;
                   break;
       case(7):x=0,y=7;
                   break;
       default:break;                  
      }
LCD_Show_Char6(x,y);
}

/*==============主程序==============*/  
void main(void)
{  
/*  PMCR = PMCR & 0x00;  //LGT时钟及频率选择,16MHz/4
  CLKPR |= (1 << CLKPCE);
  CLKPR |= (1 << CLKPS2);
  CLKPR &= ~(1 << CLKPCE);
*/
  PORTA=0x00;
  DDRA=0x00;

  PORTD=0xff;
  DDRD=0xff;

/******ADC initialization *******/
  DIDR0 = 0xFF;                 //disable digital port
  ADMUX=ADC_VREF_TYPE & 0xff;   // ADC Clock frequency: 125.000 kHz
  ADCSRA=0xA2;                  // ADC Voltage Reference: AVCC pin
  //SFIOR&=0x1F;                // ADC Auto Trigger Source: Free Running
  ADCSRB=0x40;
  
/******1202LCD initialization********/
  LCD_Init();

while(1)
  {
   for(pin=0;pin<channel_num;pin++)
     {
      adc_to_buff();
      disp();
      delay_ms(20);
     }
   pin=0;  
  }
}

出0入0汤圆

 楼主| 发表于 2014-1-13 23:11:11 | 显示全部楼层
/*font6x8.h*/
// 6 x 8 font
// 1 pixel space at left and bottom
// index = ASCII - 32
const unsigned char font6x8[][6]  =
{
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },   // sp
    { 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 },   // !
    { 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 },   // "
    { 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 },   // #
    { 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 },   // $
    { 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 },   // %
    { 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 },   // &
    { 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 },   // '
    { 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 },   // (
    { 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 },   // )
    { 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 },   // *
    { 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 },   // +
    { 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 },   // ,
    { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 },   // -
    { 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 },   // .
    { 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 },   // /
    { 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E },   // 0
    { 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 },   // 1
    { 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 },   // 2
    { 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 },   // 3
    { 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 },   // 4
    { 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 },   // 5
    { 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 },   // 6
    { 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 },   // 7
    { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 },   // 8
    { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E },   // 9
    { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 },   // :
    { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 },   // ;
    { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 },   // <
    { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 },   // =
        /*
    { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 },   // >
        */
        {0xFF,0xFF,0x7E,0x3C,0x18,0x00},// >
    { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 },   // ?
    { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E },   // @
    { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C },   // A
    { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 },   // B
    { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 },   // C
    { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C },   // D
    { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 },   // E
    { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 },   // F
    { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A },   // G
    { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F },   // H
    { 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 },   // I
    { 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 },   // J
    { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 },   // K
    { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 },   // L
    { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F },   // M
    { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F },   // N
    { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E },   // O
    { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 },   // P
    { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E },   // Q
    { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 },   // R
    { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 },   // S
    { 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 },   // T
    { 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F },   // U
    { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F },   // V
    { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F },   // W
    { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 },   // X
    { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 },   // Y
    { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 },   // Z
    { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 },   // [
    { 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 },   // 55
    { 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 },   // ]
    { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 },   // ^
    { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 },   // _
    { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 },   // '
    { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 },   // a
    { 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 },   // b
    { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 },   // c
    { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F },   // d
    { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 },   // e
    { 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 },   // f
    { 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C },   // g
    { 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 },   // h
    { 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 },   // i
    { 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 },   // j
    { 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 },   // k
    { 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 },   // l
    { 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 },   // m
    { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 },   // n
    { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 },   // o
    { 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 },   // p
    { 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC },   // q
    { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 },   // r
    { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 },   // s
    { 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 },   // t
    { 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C },   // u
    { 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C },   // v
    { 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C },   // w
    { 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 },   // x
    { 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C },   // y
    { 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 },   // z  
    { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 },    // horiz lines
        {0x0F,0x0F,0x0F,0x0F,0x00,0x00},/*"未命名文件",0*/
};

























出0入0汤圆

 楼主| 发表于 2014-1-13 23:17:06 | 显示全部楼层
再附上正常显示与异常显示的图片(手机拍的不清楚,见谅!)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-1-14 10:55:14 | 显示全部楼层
唉,这个版块人气太少,看样子折腾完手上几片LGT,还是转投STM去算了。

出0入0汤圆

发表于 2014-1-14 15:03:02 | 显示全部楼层
你检查下字库是编译到程序空间了,还是SRAM空间了? LGT8F08A的SRAM只有512字节,计算下是不是溢出了?

出0入0汤圆

发表于 2014-1-14 15:04:23 | 显示全部楼层
楼主如果产品上有技术问题,可以直接和我们联系,这样比较方便。QQ: 41245188

出0入0汤圆

发表于 2014-1-14 15:08:01 | 显示全部楼层
楼主如果是自己的小制作,建议你用LGT8F88A, 这个的兼容性好,SRAM是1KB,
样片可以从官网上申请。

出0入0汤圆

 楼主| 发表于 2014-1-14 17:30:30 来自手机 | 显示全部楼层
08A的flash不是8k么?我查看过hex的大小,7k+

出0入0汤圆

 楼主| 发表于 2014-1-14 17:33:52 来自手机 | 显示全部楼层
另外字符数组应该是烧到flash里的吧。

出0入0汤圆

发表于 2014-1-14 17:54:32 | 显示全部楼层
wwk1996 发表于 2014-1-14 17:30
08A的flash不是8k么?我查看过hex的大小,7k+

8K 是程序空间, RAM空间是512字节
你看看编译生产的map文件,看看数据段用了多少?

const这个限定有的需要编译器设置后才会放到程序空间,否则就是放到RAM里

出0入0汤圆

 楼主| 发表于 2014-1-15 08:37:10 | 显示全部楼层
多谢版主提醒。昨天看了一下,字符数据确实是在RAM里,而且大小刚好超了一点(560byte),修改之后就正常了。之前用CVAVR时一直是将“const写入flash”打上勾的,这次因为重建了工程,一时没留意。调试时也一度怀疑是溢出的问题,所以查看了一下编译后的hex大小是否在芯片flash大小范围内。
不过还是有一点不明白:按我理解,字符即使是存放在RAM中,也应该是按字母排列顺序依次存放的吧?我试过将H、I、J三个字符换到G或K的位置则能正常显示,也就是说恰好是在存放H、I、J这3个字符的位置处发生了变化。这里面还有什么原因么?比如RAM的某些特定位置有特殊用处?

出0入0汤圆

发表于 2014-1-15 09:51:51 | 显示全部楼层
wwk1996 发表于 2014-1-15 08:37
多谢版主提醒。昨天看了一下,字符数据确实是在RAM里,而且大小刚好超了一点(560byte),修改之后就正常了 ...

RAM还会用于程序的临时变量(从0地址开始向上),以及堆栈(从顶端开始向下分配)。
一旦溢出,程序在运行中调用子程序开辟堆栈,以及位临时变量分配空间,都有可能改掉字库的值。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-5 21:28

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

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