在不带字库的液晶屏上显示字母汉字,取得字摸偏大,于是用const放在flash里,但是,显示少量的字母没有问题,显示的字母数多了就乱码。下面是程序。
#include <avr/io.h>
#include <string.h>
#include <stdio.h>
#include <avr/sfr_defs.h>//包含BV位操作符
#define F_CPU 7372800
#include <util/delay.h>
#define LCD_W 480
#define LCD_H 272
#define uchar unsigned char
#define uint unsigned int
#define delay_us(x) _delay_us(x) //AVR GCC延时函数 x(us)
#define delay_ms(x) _delay_ms(x)
#define LCD_DataPortH PORTA //高8位数据口
#define LCD_DataPortL PORTC //低8位数据口
#define SET_LCD_RS   ORTD|=_BV(PD1) //数据/命令切换
#define CLR_LCD_RS   ORTD&=~_BV(PD1)
#define SET_LCD_WR   ORTD|=_BV(PD2) //写控制
#define CLR_LCD_WR   ORTD&=~_BV(PD2)
#define SET_LCD_RD   ORTD|=_BV(PD3) //读控制
#define CLR_LCD_RD   ORTD&=~_BV(PD3)
#define SET_LCD_CS   ORTD|=_BV(PD4) //片选
#define CLR_LCD_CS   ORTD&=~_BV(PD4)
#define SET_LCD_REST   ORTD|=_BV(PD5) //复位
#define CLR_LCD_REST   ORTD&=~_BV(PD5)
//画笔颜色
#define WHITE 0xFFFF
#define BLACK 0x0000
#define BLUE 0x001F
#define BRED 0XF81F
#define GRED 0XFFE0
#define GBLUE 0X07FF
#define RED 0xF800
#define MAGENTA 0xF81F
#define GREEN 0x07E0
#define CYAN 0x7FFF
#define YELLOW 0xFFE0
#define BROWN 0XBC40 //棕色
#define BRRED 0XFC07 //棕红色
#define GRAY 0X8430 //灰色
#define DARKBLUE 0X01CF //深蓝色
#define LIGHTBLUE 0X7D7C //浅蓝色
#define GRAYBLUE 0X5458 //灰蓝色
#define LIGHTGREEN 0X841F //浅绿色
#define LGRAY 0XC618 //浅灰色(PANNEL),窗体背景色
#define LGRAYBLUE 0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE 0X2B12 //浅棕蓝色(选择条目的反色)
uint BACK_COLOR, POINT_COLOR; //背景色,画笔色
unsigned char const zimu[][64]={
/*"B",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0xFE,0x0F,0x0E,0x1E,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x1C,0xFE,0x0F,0xFE,0x0F,0x0E,0x1E,0x0E,0x38,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x38,0x0E,0x3C,0xFE,0x1F,0xFE,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*"D",1*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x01,0xFE,0x07,0x8E,0x0F,0x0E,0x1E,0x0E,0x3C,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x1C,0x0E,0x1F,0xFE,0x0F,0xFE,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*"/",2*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x20,0x00,0x30,0x00,0x10,0x00,0x18,0x00,0x0C,0x00,0x04,0x00,0x06,0x00,0x02,0x00,0x03,0x00,0x01,0x80,0x01,0xC0,0x00,0xC0,0x00,0x60,0x00,0x20,0x00,0x30,0x00,0x10,0x00,0x18,0x00,0x08,0x00,0x0C,0x00,0x06,0x00,0x06,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*"G",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0xF0,0x0F,0x78,0x1C,0x38,0x38,0x1C,0x38,0x1C,0x38,0x0C,0x38,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x3F,0x0E,0x3F,0x0E,0x30,0x0E,0x30,0x1C,0x30,0x1C,0x30,0x1C,0x38,0x38,0x3C,0xF8,0x3F,0xE0,0x37,0x80,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*"P",4*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x07,0xFC,0x1F,0x1C,0x3E,0x1C,0x38,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x38,0x1C,0x3E,0xFC,0x1F,0xFC,0x07,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*"S",5*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0xF8,0x0F,0x3C,0x1E,0x1C,0x1C,0x1C,0x38,0x1C,0x38,0x1C,0x00,0x3C,0x00,0x78,0x00,0xF0,0x03,0xE0,0x07,0x00,0x1F,0x00,0x3E,0x00,0x38,0x00,0x38,0x0E,0x30,0x0E,0x30,0x1E,0x38,0x1C,0x3C,0xF8,0x1F,0xF0,0x0F,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*"A",6*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xE0,0x03,0xE0,0x07,0x60,0x07,0x70,0x06,0x70,0x0E,0x70,0x0E,0x30,0x0C,0x38,0x1C,0xF8,0x1F,0xF8,0x1F,0xFC,0x1F,0x1C,0x38,0x1C,0x38,0x0E,0x38,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*"C",7*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0xF0,0x1F,0x78,0x3C,0x38,0x38,0x1C,0x30,0x1C,0x70,0x1C,0x70,0x0E,0x70,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x70,0x0E,0x70,0x1C,0x70,0x1C,0x30,0x1C,0x38,0x38,0x3C,0xF0,0x1F,0xE0,0x0F,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*"N",8*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x38,0x1E,0x38,0x1E,0x38,0x3E,0x38,0x3E,0x38,0x7E,0x38,0x6E,0x38,0xEE,0x38,0xEE,0x38,0xCE,0x39,0xCE,0x39,0x8E,0x39,0x8E,0x3B,0x0E,0x3B,0x0E,0x3F,0x0E,0x3E,0x0E,0x3E,0x0E,0x3E,0x0E,0x3C,0x0E,0x3C,0x0E,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*"0",9*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0xF8,0x0F,0x38,0x1E,0x1C,0x3C,0x1C,0x38,0x0E,0x38,0x0E,0x30,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x38,0x1C,0x38,0x1C,0x38,0x3C,0x1C,0xF8,0x1F,0xF0,0x0F,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*"K",10*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x38,0x0E,0x3C,0x0E,0x1E,0x0E,0x0E,0x0E,0x07,0x8E,0x03,0xCE,0x03,0xCE,0x01,0xEE,0x00,0xFE,0x01,0xFE,0x01,0xBE,0x03,0x9E,0x03,0x0E,0x07,0x0E,0x07,0x0E,0x0E,0x0E,0x1E,0x0E,0x1C,0x0E,0x3C,0x0E,0x38,0x0E,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*":",11*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
unsigned char const hanzi[][128]={
/*"双",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xBF,0xFF,0x0F,0xFC,0xBF,0xFF,0x0F,0xFC,0x3F,0x06,0x0E,0x00,0x38,0x06,0x0E,0x00,0x38,0x06,0x0E,0x00,0x38,0x06,0x0E,0x10,0x38,0x06,0x06,0x38,0x18,0x06,0x06,0x70,0x18,0x0E,0x07,0xE0,0x1C,0x0E,0x07,0xE0,0x1D,0x0C,0x03,0xC0,0x0F,0x0C,0x03,0x80,0x0F,0x8C,0x03,0x00,0x0F,0x9C,0x03,0x00,0x1E,0xD8,0x01,0x00,0x1F,0xF8,0x01,0x00,0x3B,0xF8,0x00,0x80,0x73,0xF0,0x00,0x80,0xF1,0x70,0x00,0xC0,0xE1,0xF8,0x00,0xE0,0x40,0xFC,0x01,0xF0,0x00,0xDE,0x03,0x70,0x00,0x8F,0x07,0x3C,0x80,0x07,0x1F,0x18,0xE0,0x01,0x7E,0x00,0xF8,0x00,0x38,0x00,0x70,0x00,0x10,0x00,0x00,0x00,0x00,
/*"授",1*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x0E,0xE0,0xF0,0xFF,0x0F,0xE0,0xF0,0xFF,0x1F,0xE0,0xF0,0x00,0x00,0xE0,0x00,0x08,0x06,0xE0,0x40,0x0C,0x0E,0xE0,0xE0,0x1C,0x07,0xFE,0xC7,0x18,0x07,0xFE,0xC7,0x39,0x03,0xE0,0x80,0x88,0x03,0xE0,0xF0,0xFF,0x3F,0xE0,0xF0,0xFF,0x3F,0xE0,0x30,0x00,0x30,0xE0,0x32,0x00,0x30,0xE0,0x33,0x00,0x30,0xF0,0xC3,0xFF,0x07,0xFE,0xC0,0xFF,0x03,0xFE,0x80,0x83,0x03,0xE4,0x00,0x83,0x03,0xE0,0x00,0x87,0x01,0xE0,0x00,0xC7,0x01,0xE0,0x00,0xEE,0x00,0xE0,0x00,0x7C,0x00,0xE0,0x00,0x7C,0x00,0xE0,0x00,0x7C,0x00,0xE0,0x00,0xFF,0x01,0xF8,0xE0,0xC7,0x3F,0x78,0xF8,0x81,0x1F,0x18,0x70,0x00,0x1C,0x00,0x00,0x00,0x00,
/*"时",2*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0xFC,0x1F,0x00,0x07,0xFC,0x1F,0x00,0x07,0x1C,0x1C,0x00,0x07,0x1C,0x1C,0x00,0x07,0x1C,0xDC,0xFF,0x7F,0x1C,0xDC,0xFF,0x7F,0x1C,0x1C,0x00,0x07,0x1C,0x1C,0x00,0x07,0xFC,0x1F,0x00,0x07,0xFC,0x1F,0x02,0x07,0x1C,0x9C,0x03,0x07,0x1C,0x1C,0x07,0x07,0x1C,0x1C,0x0E,0x07,0x1C,0x1C,0x0E,0x07,0x1C,0x1C,0x1C,0x07,0x1C,0x1C,0x0C,0x07,0xFC,0x1F,0x00,0x07,0xFC,0x1F,0x00,0x07,0xFC,0x1F,0x00,0x07,0x1C,0x1C,0x00,0x07,0x1C,0x1C,0x00,0x07,0x1C,0x00,0x00,0x07,0x1C,0x00,0x00,0x07,0x00,0x00,0xE0,0x07,0x00,0x00,0xE0,0x03,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,
/*"系",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0xF8,0x0F,0xF0,0xFF,0xFF,0x1F,0xF0,0xFF,0x03,0x00,0x00,0xE0,0x01,0x00,0x00,0xE0,0x00,0x00,0x00,0x70,0xC0,0x00,0x00,0x38,0xF0,0x03,0x00,0x1E,0x78,0x00,0xC0,0x07,0x3C,0x00,0x80,0xFF,0x0F,0x00,0x80,0xFF,0x03,0x00,0x00,0xE0,0xC1,0x00,0x00,0x78,0xC0,0x03,0x00,0x1E,0x80,0x07,0xC0,0x0F,0x00,0x0F,0xE0,0xFF,0xFF,0x1F,0xE0,0xFF,0x7F,0x3C,0x00,0x00,0x03,0x18,0x00,0x00,0x03,0x00,0x00,0x01,0x83,0x00,0x80,0x07,0xC3,0x03,0xC0,0x03,0x83,0x07,0xE0,0x00,0x03,0x0F,0x70,0x00,0x03,0x1E,0x3C,0x00,0x03,0x3C,0x18,0xF0,0x03,0x18,0x00,0xF0,0x03,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
/*"统",4*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0xC0,0x00,0x38,0x00,0xC0,0x01,0x38,0x00,0xE0,0x00,0x30,0x00,0xE0,0xF0,0xFF,0x3F,0x70,0xF0,0xFF,0x3F,0x30,0xF0,0xFF,0x3F,0x38,0x0E,0x0C,0x00,0x18,0x0E,0x1C,0x00,0x1C,0x07,0x0E,0x00,0xFE,0x07,0x07,0x03,0xFC,0x03,0x83,0x07,0x80,0x81,0x01,0x07,0xC0,0xE1,0x01,0x0E,0xE0,0xE0,0xFF,0x1F,0x60,0xE0,0xFF,0x3D,0x70,0xD0,0xC6,0x08,0xF8,0x0F,0xC6,0x00,0xFC,0x0F,0xC6,0x00,0x78,0x00,0xC6,0x00,0x00,0x00,0xC6,0x00,0x00,0x00,0xC7,0x00,0x00,0x18,0xC7,0x00,0x80,0x9F,0xC3,0x10,0xFC,0x8F,0xC3,0x70,0xFC,0xC0,0xC1,0x30,0x1C,0xE0,0xC0,0x3F,0x00,0x78,0xC0,0x1F,0x00,0x30,0x80,0x0F,0x00,0x00,0x00,0x00,
};
void LCD_Writ_Bus(uchar VH,uchar VL) //并行数据写入函数
{
LCD_DataPortH=VH;
LCD_DataPortL=VL;
CLR_LCD_WR;
SET_LCD_WR;
}
void LCD_WR_DATA8(uchar VH,uchar VL) //发送数据-8位参数
{
SET_LCD_RS;
LCD_Writ_Bus(VH,VL);
}
void LCD_WR_DATA(uint da)
{
SET_LCD_RS;
LCD_Writ_Bus(da>>8,da);
}
void LCD_WR_REG(uint da)
{
CLR_LCD_RS;
LCD_Writ_Bus(da>>8,da);
}
//设置起始地址与结束地址
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
{
LCD_WR_REG(0x02);//开始y
LCD_WR_DATA(y1);
LCD_WR_REG(0x03);//开始x
LCD_WR_DATA(x1);
LCD_WR_REG(0x06);//结束y
LCD_WR_DATA(y2);
LCD_WR_REG(0x07);//结束x
LCD_WR_DATA(x2);
LCD_WR_REG(0x0f);
}
void Lcd_Init(void)
{
SET_LCD_RD;
SET_LCD_WR;
CLR_LCD_REST;
delay_ms(8); //此处保证要有5ms以上才能保证复位稳定,推荐8ms
SET_LCD_REST;
delay_ms(8); //此处保证要有5ms以上才能保证复位稳定,推荐8ms
CLR_LCD_CS; //打开片选使能
LCD_WR_REG(0x01); //打开背光
LCD_WR_DATA(16);
}
void LCD_Clear(uint Color) //清屏函数,Color:要清屏的填充色
{
uchar VH,VL;
uint i,j;
VH=Color>>8;
VL=Color;
Address_set(0,0,LCD_W-1,LCD_H-1);
for(i=0;i<LCD_W;i++)
{
for (j=0;j<LCD_H;j++)
{
LCD_WR_DATA8(VH,VL);
}
}
}
void LCD_DrawPoint(uint x,uint y)
{
Address_set(x,y,x,y);//设置光标位置
LCD_WR_DATA(POINT_COLOR);
}
void showhanzi(unsigned int x,unsigned int y,unsigned char dat)
{
unsigned char i,j,m=0;
Address_set(x,y,x+31,y+31); //设置区域 ;
for(j=0;j<128;j++)
{
for(i=0;i<8;i++)
{
if((hanzi[dat][m]&(1<<i))!=0)
{
LCD_WR_DATA(POINT_COLOR);
}
else
{
LCD_WR_DATA(BACK_COLOR);
}
}
m++;
}
}
void showzimu(unsigned int x,unsigned int y,unsigned char dat)
{
unsigned char i,j,m=0;
Address_set(x,y,x+15,y+31); //设置区域 ;
for(j=0;j<64;j++)
{
for(i=0;i<8;i++)
{
if((zimu[dat][m]&(1<<i))!=0)
{
LCD_WR_DATA(POINT_COLOR);
}
else
{
LCD_WR_DATA(BACK_COLOR);
}
}
m++;
}
}
int main()
{
DDRA=0XFF;
DDRB=0XFF;
DDRC=0XFF;
DDRD=0XFF;
Lcd_Init(); //初始化
LCD_Clear(LIGHTBLUE);
POINT_COLOR=BLACK;
BACK_COLOR=LIGHTBLUE;
showhanzi(220,20,0);
delay_ms(10);
showhanzi(256,20,1);
delay_ms(10);
showhanzi(292,20,2);
delay_ms(10);
showhanzi(328,20,3);
delay_ms(10);
showhanzi(364,20,4);
delay_ms(10);
showzimu(100,20,0);
showzimu(120,20,1);
showzimu(140,20,2);
showzimu(160,20,3);
showzimu(180,20,4);
showzimu(200,20,5);
showzimu(72,60,0);
showzimu(92,60,1);
showzimu(112,60,11);
showzimu(132,60,8);
showzimu(152,60,9);
showzimu(312,60,6);
showzimu(332,60,7);
showzimu(352,60,11);
showzimu(372,60,9);
showzimu(392,60,10);
showzimu(72,100,3);
showzimu(92,100,4);
showzimu(112,100,5);
showzimu(132,100,11);
showzimu(152,100,8);
showzimu(172,100,9);
showzimu(312,100,1);
showzimu(332,100,7);
showzimu(352,100,11);
showzimu(372,100,9);
showzimu(392,100,10);
}
|