2917|2

1297

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

关于ATMEGA88V驱动SD卡在1.8寸彩屏H018IN01 V8上显示图片思路 [复制链接]

本帖最后由 gh131413 于 2014-2-28 10:04 编辑

这款板子已经到手了,由于源程序是GCC的,而本人用的ICCAVR,根据教程所提供的HEX文件编译后图片切换显示正常,但看源程序有太多不明白的地方:

TFT彩屏的技术规格书是全英文的且不详细,如何知道现在TFT的驱动方法及思路(不知道编写教程的人是什么方法)


#include          //头文件
#include "lcd.h"
#include "pic.h"

#define uchar unsigned char
#define uint  unsigned int
/**********************************************************
IO口初始化
**********************************************************/
void  io_init(void)
{
   DDRB=0xFF;       //置PB口输出
   PORTB=0xFF;      //上拉电阻
   DDRC=0xFF;       //置PC口输出
   PORTC=0xFF;      //上拉电阻
   DDRD=0xFF;       //置PD口输出
   PORTD=0xFF;      //上拉电阻
}
/*********************************************************
主程序
*********************************************************/
int  main(void)
{
   io_init();
   LCD_init();
   LCD_clear(7);
   LCD_color_H();        //8色彩条水平显示
   delayms(2000);
   LCD_color_V();        //8色彩条垂直显示
   delayms(2000);
   LCD_clear(7);
   LCD_color();          //8种颜色分别全屏显示
   
   LCD_ShowString(8,5,colors[4],"  WELCOME TO  ");
   LCD_ShowString(8,25,colors[0],"WWW.WILLAR.COM");
   
   ChineseChar(14,50,2,colors[0],1); //伟
   ChineseChar(38,50,2,colors[1],2); //纳
   ChineseChar(62,50,2,colors[2],3); //电
   ChineseChar(86,50,2,colors[3],4); //子
   
   pic_play(16,55,80,119,Image_pic);    //QQ小图片
   pic_play(72,111,80,119,Image_pic);   //QQ小图片
   LCD_ShowString(12,124,colors[0],"TELE:");
   LCD_ShowString(12,142,colors[2],"0775-84867757");
   while(1) ;   
}

H018IN01 V8.pdf

1.32 MB, 下载次数: 1

NT3915_V02.pdf

2.5 MB, 下载次数: 0

点赞 关注
 

回复
举报

1297

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
这是彩屏的程序:

/**********************************************************

file:  lcd.c

Author:          gguoqing

**********************************************************/

#include "lcd.h"
#include "Font8x16.h"
#include "Chinese.h"

#define  FREQ  8           //芯片工作频率

uint colors[]=
{
  0xf800,0x07e0,0x001f,0xffe0,0x0000,0x07ff,0xf81f,0xffff
};

