TFTLCD显示显存占用中提到的GRAM是显存吗

>> tftlcd.c
tftlcd.c ( 文件浏览 )
#include &COMM.H&
#include &font.h&
//液晶显示 淘宝超值27元的液晶
//加入了GRAM 读写的函数,可以读取指定GRAM的内容了
//正点原子@SCUT
//修改了数字显示函数TFT_ShowNum,可以支持自动识别数字范围.
//扩充显示范围到u32类型
//-----------------TFT端口定义----------------
#define TFT_RS (1&&0)
//数据/命令选择端口 PB0
#define TFT_WR (1&&1)
//数据端口
#define TFT_CS (1&&2)
//片选端口
#define TFT_LED (1&&2)
#define TFT_RST (1&&3)
#define TFT_RD (1&&4)
//时钟端口
#define TFT_RS_SET(x)
GPIOB-&ODR=(GPIOB-&ODR&~TFT_RS)|(x ? TFT_RS:0)
#define TFT_WR_SET(x)
GPIOB-&ODR=(GPIOB-&ODR&~TFT_WR)|(x ? TFT_WR:0)
#define TFT_CS_SET(x)
GPIOB-&ODR=(GPIOB-&ODR&~TFT_CS)|(x ? TFT_CS:0)
#define TFT_LED_SET(x)
GPIOA-&ODR=(GPIOA-&ODR&~TFT_LED) |(x ? TFT_LED:0)
#define TFT_RST_SET(x)
GPIOA-&ODR=(GPIOA-&ODR&~TFT_RST)|(x ? TFT_RST:0)
#define TFT_RD_SET(x)
GPIOA-&ODR=(GPIOA-&ODR&~TFT_RD) |(x ? TFT_RD:0)
//PC0~7,作为数据线
#define DATAOUT(x) GPIOC-&ODR=(GPIOC-&ODR&0xffffff00)|(x&0xff);//数据输出
#define DATAIN
GPIOC-&IDR&0//数据输入
//画笔颜色
POINT_COLOR=RED;//默认红色
BACK_COLOR=WHITE;//背景颜色.默认为白色
/*------------------------液晶说明------------------------------
液晶型号位置
大小:320*240
像素:65K色
VCCIO 2.7~3.3V
数据线操作电压:3.3V
颜色排列:以一个十六位的数存放一个点的颜色 RGB:565 即:最高五位为红色
灰阶.中间六位为绿色灰阶.最低五位为蓝色灰阶.
例如:0XF800 纯红色
0X07E0 纯绿色
0X001F 纯蓝色
----------------------------------------------------------------*/
//写8位数据函数
//用宏定义,提高速度.
#define TFT_WR_DATA(data){
TFT_RS_SET(1);\
TFT_CS_SET(0);\
DATAOUT(data);\
TFT_WR_SET(0);\
TFT_WR_SET(1);\
TFT_CS_SET(1);\
TFT_RS_SET(0);\
//写寄存器函数
void TFT_WR_REG(u8 data)
TFT_RS_SET(0);//写地址
TFT_CS_SET(0);
DATAOUT(data);
TFT_WR_SET(0);
TFT_WR_SET(1);
TFT_CS_SET(1);
TFT_RS_SET(1);
//写寄存器数据函数
//dbw:数据位数,1为16位,0为8位。
//index:寄存器编号
//输入:dbw 数据位数,1为16位,0为8位。
void TFT_WR_CMD(u8 dbw,u8 index,u16 val)
TFT_WR_REG(index);
if(dbw)TFT_WR_DATA(val&&8);
TFT_WR_DATA(val&0xff);
//写16位数据函数
void TFT_WR_Data16(u16 val)
TFT_WR_DATA(val&&8);
TFT_WR_DATA(val&0xff);
//POINT_COLOR:此点的颜色
void TFT_DrawPoint(u8 x,u16 y)
TFT_WR_CMD(0,0x2,x);//设置到原点
TFT_WR_CMD(1,0x3,y);
//TFT_WR_CMD(0,0x04,0xEF);
//结束列数(0~239)
//TFT_WR_CMD(1,0x05,0x013F);//结束行数(0~319)
TFT_WR_REG(0x0E);
TFT_WR_Data16(POINT_COLOR);
u16 Screen_Data[756];
//读取指定点的GRAM
unsigned int TFT_RD_GRAM(u8 x,u16 y)
TFT_WR_CMD(0,0x2,x);//设置到原点
TFT_WR_CMD(1,0x3,y);
TFT_WR_REG(0x0F);
GPIOC-&CRL=0X; //PC0-7 上拉输入
GPIOC-&ODR|=0X00FF;
//全部输出高
TFT_RS_SET(1);
TFT_CS_SET(0);
TFT_RD_SET(0);
TFT_RD_SET(1);
//丢弃第一个不确定的数
TFT_RD_SET(0);
TFT_RD_SET(1);
TFT_RD_SET(0);
TFT_RD_SET(1);
t+=DATAIN;
TFT_CS_SET(1);
TFT_RS_SET(0);
GPIOC-&CRL=0X; //PC0-7 输出
GPIOC-&ODR|=0X00FF;
//全部输出高
//从指定地址开始读取 42*18大小的方块
void READ_GRAM(u8 x,u16 y)
for(t=0;t&18;t++)
for(i=0;i&42;i++)
temp=(u16)t*42+i;
Screen_Data[temp]=TFT_RD_GRAM(x+i,y+t);
//恢复指定地址的数据
void RECOVER_GRAM(u8 x,u16 y)
for(t=0;t&18;t++)
for(i=0;i&42;i++)
temp=(u16)t*42+i;
POINT_COLOR=Screen_Data[temp];
TFT_DrawPoint(x+i,y+t);
//清屏函数
//全屏显示单色
void TFT_CLEAR(u16 color)
TFT_WR_CMD(0,0x2,0);//设置到原点
TFT_WR_CMD(1,0x3,0);
TFT_WR_CMD(0,0x04,239); //结束列数(0~239)
TFT_WR_CMD(1,0x05,319);//结束行数(0~319)
TFT_WR_REG(0x0E);
for(n=0;n&76800;n++)TFT_WR_Data16(color);//显示白色
SD_Init();//初始化SD卡,在意外拔出之后可以正常使用
//在指定区域内填充指定颜色
//区域大小:
(xend-xsta)*(yend-ysta)
void TFT_Fill(u8 xsta,u16 ysta,u8 xend,u16 yend,u16 color)
TFT_WR_CMD(0,0x2,xsta);//设置到原点
TFT_WR_CMD(1,0x3,ysta);
TFT_WR_CMD(0,0x04,xend);//结束列数(0~239)
TFT_WR_CMD(1,0x05,yend);//结束行数(0~319)
TFT_WR_REG(0x0E);
n=(u32)(yend-ysta+1)*(xend-xsta+1);
while(n--)TFT_WR_Data16(color);//显示所填充的颜色.
//恢复初始状态
TFT_WR_CMD(0,0x2,0);//设置到原点
TFT_WR_CMD(1,0x3,0);
TFT_WR_CMD(0,0x04,239);//结束列数(0~239)
TFT_WR_CMD(1,0x05,319);//结束行数(0~319)
//x1,y1:起点坐标
//x2,y2:终点坐标
void TFT_DrawLine(u8 x1, u16 y1, u8 x2, u16 y2)
if((x1==x2)&&(y1==y2))TFT_DrawPoint(x1, y1);
else if(abs(y2-y1)&abs(x2-x1))//斜率大于1
for(y=y1;y&y2;y++)//以y轴为基准
x=(u32)(y-y1)*(x2-x1)/(y2-y1)+x1;
TFT_DrawPoint(x, y);
//斜率小于等于1
for(x=x1;x&=x2;x++)//以x轴为基准
y =(u32)(x-x1)*(y2-y1)/(x2-x1)+y1;
TFT_DrawPoint(x,y);
void TFT_DrawRectangle(u8 x1, u16 y1, u8 x2, u16 y2)
TFT_DrawLine(x1,y1,x2,y1);
TFT_DrawLine(x1,y1,x1,y2);
TFT_DrawLine(x1,y2,x2,y2);
TFT_DrawLine(x2,y1,x2,y2);
//在指定位置画一个指定大小的圆
//(x,y):中心点
void draw_circle(u8 x0,u16 y0,u8 r)
//判断下个点位置的标志
while(a&=b)
TFT_DrawPoint(x0-b,y0-a);
TFT_DrawPoint(x0+b,y0-a);
TFT_DrawPoint(x0-a,y0+b);
TFT_DrawPoint(x0-b,y0-a);
TFT_DrawPoint(x0-a,y0-b);
TFT_DrawPoint(x0+b,y0+a);
TFT_DrawPoint(x0+a,y0-b);
TFT_DrawPoint(x0+a,y0+b);
TFT_DrawPoint(x0-b,y0+a);
/***使用Bresenham算法画圆**/
if(di&0)di +=4*a+6;
di+=10+4*(a-b);
TFT_DrawPoint(x0+a,y0+b);
//画一个触摸点
//用来校准用的
void drow_touch_point(u8 x,u16 y)
TFT_DrawLine(x-12,y,x+13,y);//横线
TFT_DrawLine(x,y-12,x,y+13);//竖线
TFT_DrawPoint(x+1,y+1);
TFT_DrawPoint(x-1,y+1);
TFT_DrawPoint(x+1,y-1);
TFT_DrawPoint(x-1,y-1);
draw_circle(x,y,6);//画中心圈
//在指定位置显示一个字符
//num:要显示的字符:& &---&&~&
//size:字体大小 12/16
//mode:叠加方式(1)还是非叠加方式(0)
void TFT_ShowChar(u8 x,u16 y,u8 num,u8 size,u8 mode)
#define MAX_CHAR_POSX 232
#define MAX_CHAR_POSY 304
if(x&MAX_CHAR_POSX||y&MAX_CHAR_POSY)
//设定一个字符所占的大小
//开辟空间
TFT_WR_CMD(0,0x00,0x04);
TFT_WR_CMD(0,0x2,x);//
TFT_WR_CMD(1,0x3,y);
TFT_WR_CMD(0,0x04,x+(size/2-1)); //结束列数(0~239)
TFT_WR_CMD(1,0x05,y+size-1);//结束行数(0~319)
TFT_WR_REG(0x0E);
num=num-' ';//得到偏移后的值
if(!mode) //非叠加方式
for(pos=0;pos&pos++)
if(size==12)temp=asc2_1206[num][pos];//调用1206字体
else temp=asc2_1608[num][pos];
//调用1608字体
for(t=0;t&size/2;t++)
if(temp&0x01)TFT_WR_Data16(POINT_COLOR);
else TFT_WR_Data16(BACK_COLOR);
}else//叠加方式
for(pos=0;pos&pos++)
if(size==12)temp=asc2_1206[num][pos];//调用1206字体
else temp=asc2_1608[num][pos];
//调用1608字体
for(t=0;t&size/2;t++)
if(temp&0x01)TFT_DrawPoint(x+t,y+pos);//画一个点
//恢复窗体大小
TFT_WR_CMD(0,0x04,239);//结束列数
TFT_WR_CMD(1,0x05,319);//结束行数
//在指定位置显示一个大字符
//30*60大小的
//:/./C这三个字符
void TFT_ShowBigChar(u8 x,u16 y,u8 num)
TFT_WR_CMD(0,0x2,x);//设置到原点
TFT_WR_CMD(1,0x3,y);
TFT_WR_CMD(0,0x04,x+29);//结束列数(0~239)
TFT_WR_CMD(1,0x05,y+59); //结束行数(0~319)
if(num==':')t1=150;
else if(num=='.')t1=165;
else if(num=='C')t1=180;
else t1=15*
deadline=t1+15;
TFT_WR_REG(0x0E);
for(;t1&t1++)
for(n=0;n&16;n++)
temp=BIG_ASCII[t1][n];
for(t=0;t&8;t++)
if(temp&0x80) TFT_WR_Data16(POINT_COLOR);
else TFT_WR_Data16(BACK_COLOR);
if(((n%4)==3)&&t==5)
//恢复面板
TFT_WR_CMD(0,0x04,239);//结束列数(0~239)
TFT_WR_CMD(1,0x05,319); //结束行数(0~319)
//显示一个按钮,大小24*24
//0,&;1,&;
void TFT_ShowButton(u8 x,u16 y,u8 num)
TFT_WR_CMD(0,0x0,0x04);//扫描方式控制
TFT_WR_CMD(0,0x2,x);//设置到原点
TFT_WR_CMD(1,0x3,y);
TFT_WR_CMD(0,0x04,x+23);//结束列数(0~239)
TFT_WR_CMD(1,0x05,y+23); //结束行数(0~319)
deadline=t1+8;
TFT_WR_REG(0x0E);
for(;t1&t1++)
for(n=0;n&9;n++)
temp=Button_XX[t1][n];
for(t=0;t&8;t+
(文件超长,未完全显示,请下载后阅读剩余部分)
展开> <收缩
下载源码到电脑,阅读使用更方便
还剩0行未阅读,继续阅读 ▼
Sponsored links
源码文件列表
温馨提示: 点击源码文件名可预览文件内容哦 ^_^
1.28 kB15-12-08 11:12
2.42 kB06-06-09 18:15
40.79 kB26-05-09 21:27
26.00 B16-05-09 19:34
14.82 kB05-06-09 00:06
22.79 kB06-06-09 18:15
2.46 kB07-04-09 21:31
2.60 kB06-06-09 18:15
1.04 kB19-05-09 15:59
3.08 kB06-06-09 18:15
1.25 kB01-06-09 00:43
1.66 kB01-04-09 07:45
9.17 kB06-06-09 18:13
3.22 kB20-05-09 16:42
19.14 kB06-06-09 18:15
18.35 kB04-06-09 17:17
903.00 B22-04-09 17:50
123.79 kB31-03-09 21:43
1.34 kB08-04-09 22:51
2.14 kB19-05-09 15:17
18.37 kB06-06-09 18:15
8.99 kB18-04-09 21:05
42.04 kB31-03-09 16:49
23.48 kB06-06-09 18:15
934.00 B25-04-09 17:48
20.63 kB02-06-09 18:48
16.58 kB04-06-09 16:03
2.96 kB01-06-09 16:19
16.05 kB03-06-09 14:38
9.15 kB05-06-09 13:33
10.89 kB04-06-09 09:09
11.53 kB04-06-09 16:03
3.26 kB26-05-09 09:51
4.40 kB21-04-09 21:17
14.55 kB06-06-09 18:15
30.59 kB05-06-09 22:47
STM32F10xR.LIB1.68 MB23-09-08 09:21
15.26 kB06-06-09 18:15
7.77 kB19-04-09 19:30
9.53 kB06-06-09 18:17
649.00 B18-04-09 08:14
alarm.crf159.17 kB07-06-09 18:37
alarm.d1.51 kB07-06-09 18:37
alarm.o157.70 kB07-06-09 18:37
alarm.__i235.00 B07-06-09 18:37
calendar.crf156.43 kB07-06-09 18:37
calendar.d1.63 kB07-06-09 18:37
calendar.o153.12 kB07-06-09 18:37
calendar.__i247.00 B07-06-09 18:37
ebook.crf151.44 kB07-06-09 18:37
ebook.d1.51 kB07-06-09 18:37
ebook.o139.51 kB07-06-09 18:37
ebook.__i235.00 B07-06-09 18:37
fat.crf162.66 kB07-06-09 18:37
fat.d1.47 kB07-06-09 18:37
fat.o157.72 kB07-06-09 18:37
fm24c16.crf152.75 kB07-06-09 18:37
fm24c16.d1.60 kB07-06-09 18:37
fm24c16.o142.20 kB07-06-09 18:37
&FOXUSER.DBF&0.00 B24-05-09 08:19
&FOXUSER.FPT&0.00 B24-05-09 08:19
gui.crf156.94 kB07-06-09 18:37
gui.d1.45 kB07-06-09 18:37
gui.o155.27 kB07-06-09 18:37
gui.__i227.00 B07-06-09 18:37
jpegdecode.crf167.01 kB07-06-09 18:37
jpegdecode.d1.69 kB07-06-09 18:37
jpegdecode.o169.19 kB07-06-09 18:37
lrcpro.crf156.36 kB07-06-09 18:37
lrcpro.d1.54 kB07-06-09 18:37
lrcpro.o150.89 kB07-06-09 18:37
5.82 kB05-06-09 11:42
main.crf155.04 kB07-06-09 18:37
main.d1.55 kB07-06-09 18:37
main.o149.94 kB07-06-09 18:37
mmc_sd.crf158.47 kB07-06-09 18:37
mmc_sd.d1.57 kB07-06-09 18:37
mmc_sd.o151.09 kB07-06-09 18:37
MP3.axf363.39 kB07-06-09 18:37
MP3.hex321.72 kB07-06-09 18:37
257.06 kB07-06-09 18:37
MP3.lnp551.00 B07-06-09 18:37
MP3.map176.34 kB07-06-09 18:37
MP3.Opt6.22 kB18-11-11 18:56
MP3.plg183.00 B18-11-11 18:56
MP3.sct479.00 B06-04-09 18:43
MP3.tra2.28 kB07-06-09 18:37
MP3.Uv23.71 kB14-11-11 13:42
mp3player.crf156.16 kB07-06-09 18:37
mp3player.d1.63 kB07-06-09 18:37
mp3player.o151.55 kB07-06-09 18:37
mp3player.__i251.00 B07-06-09 18:37
MP3_Opt.Bak5.96 kB14-11-11 13:42
MP3_Target1.00 B2% 18-11-11
MP3_Uv2.Bak3.75 kB01-06-09 01:13
myiic.crf154.81 kB07-06-09 18:37
myiic.d1.54 kB07-06-09 18:37
myiic.o143.10 kB07-06-09 18:37
picture.crf152.12 kB07-06-09 18:37
picture.d1.57 kB07-06-09 18:37
picture.o141.04 kB07-06-09 18:37
picture.__i243.00 B07-06-09 18:37
pt2314.crf152.85 kB07-06-09 18:37
pt2314.d1.57 kB07-06-09 18:37
pt2314.o142.93 kB07-06-09 18:37
ptgame.crf157.11 kB07-06-09 18:37
ptgame.d1.54 kB07-06-09 18:37
ptgame.o153.36 kB07-06-09 18:37
ptgame.__i239.00 B07-06-09 18:37
radio.crf153.40 kB07-06-09 18:37
radio.d1.51 kB07-06-09 18:37
radio.o146.29 kB07-06-09 18:37
radio.__i235.00 B07-06-09 18:37
red.crf161.82 kB06-04-09 18:47
red.d1.67 kB06-04-09 18:47
3.76 kB15-12-08 00:16
red.o192.32 kB06-04-09 18:47
rgbled.crf151.80 kB07-06-09 18:37
rgbled.d1.54 kB07-06-09 18:37
rgbled.o139.32 kB07-06-09 18:37
rgbledplay.crf154.58 kB07-06-09 18:37
rgbledplay.d1.66 kB07-06-09 18:37
rgbledplay.o149.36 kB07-06-09 18:37
rgbledplay.__i255.00 B07-06-09 18:37
setting.crf154.47 kB07-06-09 18:37
setting.d1.57 kB07-06-09 18:37
setting.o148.87 kB07-06-09 18:37
setting.__i243.00 B07-06-09 18:37
STM32F10x.lst35.68 kB07-06-09 18:37
STM32F10x.o5.07 kB07-06-09 18:37
STM32F10x.s11.04 kB23-09-08 09:17
strtext.crf158.28 kB07-04-09 20:04
strtext.d1.74 kB07-04-09 20:04
strtext.o179.22 kB07-04-09 20:04
tea5767.crf154.09 kB07-06-09 18:37
tea5767.d1.60 kB07-06-09 18:37
tea5767.o144.99 kB07-06-09 18:37
temperate.crf153.32 kB07-06-09 18:37
temperate.d1.63 kB07-06-09 18:37
temperate.o142.40 kB07-06-09 18:37
text.crf160.41 kB07-06-09 18:37
text.d1.52 kB07-06-09 18:37
text.o151.65 kB07-06-09 18:37
text.__i231.00 B07-06-09 18:37
tftlcd.crf164.50 kB07-06-09 18:37
tftlcd.d1.57 kB07-06-09 18:37
tftlcd.o169.97 kB07-06-09 18:37
time.crf152.23 kB07-06-09 18:37
time.d1.48 kB07-06-09 18:37
time.o141.45 kB07-06-09 18:37
time.__i231.00 B07-06-09 18:37
touch.crf157.98 kB07-06-09 18:37
touch.d1.54 kB07-06-09 18:37
touch.o153.99 kB07-06-09 18:37
untogb.crf151.81 kB07-06-09 18:37
untogb.d1.58 kB07-06-09 18:37
untogb.o170.02 kB07-06-09 18:37
vs1003.crf170.81 kB23-04-09 08:36
vs1003.d1.76 kB23-04-09 08:36
vs1003.o183.44 kB23-04-09 08:36
vs1003x.crf158.51 kB07-06-09 18:37
vs1003x.d1.63 kB07-06-09 18:37
vs1003x.o153.04 kB07-06-09 18:37
vs1003x.__i246.00 B07-06-09 18:37
11.15 kB23-04-09 18:13
2.24 kB23-04-09 18:25
10.45 kB06-06-09 18:15
MP3PLAYER源程序.rar3.29 MB14-11-11 12:42
FONT12.FON191.67 kB08-01-07 15:18
FONT16.FON255.56 kB08-01-07 15:19
IMG00.bmp16.97 kB29-05-09 16:44
IMG01.bmp16.97 kB29-05-09 15:52
IMG02.bmp16.97 kB29-05-09 15:52
IMG03.bmp16.97 kB29-05-09 15:52
IMG04.bmp16.97 kB29-05-09 15:52
IMG05.bmp16.97 kB29-05-09 15:52
IMG06.bmp16.97 kB29-05-09 15:52
IMG07.bmp16.97 kB29-05-09 15:52
IMG08.bmp16.97 kB29-05-09 15:52
IMG09.bmp16.97 kB29-05-09 15:52
?'??.bmp152.35 kB29-05-09 15:51
IMG00.bmp16.97 kB31-05-09 13:19
IMG01.bmp9.63 kB31-05-09 13:22
IMG02.bmp9.63 kB31-05-09 13:22
IMG03.bmp9.63 kB31-05-09 13:22
IMG04.bmp9.63 kB31-05-09 13:22
IMG05.bmp9.63 kB31-05-09 13:22
IMG06.bmp9.63 kB31-05-09 13:22
IMG07.bmp9.63 kB31-05-09 13:22
IMG08.bmp9.63 kB31-05-09 13:22
IMG09.bmp9.63 kB31-05-09 13:22
IMG10.bmp9.63 kB31-05-09 13:22
IMG11.bmp9.63 kB31-05-09 13:22
IMG12.bmp9.63 kB31-05-09 13:22
IMG13.bmp9.63 kB31-05-09 13:22
IMG14.bmp9.63 kB31-05-09 13:22
IMG15.bmp9.63 kB31-05-09 13:22
IMG16.bmp9.63 kB31-05-09 13:22
?'??.bmp152.35 kB30-05-09 10:29
?'??.jpg26.33 kB31-05-09 13:20
IMG00.bmp16.97 kB30-05-09 11:08
IMG01.bmp6.03 kB30-05-09 11:10
IMG02.bmp6.03 kB30-05-09 11:10
IMG03.bmp6.03 kB30-05-09 11:10
IMG04.bmp6.03 kB30-05-09 11:10
IMG05.bmp6.03 kB30-05-09 11:10
IMG06.bmp6.03 kB30-05-09 11:10
IMG07.bmp6.03 kB30-05-09 11:10
IMG08.bmp6.03 kB30-05-09 11:10
IMG09.bmp6.03 kB30-05-09 11:10
IMG10.bmp6.03 kB30-05-09 11:10
IMG11.bmp6.03 kB30-05-09 11:10
IMG12.bmp6.03 kB30-05-09 11:10
IMG13.bmp6.03 kB30-05-09 11:10
IMG14.bmp6.03 kB30-05-09 11:10
IMG15.bmp6.03 kB30-05-09 11:10
IMG16.bmp6.03 kB30-05-09 11:10
IMG17.bmp6.03 kB30-05-09 11:10
IMG18.bmp6.03 kB30-05-09 11:10
IMG19.bmp6.03 kB30-05-09 11:10
IMG20.bmp6.03 kB30-05-09 11:10
IMG21.bmp6.03 kB30-05-09 11:10
IMG22.bmp6.03 kB30-05-09 11:10
IMG23.bmp6.03 kB30-05-09 11:10
IMG24.bmp6.03 kB30-05-09 11:10
IMG25.bmp6.03 kB30-05-09 11:10
?'??.bmp148.59 kB30-05-09 11:10
alarm.bmp10.60 kB15-04-09 21:59
book.bmp3.05 kB16-04-09 21:11
folder.bmp3.05 kB16-04-09 21:08
game.bmp10.60 kB15-04-09 21:59
light.bmp10.60 kB15-04-09 22:00
mus.bmp3.05 kB16-04-09 21:12
music.bmp10.60 kB15-04-09 22:00
pic.bmp3.05 kB16-04-09 21:14
picture.bmp10.60 kB15-04-09 22:00
radio.bmp10.60 kB15-04-09 22:00
setting.bmp10.60 kB15-04-09 22:01
time.bmp10.60 kB15-04-09 22:01
txt.bmp10.60 kB15-04-09 22:01
原理图.pdf353.94 kB14-11-11 12:39
字库及其它放在SD卡中的文件.rar836.92 kB14-11-11 12:42
&LEVEL1&0.00 B29-04-13 14:51
&LEVEL2&0.00 B29-04-13 14:51
&LEVEL3&0.00 B29-04-13 14:51
&DEVICES&0.00 B29-04-13 14:51
&FAT&0.00 B29-04-13 14:51
&GUI&0.00 B29-04-13 14:51
&JPEG&0.00 B29-04-13 14:51
&Lib&0.00 B29-04-13 14:51
&RTC&0.00 B29-04-13 14:51
&TXT&0.00 B29-04-13 14:51
&USER&0.00 B29-04-13 14:51
&VS1003&0.00 B29-04-13 14:51
&FONT&0.00 B29-04-13 14:51
&GAME&0.00 B29-04-13 14:51
&SYSICO&0.00 B29-04-13 14:51
&MP3PLAYER源程序&0.00 B29-04-13 14:51
&SYSTEM&0.00 B29-04-13 14:51
&用单片机制作MP3&0.00 B13-10-13 15:28
Sponsored links
评价成功,多谢!
下载用单片机制作MP3.rar
CodeForge积分(原CF币)全新升级,功能更强大,使用更便捷,不仅可以用来下载海量源代码马上还可兑换精美小礼品了
您的积分不足
支付宝优惠套餐快速获取 30 积分
10积分 / ¥100
30积分 / ¥200原价 ¥300 元
100积分 / ¥500原价 ¥1000 元
订单支付完成后,积分将自动加入到您的账号。以下是优惠期的人民币价格,优惠期过后将恢复美元价格。
支付宝支付宝付款
微信钱包微信付款
更多付款方式:、
您本次下载所消耗的积分将转交上传作者。
同一源码,30天内重复下载,只扣除一次积分。
鲁ICP备号-3 runtime:Elapsed:159.328ms 27.69
登录 CodeForge
还没有CodeForge账号?
Switch to the English version?
^_^"呃 ...
Sorry!这位大神很神秘,未开通博客呢,请浏览一下其他的吧1583人阅读
STM32(9)
&&&&& 液晶是什么?字模是什么?GBK是什么?gram是什么?HZK16是什么?bin是什么?汉字内码是什么?UNICODE又是什么?..
&&&&& 液晶真是小东西大学问,我是地道的门外汉,一块液晶,一个开发板,显示一个中文字,连个例也没有,好在有网络,从一篇文章里遇到一堆听都没听过的专业词汇,然后在从查找这些词汇的过程中遇到更多的词汇,真是张见识了。
&&&&& 感觉接触一个新事物,难度不在它本身的技术有多复杂,再高深的技术都是靠千千万万个逻辑组建起来的,只要静下心来理,总是能理出点头绪的。倒是一点概念都没有的时候最惶惑。而这个阶段的超级菜鸟也是举步维艰的,很多资料帖子都看不懂(不是似懂非懂,是一点都不懂~~),而一般人又没时间给超级菜鸟把一个个基础的概念解释清楚,更郁闷的是,市面上,海一般的教程资料又不一定合用。最终求助无门,要么望而怯步,放弃,要么硬啃。好在只要是有逻辑的东西,都是能啃的,虽然不好消化,但是绝对比别人告诉自己来得深刻,而且能培养探索新事物的能力。(当然,有时时间紧迫,不容许慢慢消化,还是赶紧求助好心高人的好。)
&&&&& 据说,液晶带中文字库能显示中文,那不带中文字库怎么显示啊?字库又长什么样呢?
static u8 GBK16[32];unsigned char *Read_One_GBK16(unsigned char *ch) { && unsigned int& temp1; && unsigned char temp2; && unsigned char *p; && p=&GBK16[0];&& temp1=* && temp2=*(ch+1); //有&能查,查到&歌&字GBK码为:0XB8E8,正好两个字节。// if(temp1&0x81||temp2&0x40)return 1;//不合法的汉字 && temp1-=0xa0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //计算汉字区码 //不懂&& temp2-=0xa0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //计算汉字位码&& temp1=((INT32U)(94*(temp1-1)+(temp2-1)))*32;&&& &//计算汉字在字库中的偏移地址&//& sector_offset = temp1/(512/32);//算出要读哪个扇区& 933&// byte_offset = (temp1%(512/32))*32;//算出要读扇区的哪个字节 //更不懂了&& f_open(&fii,"sys/HZK16.bin", FA_OPEN_EXISTING | FA_READ);&//f_open打开了一个&HZK16.bin&的文件啥东东~
&& f_lseek(&fii,temp1);&& f_read(&fii, GBK16, 32, &br);&& f_close(&fii);&//&& GBK_Buffer=&&}
&Read_One_GBK16&--&读一个GBK&同类的还有unsigned char *Read_One_GBK32(unsigned char *ch),
unsigned char *Read_One_GBK12(unsigned char *ch),
WCHAR *GBKTOUnicode(unsigned char *ch,啥是GBK啊?
百科说:&GBK: 汉字国标扩展码,基本上采用了原来所有的汉字及码位,并涵盖了原Unicode中所有的汉字20902,总共收录了883个, 21003个汉字及提供了1894个造字码位。 Microsoft简体版中文Windows 95就是以GBK为内码,又由于GBK同时也涵盖了Unicode所有CJK汉字,所以也可以和Unicode做一一对应。&
(&是不是可以理解为GBK是汉字在库中的一个编号?)
bin:百科说:&&bin (binary)其中文意思既是:二进制,二进制文件,其用途依系统或应用而定 。
  也就是说,一般来讲是机器代码,汇编语言编译后的结果,(DOS下汇编语言编译后与.com文件相类似),用debug、WINHEX,U_EDIT等软件打开(通常不一定能看得懂是些什么除非精通汇编语言)
  所有的文件, 无论是什么, 一律分为两种格式. text 和 binary.
  一种文件格式binary的缩写。一个后缀名为.bin的文件, 只是想表明它是binary格式.,但并不表明它与某种应用程序有必然的联系性&
(下了一个WINHEX,的确能打开^^,原来每个字对应的就是一堆数组,用网上下载的字模生成工具,生成也是一样的)
网友说:&以指定的方式建立字库 字库分3类 (1)&常用可见ASCII字&0-9,&A-Z及a-z,各种符号*#?()等&数字字库0-9&,这是XY长度为6*8点的 (2)&半角字符&0-9,A-Z&也是我们常用的数字和英文字符显示方式,占半个汉字大小,是8*16点。半角字符,就是指占汉字一一半大小 (3)&汉字字库常用HZK16(6763个汉字)&显然这是16*16的,&标准的全角字符 一般应用不建议采用第(1)项来显示数字与字母,一是字体太小,二是不便于和汉字混排,不好对齐。&
那这样就明了了,没有字库的话只要用工具(比如PCtoLCD2002.exe)把具体的字的&字模&(就是点点排成的数组),给函数,就不用上面的函数读库里的GBK了。(工具要选好,不然摸半天都摸不出来)
&},/*"歌"字,16*16*/
u8&song[]=&{0x01,0x00,0x5D,0x78,0x55,0x48,0x55,0x48,0x5D,0x7A,0x41,0x01,0x7F,0xFE,0x45,0x02,0x09,0x04,0x30,0x18,0xD7,0xE0,0x10,0x10,0x14,0x0C,0x18,0x07,0x10,0x02,0x00,0x00}
void Lcd_WriteChinese(u8 x,u8 y,u16 x_offset,u16 y_offset,u16 CharColor,u16 CharBackColor,u8 *ChineseCode,u8 mode){& u8 ByteCounter,BitC&&&& u8 *ChineseP& Lcd_SetBox(x*16,y*16,16,16,x_offset,y_offset);&&&&&&&& & Lcd_WR_Start();& ChinesePointer=Read_One_GBK16(ChineseCode); //这里用改为:ChinesePointer=&song[0];就可以用了。&&&&&&&&& for(ByteCounter=0; ByteCounter&32; ByteCounter++)
//这里连续写入了32个字节,那扫描应该是横扫了,而不是下面说的先上半个后下半个,生成字模的时候要注意。& { &&& for(BitCounter=0;BitCounter&8;BitCounter++)&&& {&&&&& if((*ChinesePointer & (0x80 && BitCounter)) == 0x00)&&&&& {&&&&&& Set_Rs;&&if(!mode)&&{&&&&& GPIOx-&ODR = CharBackC//DataToWrite(CharBackColor);&&&&&&& Clr_nWr;&&&&&&& Set_nWr; &&}&&&&& }&&&&& else&&&&& {&&&&&& Set_Rs;&&&&&& GPIOx-&ODR =CharC& //DataToWrite(CharColor);&&&&&&& Clr_nWr;&&&&&&& Set_nWr; &&&&& }&&&& &&& }&&& ChinesePointer++;& }& Set_Cs;& }
还有个问题,就是数组的存储方式,寄存器存储方式,液晶的扫描方式,怎一个乱字了得~~
取出汉字字库向LCD写屏的方式 液晶NOKIA5110的X,Y概念及写屏方式: 液晶5110由84点*48点组成。&可以看到,最多显示的半角字符是10*6个,&最多显示的汉字是5*3个 液晶5110的规格书上是这样描述它的写入坐标概念的,首先,每次写入命令是写一个竖着的8个bit即一个字节,这是它的一个最基本的写入元单元。(写入时先写高位,这一点对掌握整体概念不重要,先不讨论)。以这样的元单元为计数,屏幕整个被分成了84*6&个这样的元单元。
NOKIA5110的LCD的XY坐标概念
&写入一个汉字&一&,字模如下 /*--&&文字:&&一&&--*/ /*--&&宋体12;&&此字体下对应的点阵为:宽x高=16x16&&&--*/ 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 写入过程的函数一般是这样的: LCD_set_XY(row*8,&page);//&列,页& for(i=0;&i&16;i++)& { LCD_write_byte(pgm_read_byte(hanzi+c*32+i),1);& } &&&&LCD_set_XY(row*8,&page+1);//&列,页& for(i=16;&i&32;i++)& { LCD_write_byte(pgm_read_byte(hanzi+c*32+i),1); } 写入示意图如下:
NOKIA5110LCD写入汉字一的过程
&好了,现在问题来了,HZK16和&我们在5110LCD上用的字库是不同的组织方式,一个先行后列,&一个先上半部后下半部。如何转换?
&(我就显示一个字,直接用工具改字模更方便~这里学习下前辈改扫描方式的程序)
&----------------------------------------------------------- 为了让NOKIA5110直接用hzk16字库形式而不需要转换,&我们直接把hzk16转成适合Nokia5110的扫描方式, 关键代码段 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //2.将标准hzk16.bin的16*16的先行后列字模转换成NOKIA5110屏用的先刷汉字上半部分16列,再刷下半部分16列的方式(见文档) //add&hzk16fornokia5110.bin&write&routine&here FILE&*HZK1&=&0,&*HZK2&=&0; unsigned&long&offset1&=&0,&offset2&=0; if((HZK1=fopen("hzk16.bin",&"rb"))&==&NULL)&& {&& printf("Can't&Open&hzk16.bin/n");&& getchar();& return&0;& }&& if((HZK2=fopen("hzk16fornokia5110.bin",&"wb"))&==&NULL)&& {&& printf("Can't&Open&hzk16fornokia5110.bin/n");&& getchar();& return&0;& }&& offset1=0; unsigned&char&mat1[2][16],mat2[2][16]; //int&i,j,k,m; while(&!feof(HZK1)&) { fseek(HZK1,&offset1,&SEEK_SET); fread(mat1,&32,&1,&HZK1);& //mat1--&mat2 &&for(i=0;i&2;i++) &&{ for(j=0;j&8;j++) { &&for(k=0;k&8;k++)&//bit &&{ //mat2[0][j].bit[k]=&mat1[0][j*2].bit[7-k]; if(&bit_isset(mat1[i][k*2],(7-j))==1&) { bit_set(mat2[i][j],k); } else { bit_clr(mat2[i][j],k); } &&} } for(j=0;j&8;j++) { &&for(k=0;k&8;k++)&//bit &&{ //mat2[0][j+8].bit[k]=&mat1[0][j*2+1].bit[7-k]; if(&bit_isset(mat1[i][k*2+1],(7-j))==1) { bit_set(mat2[i][j+8],k); } else { bit_clr(mat2[i][j+8],k); } &&} } &&}//for(i=0;i&2;i++) //write&mat2 printf("write&offset:&%ld/n",offset1); fseek(HZK2,&offset1,&SEEK_SET); fwrite(mat2,32,1,HZK2); offset1+=32; }//while printf("I&find&the&feof()!=0!/n"); fclose(HZK1);& fclose(HZK2); //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&在函数里Lcd_WriteChinese用到Lcd_SetBox(x*16,y*16,16,16,x_offset,y_offset)&,内容如下,&&&&&&&&
&void Lcd_SetBox(u8 xStart,u16 yStart,u8 xLong,u16 yLong,u16 x_offset,u16 y_offset){& #if ID_AM==000&&& &Lcd_SetCursor(xStart+xLong-1+x_offset,yStart+yLong-1+y_offset);
#elif ID_AM==001&Lcd_SetCursor(xStart+xLong-1+x_offset,yStart+yLong-1+y_offset);&&&& #elif ID_AM==010&Lcd_SetCursor(xStart+x_offset,yStart+yLong-1+y_offset);&&&& #elif ID_AM==011 &Lcd_SetCursor(xStart+x_offset,yStart+yLong-1+y_offset);&&&& #elif ID_AM==100&Lcd_SetCursor(xStart+xLong-1+x_offset,yStart+y_offset);&&&& &&&& #elif ID_AM==101&Lcd_SetCursor(xStart+xLong-1+x_offset,yStart+y_offset);&&&& &&&& #elif ID_AM==110&Lcd_SetCursor(xStart+x_offset,yStart+y_offset); &&&& #elif ID_AM==111&Lcd_SetCursor(xStart+x_offset,yStart+y_offset);& &&&& #endif&&& &LCD_WR_REG(0x0050,xStart+x_offset);//水平 GRAM起始位置&LCD_WR_REG(0x0051,xStart+xLong-1+x_offset);//水平GRAM终止位置&LCD_WR_REG(0x0052,yStart+y_offset);//垂直GRAM起始位置&LCD_WR_REG(0x0053,yStart+yLong-1+y_offset);//垂直GRAM终止位置 }
void Lcd_SetCursor(u8 x,u16 y){ &LCD_WR_REG(0x20,x);&LCD_WR_REG(0x21,y);&&& }&
函数名:Lcd块选函数功能:选定Lcd上指定的矩形区域
应该是控制显示区域和定位的吧,现在汉字已经可以显示了,但是,是从右到左,而且x轴y轴混了,改了一下也没成功,咋整啊~~
好像位图显示也是镜像的,什么原因呢?~~
可以把字库和位图放在sd卡里,液晶从里面读不?跟gram有什么关系啊?(gram是什么~)
ILI9325是什么?跟用软件从屏中读出来的DeviceCode有什么关系呢?
液晶定时变暗,然后关闭,看屏的时候再用按键唤醒,跟手机屏幕一样,能么?
好像触摸屏这块儿也挺庞大的~
问题多多啊,菜鸟的道路很艰辛,但也很充实,菜并快乐着~
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:190185次
积分:1665
积分:1665
排名:千里之外
原创:18篇
转载:57篇
(1)(1)(2)(7)(12)(4)(14)(4)(3)(6)(1)(3)(1)(1)(5)(1)(10)}

我要回帖

更多关于 2k显示器 显存要求 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信