STM32有FSMC(其实其他芯片基本都有类似的总线功能),FSMC的好处就是一旦设置好之后,WR、RD、DB0-DB15这些控制线和数据线,都是FSMC自动控制的。
打个比方,当在程序中写到:
*(volatile unsigned short int *)(0x60000000)=val
那么FSMC就会自动执行一个写的 *** 作,其对应的主控芯片的WE、RD这些脚,就会呈现出写的时序出来(即WE=0,RD=1),数据val的值也会通过DB0-15自动呈现出来(即FSMC-D0:FSMC-D15=val)。
地址0x60000000会被呈现在数据线上(即A0-A25=0,地址线的对应最麻烦,要根据具体情况来,好好看看FSMC手册)。
武汉 谷鑫科技专业从事单片机驱动TFT彩屏的研发和生产。下面是TFT6448BS-5.7模块的驱动程序:
sfr AUXR = 0x8e//////////////////////////////////注意增加该语句。
#include <reg51.h>
#include <absacc.h>
#define X_ADDR XBYTE[0x0000]
#define Y_ADDR XBYTE[0x0100]
#define CMD XBYTE[0x0200]
#define DAT XBYTE[0x0300]
unsigned char code zk[32] = {//请
0x00, 0x47, 0x20, 0x23, 0x00, 0xEF, 0x20, 0x23, //left
0x22, 0x23, 0x22, 0x23, 0x2A, 0x32, 0x22, 0x02,
0x48, 0xFC, 0x40, 0xF8, 0x40, 0xFE, 0x08, 0xFC, //right
0x08, 0xF8, 0x08, 0xF8, 0x08, 0x08, 0x28, 0x10}
unsigned char code picture[]
main()
{
unsigned int x,y,x2,y2
unsigned int i
unsigned char key,x1,y1,j,k,z,m,n,bright
AUXR = 0x02//////////////////////////////////注意增加该语句。
bright = 8
key = 0//////////////////////////////////////选择液晶屏型号
//0:TFT2432
//1:TFT3224
//2:TFT480234
//3:TFT480272
//4:TFT6448
//5:TFT8048
//6:TFT8060
//7:TFT8060
if(P13==4)
{
if(key==0){x2=240y2=320x1=6y1=16goto loop1}//x1/32,y1/20
if(key==1){x2=320y2=240x1=8y1=12goto loop1}
if(key==2){x2=480y2=240x1=12y1=12goto loop1}
if(key==3){x2=480y2=272x1=12y1=14goto loop1}
if(key==4){x2=640y2=480x1=16y1=24goto loop1}
if(key==5){x2=800y2=480x1=20y1=24goto loop1}
if(key==6){x2=800y2=600x1=20y1=30goto loop1}
if(key==7){x2=800y2=600x1=20y1=30goto loop1}//亮度测试
}
loop1:
bright--if(bright==255)bright=7
CMD = 0x06
DAT = bright
///////////////////////以下是清屏功能///////////////////////////////////////
//用红色清屏
CMD = 0x04DAT = 0xe0//背景色
CMD = 0x08//启动填充 *** 作
for(y=0y<260*12y++)//延时16.6毫秒
CMD = 0x00//退出填充 *** 作
///////////////////////以上是清屏功能///////////////////////////////////////
while(key==7)
{
for(bright=7bright!=255bright--)
{
CMD = 0x06
DAT = bright
for(y=0y<15y++){x=1while(x!=0)x++}
}
CMD = 0x20//关断显示,poweroff
for(y=0y<15y++){x=1while(x!=0)x++}
key = P1&0x07
}
for(y=0y<1y++){x=1while(x!=0)x++}
for(y=0y<1y++){x=1while(x!=0)x++}
//用红色清屏
CMD = 0x04DAT = 0x1c//背景色
CMD = 0x08//启动填充 *** 作
for(y=0y<260*12y++)//延时16.6毫秒
CMD = 0x00//退出填充 *** 作
for(y=0y<1y++){x=1while(x!=0)x++}
for(y=0y<1y++){x=1while(x!=0)x++}
//用红色清屏
CMD = 0x04DAT = 0x03//背景色
CMD = 0x08//启动填充 *** 作
for(y=0y<260*12y++)//延时16.6毫秒
CMD = 0x00//退出填充 *** 作
for(y=0y<1y++){x=1while(x!=0)x++}
for(y=0y<1y++){x=1while(x!=0)x++}
//用红色清屏
CMD = 0x04DAT = 0x00//背景色
CMD = 0x08//启动填充 *** 作
for(y=0y<260*12y++)//延时16.6毫秒
CMD = 0x00//退出填充 *** 作
for(y=0y<1y++){x=1while(x!=0)x++}
for(y=0y<1y++){x=1while(x!=0)x++}
//用红色清屏
CMD = 0x04DAT = 0xff//背景色
CMD = 0x08//启动填充 *** 作
for(y=0y<260*12y++)//延时16.6毫秒
CMD = 0x00//退出填充 *** 作
///////////////////////以上是清屏功能///////////////////////////////////////
for(y=0y<1y++){x=1while(x!=0)x++}
for(y=0y<1y++){x=1while(x!=0)x++}
///////////////////////以下是测试8点写功能///////////////////////////////////////
//8点写模式下清屏DAT=0
CMD = 0x02DAT=0xff//前景色
CMD = 0x04DAT=0x00//背景色
CMD = 0x01
for( y=0y<y2y++ )//用前景色清屏
{
X_ADDR = 0
X_ADDR = 0
Y_ADDR = y
if( ((key==1)|(key==2))==0 )Y_ADDR = y/256
for( x=0x<(x2/8)x++ )DAT=0x55
}
for(y=0y<1y++){x=1while(x!=0)x++}
for(y=0y<1y++){x=1while(x!=0)x++}
for( y=0y<y2y++ )//用背景色清屏
{
X_ADDR = 0
X_ADDR = 0
Y_ADDR = y
if( ((key==1)|(key==2))==0 )Y_ADDR = y/256
for( x=0x<(x2/8)x++ )DAT=0x0f
}
for(y=0y<1y++){x=1while(x!=0)x++}
for(y=0y<1y++){x=1while(x!=0)x++}
//8点写模式下写单色图片
CMD = 0x02DAT=0x00//前景色
CMD = 0x04DAT=0xff//背景色
CMD = 0x01
for (y=0y<80y++)
{
X_ADDR = 0
X_ADDR = 0
Y_ADDR = y
if( ((key==1)|(key==2))==0 )Y_ADDR = y/256
for ( n=0n<10n++) DAT = picture[y*10+n]
}
for(y=0y<1y++){x=1while(x!=0)x++}
for(y=0y<1y++){x=1while(x!=0)x++}
//8点写模式下写汉字
CMD = 0x02DAT=0x00//前景色
CMD = 0x04DAT=0xff//背景色
CMD = 0x01
for ( n=0n<=15n++ )
{
X_ADDR = 0
X_ADDR = 0
Y_ADDR = n
if( ((key==1)|(key==2))==0 )Y_ADDR = y/256
DAT = zk[n]
DAT = zk[n+16]
}
for(y=0y<1y++){x=1while(x!=0)x++}
for(y=0y<1y++){x=1while(x!=0)x++}
//以下是测试单点写
CMD = 0x00
i=0
for(j=0j<x1j++)//20,x/40
{for (z=0z<y1z++)//24,y/20
{for (k=0k<20k++)
{x=j*40
y=z*20+k
X_ADDR = x
if(key!=0)X_ADDR = x/256
Y_ADDR = y
if( ((key==1)|(key==2))==0 )Y_ADDR = y/256
for (m=0m<40m++)DAT = i
}
i++
}
}
for(y=0y<1y++){x=1while(x!=0)x++}
http://tieba.baidu.com/club/10621043/p/14619152
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)