/**********************************************************

N*ms延时函数

**********************************************************/
void delayms(uint n)
{
   uint i=0 ;
   for (i=0 ;i    _delay_loop_2(250*FREQ) ;
}

/**********************************************************

y*us延时函数

**********************************************************/
void delayus(uint y)
{
   _delay_loop_2(2*y);
}
/**********************************************************

写命令与数据子函数  (16位)

0: command    1: data

**********************************************************/
void LCD_Write(uchar type, uint value)  
{
   if(type == 0)
   LCD_RS_L;
   else
   LCD_RS_H;
       
   LCD_WR_L;
   LCD_DATA = (uchar)((value>>8)&0xff);
   LCD_WR_H;

   LCD_WR_L;
   LCD_DATA = (uchar)(value&0xff);
   LCD_WR_H;
}

/**********************************************************

写8位数据子函数

**********************************************************/
void  LCD_Write_Data8(uchar value)
{
   LCD_CS_L;
   LCD_RS_H;
   LCD_DATA = value;
   LCD_WR_L;
   LCD_WR_H;
   LCD_CS_H;
}

/**********************************************************

写16位数据子函数

**********************************************************/
void LCD_Wirte_Data16(uint value)   
{
   LCD_CS_L;
   LCD_RS_H;

   LCD_WR_L;   
   LCD_DATA = (uchar)((value>>8)&0xff);
   LCD_WR_H;

   LCD_WR_L;
   LCD_DATA = (uchar)(value&0xff);       
   LCD_WR_H;
   LCD_CS_H;
}

/*********************************************************

写寄存器子函数

**********************************************************/
void Reg_Write(uint reg,uint value)
{
   LCD_Write(TYPE_LCD_COMMAND,reg);
   LCD_Write(TYPE_LCD_DATA,value);
}

/**********************************************************

设置显示窗口子函数

**********************************************************/
void LCD_SetRamAddr(uint xStart, uint xEnd, uint yStart, uint yEnd)
{
   uint VerPos,HorPos,StartAddr;
   
   LCD_CS_L;
   HorPos    = (uint)((xEnd<<8)|xStart);
   VerPos    = (uint)((yEnd<<8)|yStart );
   StartAddr = (uint)((yStart<<8)|xStart);

   Reg_Write(0x16, HorPos);
   Reg_Write(0x17, VerPos);

   Reg_Write(0x21, StartAddr);                           // 0x21
   LCD_Write(TYPE_LCD_COMMAND,0x22);                // 0x22
   LCD_CS_H;
}

/**********************************************************

LCD初始化子函数

**********************************************************/
void  LCD_init(void)
{
   LCD_RST_L;
   delayms(20);
   LCD_RST_H;
   delayms(20);

   LCD_CS_H;
   LCD_RS_L;
   LCD_RD_H;
   LCD_WR_H;
   LCD_CS_L;
   delayms(10);
   
   Reg_Write(0x0007,0x0100);        // Display control GON=0,DTE=0,D1=0,D0=0,
   Reg_Write(0x000d,0x0000);        // Power control 4  PON=0
   Reg_Write(0x0000,0x0001);        // OSC Start
   delayms(20);
   Reg_Write(0x000e,0x2000);         // Power control 5 VCOMG=1
   Reg_Write(0x000c,0x0001);        // Power contorl 3 VCI=VDD , VCI1=VCI*1
   Reg_Write(0x000d,0x0003);        // Power control 4 éè?¨VLCD
   Reg_Write(0x0004,0x0000);        // Power control 2 CAD=0
   Reg_Write(0x000d,0x0903);        // Power control 4 ?ùéè?¨ VREG2OUT=-5.5*VCI
   Reg_Write(0x0003,0x0414);        // Power Control 1
   Reg_Write(0x000e,0x1212);              // Power control 5  éè?¨Vcom oí Vdv
   delayms(50);                       // VCOMH(3V~VREG1OUT) , VCOML(0.5~1V)

   Reg_Write(0x000d,0x031d);        // 0x318        // Power control 4  PON=1  VRL3~VRL0=1001 -->VREG2OUT=-5.5*VCI
                                                                // VRH3~VRH0=0011 -->VREG1OUT=1.65*REGP=4.62V , REGP=VCI1

   Reg_Write(0x0001,0x0113);        // Driver output contorl SM,GS,SS NL4~NL0=10011(1/176Duty)
   Reg_Write(0x0002,0x0700);        // LCD-Driving-waveform control  FLD1 FLD0 B/C EOR NW5~NW0=001101
   Reg_Write(0x0005,0x1030);        // Entry Mode RGB MODE , I/D1 I/D0=11
   Reg_Write(0x0006,0x0000);
   Reg_Write(0x000b,0x4001);
   Reg_Write(0x000f,0x0000);        // GATE SCAN POSITION  G17 Start scanf G17->G176

   Reg_Write(0x0011,0x0000);
   Reg_Write(0x0014,0x9F00);
   Reg_Write(0x0015,0x0000);
   Reg_Write(0x0016,0x7F00);        // Horizontal window address        128
   Reg_Write(0x0017,0x9F00);        // Vertical window Address        160
   Reg_Write(0x0021,0x0000);

   Reg_Write(0x0030,0x0000);
   Reg_Write(0x0031,0x0204);
   Reg_Write(0x0032,0x0302);
   Reg_Write(0x0033,0x0000);
   Reg_Write(0x0034,0x0504);
   Reg_Write(0x0035,0x0405);
   Reg_Write(0x0036,0x0707);
   Reg_Write(0x0037,0x0100);
   Reg_Write(0x003a,0x1506);
   Reg_Write(0x003b,0x000f);

   Reg_Write(0x0007,0x0005);
   Reg_Write(0x0007,0x0025);
   Reg_Write(0x0007,0x0027);
   Reg_Write(0x0007,0x0137);
   LCD_Write(TYPE_LCD_COMMAND,0x22);                // 0x22
   delayms(10);
   LCD_CS_H;
}

/**********************************************************

图片显示子函数

**********************************************************/
void  pic_play(uint xStart, uint xEnd, uint yStart, uint yEnd, const uchar *P)
{
   uint num,m;
   uint dx,dy;
   uchar temp;

   dx = (xEnd+1)-xStart;                  //计算写入数据的总数
   dy = (yEnd+1)-yStart;
   num = dx*dy<<1;

   LCD_SetRamAddr(xStart,xEnd,yStart,yEnd) ;

   for(m=0; m    {
     temp = (pgm_read_byte(P+m));
     LCD_Write_Data8(temp);
   }
}

/**********************************************************

清屏子函数

**********************************************************/
void  LCD_clear(uchar n)
{
   uint num;
   
   LCD_SetRamAddr(0,127, 0,159);
  
   for(num=20480;num>0;num--)          //160*128=20480
   {
     LCD_Wirte_Data16(colors[n]);
   }
}

/**********************************************************

彩屏显示子函数

**********************************************************/
void LCD_color(void)
{
   uint num;
   uchar n;

   for(n=0;n<8;n++)
   {
     LCD_SetRamAddr(0,127, 0,159);
         
     for(num=20480;num>0;num--)                 //160*128=20480
     {
       LCD_Wirte_Data16(colors[n]);
     }
     delayms(1000);
   }
}

/**********************************************************

  水平彩条显示子函数

**********************************************************/
void LCD_color_H(void)
{
   uint num;
   uchar n;
   
   LCD_SetRamAddr(0,127, 0,159);

   for(n=0;n<8;n++)
   {
     for(num=20*128;num>0;num--)
     {
       LCD_Wirte_Data16(colors[n]);
     }
   }
}

/**********************************************************

  垂直彩条显示子函数

**********************************************************/
void LCD_color_V(void)
{
   uint num;
   uint n,x1,x2;
   x1 = 0;
   x2 = 16;
   
   for(n=0;n<8;n++)
   {
            LCD_SetRamAddr(x1, x2-1, 0,159);
            x1 = x2;
            x2 = x2+16;

     for(num=16*160;num>0;num--)
     {
       LCD_Wirte_Data16(colors[n]);
     }
   }
}

/**********************************************************

  字符显示子函数

**********************************************************/
void LCD_ShowChar(uchar x,uchar y,uint color,uchar ch)
{      
   uchar temp;
   uchar pos,t;
   uchar  CHAR_W,CHAR_H;
   
   CHAR_W = 8;         //8*16
   CHAR_H = 16;

   if(x>(LCD_SIZE_X-CHAR_W)||y>(LCD_SIZE_Y-CHAR_H))
   return;
   
   LCD_SetRamAddr(x, x+CHAR_W-1, y,y+CHAR_H-1);
   ch = ch-32;                       //得到偏移后的值

   for(pos=0;pos    {
      temp= pgm_read_byte(&Font8x16[ch][pos]);
      
      for(t=0;t       {
            if(temp&0x80)
            LCD_Wirte_Data16(color);  //textcolor
            else
            LCD_Wirte_Data16(0xffff);  //backcolor
        temp<<=1;
      }
   }
}

/**********************************************************

显示字符串子函数

x,y:起点坐标  
*p:字符串起始地址

**********************************************************/
void LCD_ShowString(uchar x,uchar y,uint color,char *p)
{
   while(*p!='\0')
   {      
     LCD_ShowChar(x,y,color,*p);
     x+=8;
     p++;
   }
}

/**********************************************************

  写汉字子函数

**********************************************************/
void ChineseChar(uint x,uint y,int size,uint color,char c)
{
   int e=0,i,j;
   int  ed;
   
   uint  ncols = 0;
   uint  nrows = 0;
   uint  nbytes = 0;

   uchar *pfont;
   uchar *pchar;
   uchar *fonttable[]={(uchar *)hz12,(uchar *)hz16,(uchar *)hz24};
   
   pfont=(uchar *)fonttable[size];

   if(size==0)
   {
     ncols =12-1;
     nrows =12-1;
     nbytes =24;
   }
   else
   if(size==1)
   {
     ncols =16-1;
     nrows =16-1;
     nbytes =32;
   }
   else
   if(size==2)
   {
     ncols =24-1;
     nrows =24-1;
     nbytes =72;
   }
   
   pchar=pfont + (nbytes*(c-1));

   LCD_SetRamAddr(x, x+nrows, y,y+ncols);
   
   for(i=0;i    {
     ed=*pchar++;
         if(size==0)
         {
       if(i%2==0)
       e=8;
       else
       e=4;
         }
         else
         e=8;
     
     for(j=0;j      if((ed>>j)&0x01)
     {
       LCD_Wirte_Data16(color);  //textcolor
         }
     else
     {
       LCD_Wirte_Data16(0xffff);  //backcolor
         }
  }
}

/*********************************************************/
 
 
 

回复

1297

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
希望有用过类似的朋友说一下体会和心得
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
Microchip 直播|利用motorBench开发套件高效开发电机磁场定向控制方案 报名中!
直播主题:利用motorBench开发套件高效开发电机磁场定向控制方案
直播时间:2025年3月25日(星期二)上午10:30-11:30
快来报名!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表