avr 单片机怎么把数组放到flash里,不占用ram
我用的是gcc初学,希望大家多多帮助啊~~~unsignedcharLCDBUFF_A[128*8];//显示换冲区1unsignedcharLCDBUFF_B[128*...
我用的是gcc 初学,希望大家多多帮助啊~~~
unsigned char LCDBUFF_A[128*8];//显示换冲区1
unsigned char LCDBUFF_B[128*8];//显示换冲区2
我用的avr128,ram有4k, 这样的话ran就占用了2k了,我想把他放到flash里该怎么做呢,
//功能:在LCD指定位置显示一个字符或汉字
//说明:X水平坐标,Y行坐标,取值范围:0<X<128,0<Y<7.
//输入:X水平坐标,Y行坐标,反显1,正常0.
//输出:无
//------------------------------------------------------------------------------------------------------
void LCD_write_acsii_1212(unsigned char x, unsigned char y, unsigned char *str,unsigned char state)
{
unsigned char i ,ascii,c1,c2;
unsigned int j;
if ((*str)<128)//字母编码
{
ascii = (*str)-0x20;
if((x<=121)&&(y<=6))//防止越界
{
for (i=0;i<6;i++)
{
if (state==0)
LCDBUFF_A[y*128+x+i]=pgm_read_byte(i+ASC1212+(ascii * 12));
else
LCDBUFF_A[y*128+x+i]=~pgm_read_byte(i+ASC1212+(ascii * 12));
}
for (i=0;i<6;i++)
{
if (state==0)
LCDBUFF_A[(y+1)*128+x+i]=pgm_read_byte(i+6+ASC1212+(ascii * 12));
else
LCDBUFF_A[(y+1)*128+x+i]=~pgm_read_byte(i+6+ASC1212+(ascii * 12));
}
}//
}
else//汉字编码
{
if((x<=115)&&(y<=6))//防止越界
{
c1=(*str);c2=*(str+1);//读机内码
for (j=0;j<sizeof(GB_12)/sizeof(GB_12[0]);j++)
{
if(c1==pgm_read_byte_far(&GB_12[j].Index[0]) && c2==pgm_read_byte_far(&GB_12[j].Index[1]))
break; //汉字找到则跳出
}
if(j<sizeof(GB_12)/sizeof(GB_12[0]))//如果字模存在
{
for (i=0;i<12;i++)
{
if (state==0)
LCDBUFF_A[y*128+x+i]= pgm_read_byte_far(i+&GB_12[j].Msk[0]);
else
LCDBUFF_A[y*128+x+i]=~pgm_read_byte_far(i+&GB_12[j].Msk[0]);
}
for (i=0;i<12;i++)
{
if (state==0)
LCDBUFF_A[(y+1)*128+x+i]= pgm_read_byte_far(i+&GB_12[j].Msk[12]);
else
LCDBUFF_A[(y+1)*128+x+i]=~pgm_read_byte_far(i+&GB_12[j].Msk[12]);
}
}
}
}
}
我的邮箱 dpedison@sohu.com 展开
unsigned char LCDBUFF_A[128*8];//显示换冲区1
unsigned char LCDBUFF_B[128*8];//显示换冲区2
我用的avr128,ram有4k, 这样的话ran就占用了2k了,我想把他放到flash里该怎么做呢,
//功能:在LCD指定位置显示一个字符或汉字
//说明:X水平坐标,Y行坐标,取值范围:0<X<128,0<Y<7.
//输入:X水平坐标,Y行坐标,反显1,正常0.
//输出:无
//------------------------------------------------------------------------------------------------------
void LCD_write_acsii_1212(unsigned char x, unsigned char y, unsigned char *str,unsigned char state)
{
unsigned char i ,ascii,c1,c2;
unsigned int j;
if ((*str)<128)//字母编码
{
ascii = (*str)-0x20;
if((x<=121)&&(y<=6))//防止越界
{
for (i=0;i<6;i++)
{
if (state==0)
LCDBUFF_A[y*128+x+i]=pgm_read_byte(i+ASC1212+(ascii * 12));
else
LCDBUFF_A[y*128+x+i]=~pgm_read_byte(i+ASC1212+(ascii * 12));
}
for (i=0;i<6;i++)
{
if (state==0)
LCDBUFF_A[(y+1)*128+x+i]=pgm_read_byte(i+6+ASC1212+(ascii * 12));
else
LCDBUFF_A[(y+1)*128+x+i]=~pgm_read_byte(i+6+ASC1212+(ascii * 12));
}
}//
}
else//汉字编码
{
if((x<=115)&&(y<=6))//防止越界
{
c1=(*str);c2=*(str+1);//读机内码
for (j=0;j<sizeof(GB_12)/sizeof(GB_12[0]);j++)
{
if(c1==pgm_read_byte_far(&GB_12[j].Index[0]) && c2==pgm_read_byte_far(&GB_12[j].Index[1]))
break; //汉字找到则跳出
}
if(j<sizeof(GB_12)/sizeof(GB_12[0]))//如果字模存在
{
for (i=0;i<12;i++)
{
if (state==0)
LCDBUFF_A[y*128+x+i]= pgm_read_byte_far(i+&GB_12[j].Msk[0]);
else
LCDBUFF_A[y*128+x+i]=~pgm_read_byte_far(i+&GB_12[j].Msk[0]);
}
for (i=0;i<12;i++)
{
if (state==0)
LCDBUFF_A[(y+1)*128+x+i]= pgm_read_byte_far(i+&GB_12[j].Msk[12]);
else
LCDBUFF_A[(y+1)*128+x+i]=~pgm_read_byte_far(i+&GB_12[j].Msk[12]);
}
}
}
}
}
我的邮箱 dpedison@sohu.com 展开
3个回答
展开全部
你用什么软件呀 用AVR WIN的话可以这样定义
#include <avr/pgmspace.h>//加载头文件
const prog_uchar zifu[] = { //定义数组到FLASH
/* */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*! */
0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x18,0x18,0x00,0x00,
}
调用的时候 使用pgm_read_byte(zifu+i+16*asc)) 你可以看一下头文件或者相关的书籍
#include <avr/pgmspace.h>//加载头文件
const prog_uchar zifu[] = { //定义数组到FLASH
/* */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*! */
0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x18,0x18,0x00,0x00,
}
调用的时候 使用pgm_read_byte(zifu+i+16*asc)) 你可以看一下头文件或者相关的书籍
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询