23. LCD液晶显示实验

发布者:小星星龙猫最新更新时间:2017-11-09 来源: eefocus关键字:LCD  液晶显示 手机看文章 扫描二维码
随时随地手机看文章

一。 硬件连接

23. <wbr>LCD液晶显示实验

二。 LCD&lcddev结构体

LCD结构体在LCD.h中定义

23. <wbr>LCD液晶显示实验
23. <wbr>LCD液晶显示实验

访问LCD_REG,地址就是0x6C000000|0x000007FE,此时RS= 0,发送命令

访问完LCD_REG后,结构体指针自动加1,访问LCD_RAM,内部地址相应加2,此时RS= 1,发送数据

lcd_dev结构体介绍:

23. <wbr>LCD液晶显示实验
width和height为LCD的宽度和高度。

id为LCD的ID,比如9341等。

dir为LCD是竖屏还是横屏的标志,0为竖屏,1为横屏。

wramcmd为开始写gram指令。

setxcm为设置x坐标指令。

setycmd为设置y坐标指令。

例:对于id = 0x9341的LCD

//设置LCD显示方向函数这个函数会在LCD初始化的最后进行调用。

//dir = 0,竖屏,dir = 1,横屏

void LCD_Display_Dir(u8 dir)

{

if (dir == 0)  //竖屏

{

lcddev.dir = 0;   //竖屏

lcddev.width = 240;

lcddev.height = 320;

lcddev.wramcmd = 0x2C;

lcddev.setxcmd = 0x2A;

lcddev.setycmd = 0x2B;

}

else  //横屏

{

lcddev.dir = 1;  //横屏

lcddev.width = 320;

lcddev.height = 240;

lcddev.wramcmd = 0x2C;

lcddev.setxcmd = 0x2A;

lcddev.setycmd = 0x2B;

}

}

三。 底层接口函数

23. <wbr>LCD液晶显示实验
写寄存器内容函数是写寄存器值函数+写数据函数

//写寄存器函数

//regval:寄存器值 RS= 0

void LCD_WR_REG(u16 regval)

LCD->LCD_REG=regval;  //写入要写的寄存器序号   

}

//写 LCD 数据函数   RS= 1

//data:要写入的值  

void LCD_WR_DATA(u16 data)

{                       

LCD->LCD_RAM=data;     

}

//读 LCD 数据函数

//返回值:读到的值

u16 LCD_RD_DATA(void)

{                       

return LCD->LCD_RAM;     

}   

        

//写寄存器函数

//LCD_Reg:寄存器地址

//LCD_RegValue:要写入的数据

void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)

{  LCD->LCD_REG = LCD_Reg;              //写入要写的寄存器序号 

LCD->LCD_RAM = LCD_RegValue;           //写入数据         

}   

//读寄存器函数

//LCD_Reg:寄存器地址

//返回值:读到的数据

u16 LCD_ReadReg(u8 LCD_Reg)

{  LCD_WR_REG(LCD_Reg);                //写入要读的寄存器序号

delay_us(5);   

return LCD_RD_DATA();                //返回读到的值

}   

//开始写 GRAM函数

void LCD_WriteRAM_Prepare(void)

{

LCD->LCD_REG=lcddev.wramcmd;   

//LCD写GRAM

//RGB_Code:颜色值

void LCD_WriteRAM(u16 RGB_Code)

{    

LCD->LCD_RAM = RGB_Code;//写十六位GRAM

}

四。 初始化函数

23. <wbr>LCD液晶显示实验
FSMC设置:

  readWriteTiming.FSMC_AddressSetupTime = 0x01; //地址建立时间(ADDSET)为2个HCLK                                                                                                                1/36M=27ns

  readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD)模式A未用到

  readWriteTiming.FSMC_DataSetupTime = 0x0f;    // 数据保存时间为16个HCLK,因为液晶驱动IC的                                                                                                    读数据的时候,速度不能太快,尤其对1289这个IC。

  readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;

  readWriteTiming.FSMC_CLKDivision = 0x00;

  readWriteTiming.FSMC_DataLatency = 0x00;

  readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A 

    

  writeTiming.FSMC_AddressSetupTime = 0x00; //地址建立时间(ADDSET)为1个HCLK  

  writeTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(A

  writeTiming.FSMC_DataSetupTime = 0x03; ////数据保存时间为4个HCLK

  writeTiming.FSMC_BusTurnAroundDuration = 0x00;

  writeTiming.FSMC_CLKDivision = 0x00;

  writeTiming.FSMC_DataLatency = 0x00;

  writeTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A 

 

  FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;//  这里我们使用NE4 ,也就对应                                                                                                                              BTCR[6],[7]。

  FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数                                                                                                                                                             据地址

  FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;//                  FSMC_MemoryType_SRAM;  //SRAM   

  FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据                                                                                                                                                        宽度为16bit   

  FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable; 

  FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;

  FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable; 

  FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;   

  FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;  

  FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; //  存储器写                                                                                                                                                             使能

  FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;   

  FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 读写使用不同                                                                                                                                                       的时序

  FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; 

  FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //读写时序

  FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming;  //写时序

  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //初始化FSMC配置,使配置好的FSMC生效

  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);  //使能BANK1

注:readWirteTiming和writeTiming都是结构体指针

五。 坐标位置函数

23. <wbr>LCD液晶显示实验
先设置坐标的高8位,然后设置低8位。

六。 画点函数

23. <wbr>LCD液晶显示实验

七。 读点函数

//读取个某点的颜色值,读出的是RGB565的格式  

//x,y:坐标

//返回值:此点的颜色

u16 LCD_ReadPoint(u16 x,u16 y)

{

  u16 r=0,g=0,b=0;

if(x>=lcddev.width||y>=lcddev.height)return 0; //超过了范围,直接返回   

LCD_SetCursor(x,y);    

if(lcddev.id==0X9341||lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X1963)LCD_WR_REG(          0X2E);//9341/6804/3510/1963 发送读GRAM指令

else if(lcddev.id==0X5510)LCD_WR_REG(0X2E00); //5510 发送读GRAM指令

else LCD_WR_REG(0X22);       //其他IC发送读GRAM指令

if(lcddev.id==0X9320)opt_delay(2); //FOR 9320,延时2us    

  r=LCD_RD_DATA(); //dummy Read   

if(lcddev.id==0X1963)return r; //1963直接读就可以 

opt_delay(2);  

  r=LCD_RD_DATA();     //实际坐标颜色

  if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0X5510) //9341/NT35310/NT35510        要分2次读出

  {

opt_delay(2);  

b=LCD_RD_DATA(); 

g=r&0XFF; //对于9341/5310/5510,第一次读取的是RG的值,R在前,G在后,各占8位

g<<=8;

if(lcddev.id==0X9325||lcddev.id==0X4535||lcddev.id==0X4531||lcddev.id==0XB505||lcddev.id==0X         C505)return r; //这几种IC直接返回颜色值

else if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0X5510)return (((r>>11)<<11)|                       ((g>>10)<<5)|(b>>11));//ILI9341/NT35310/NT35510需要公式转换一下

else return LCD_BGR2RGB(r); //其他IC

}  

八。 字符显示函数

//在指定位置显示一个字符

//x,y:起始坐标

//num:要显示的字符:" "--->"~"

//size:字体大小 12/16/24

//mode:叠加方式(1)还是非叠加方式(0),叠加方式保持原来的底色,非叠加方式会把原来的底色填充掉。

23. <wbr>LCD液晶显示实验

void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)

{    

    u8 temp,t1,t;

u16 y0=y;

u8 csize=(size/8+((size%8)?1:0))*(size/2); //得到字体一个字符对应点阵集所占的字节数

  num=num-' ';//得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库)

for(t=0;t

{   

if(size==12)temp=asc2_1206[num][t]; //调用1206字体

else if(size==16)temp=asc2_1608[num][t]; //调用1608字体

else if(size==24)temp=asc2_2412[num][t]; //调用2412字体

else return; //没有的字库

for(t1=0;t1<8;t1++)

{    

if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);

else if(mode==0)LCD_Fast_DrawPoint(x,y,BACK_COLOR);

temp<<=1;

y++;

if(y>=lcddev.height)return; //超区域了

if((y-y0)==size)

{

y=y0;

x++;

if(x>=lcddev.width)return; //超区域了

break;

}

}    

}          

}   

23. <wbr>LCD液晶显示实验
生成方式用PCtoLCD2002完美版软件

23. <wbr>LCD液晶显示实验
ASCII字符的高度是宽度的一倍。2个ASCII就相当于一个汉字的宽度。


关键字:LCD  液晶显示 引用地址:23. LCD液晶显示实验

上一篇:22. LCD-FSMC原理简介
下一篇:24. 汉字显示实验

推荐阅读最新更新时间:2024-03-16 15:44

工程师笔记 | 驱动 8 位 8080 接口 LCD 时的字节序问题
前言 在一些图形界面应用中,系统架构会时常考虑使用FSMC接口来驱动8080接口的LCD屏。在MCU渲染完成,将framebuffer发送到LCD时,有可能会遇到存儲大小端的问题。STM32MCU都采用ARMCortex内核,内存使用小端格式。而intel8080接口的LCD在传输RGB数据时,使用的是大端格式。MCU在传输RGB数据时,字节序有可能不匹配。在图形界面应用中,像素格式一般会使用RGB888或RGB565。而在使用FSMC接口驱动8bit位宽的LCD时,很可能会使用RGB565格式。本文中会介绍两种方法来处理8bit8080接口RGB565格式图像数据字节序问题。 图像数据字节序 8bit8080 LCD在接收R
[单片机]
STM32 SPI驱动TFT LCD
利用STM32F030 的SPI驱动TFT LCD,我使用的LCD为240*320像素的2.4寸彩屏,驱动IC为ili9341,只需四根线即可点亮LCD,先贴上SPI配置吧,声明一下,F030的SPI配置和F103等的配置有些不一样 /*LCD SPI Init*/ void SPI_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; SPI_InitTypeDef SPI_InitStructure; /* Enable the SPI periph */ RCC_APB1PeriphClock
[单片机]
基于51单片机用DS1302和LCD1602设计可调式电子日历与时钟
具体功能实现: 开机后可以在LCD1602上显示当前的年、月、日、星期、时、分、秒等信息,按下K1键,可以显示实时时钟;按下K2键,选择对年、月、日、时、分、秒的设置;按下K3键,进行加设置;按下K4键,进行减设置; 使用器件: 仿真原理图: 仿真 知识介绍 : DS1302实时时钟芯片 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,并且具有闰年补偿等多种功能。工作电压为2.0V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的R
[单片机]
合泰单片机笔段式LCD显示程序+电路图
电路图: ;内容:5位LCD笔段式LCD显示 ;lcd接法SEG0-PD0...SEG7-PD7,SEG8-PE.0 ;COM0-PC0,COM1-PC1,COM2-PC6,COM3-PC7 ;完整源码下载:http://www.51hei.com/f/htbdlcd.rar include HT66F50.inc ds .section 'data' COM0 EQU PC.0 ;COM0管脚定义 COM1 EQU PC.1 ;COM0管脚定义 COM2 EQU PC.6 ;COM0管脚定义 COM3 EQU PC.7 ;COM0管脚定义 SEG EQU PD ;SEG管脚定义 SEG9 EQU PE.0 ;
[单片机]
合泰单片机笔段式<font color='red'>LCD</font>显示程序+电路图
飞思卡尔推出首款具有集成LCD驱动器的S08设备
低功率8位LC60 MCU为便携式应用提供3/5V的大波段液晶显示器支持,可多达160个波段 德国纽伦堡(2007年嵌入式世界大会) -飞思卡尔半导体推出了高度集成的、高能源效率的8位微控制器(MCU)设备系列,该系列为电子行业中最普遍的显示器技术液晶显示器(LCD)进行了优化。MC9S08LC60(LC60)系列具有飞思卡尔第一款基于S08的闪存MCU的特性,包括一个具有内部电荷泵的集成LCD驱动器模块。 飞思卡尔的LC60系列满足了便携式LCD应用、手持式消费类及工业设备的显示器、功率、存储器和通信需求。利用其对高达160(4x40)个段码显示器的支持,LC60 MCU使开发人员能够灵活地设计便携式医疗保健设备、恒温器
[新品]
基于T6963CFG的LCD在嵌入式系统中的应用
1 引 言   在 嵌入式 系统的研发和应用中,选择低价位、高性能的液晶显示设备一直是设计者追求的目标。中小型液晶显示器以其规格多、价位低以及非常适用于 嵌入式 系统"量身定制"的特点深受研发者的青睐。T6963CFG是TOSHIBA公司生产的一款LCD控制器,可用于不同规格的液晶显示器。深圳汉升公司生产的HS240128显示器采用了这款LCD控制器,其分辨率达240×128,带自扫描电路,具有文本显示、图形显示和图文混合显示功能。 2 T6963CFG控制命令及时序   T6963CFG是一款与大规模LCD驱动器和数据存储器配合使用的LCD控制器。该控制器有8条并行数据、读/写控制、模式选择以及亮度和背光控制等接口线,
[家用电子]
基于T6963CFG的<font color='red'>LCD</font>在嵌入式系统中的应用
AM MiniLED背光实现高对比度 LCD背光创新对抗OLED进攻
在2018年消费电子展(Consumer Electronics Show, CES)展会中,已出现MicroLED电视显示器的实体展示,为目前当红的OLED显示器带来不小的威胁。 然而,MicroLED若要正式量产还有重重技术难关必须突破。 在那之前,晶粒尺寸较小的MiniLED显示器将成为率先上市的产品,该显示技术也将应用于LCD的背光之中,为LCD屏幕增添性能。 近年来,由于有机发光二极管(OLED)具备高色彩对比与显色度,俨然已成为液晶屏幕(Liquid Crystal Display, LCD)的首要竞争对手。 声势后来居上的MicroLED显示技术,同样有拥有自发光的显示优势,有望成为次世代的主流显示技术。 尽管目前巨
[手机便携]
ARM11网络终端实时通信特性分析及LCD显示实现
ARM11主频为533 MHz,最高可达667 MHz,较ARM7主频提高了10倍,且拥有更丰富的片上资源,处理速度更快,功能更强。基于上述特点,ARM11可完全适应实时性较强的网络终端的设计。 在以ARM11为核心的网络终端设计中,需要LCD在终端实时显示网络通信的各项参数和设备工作状态,LCD的显示内容依靠网络传输数据中的指令来控制,而网络终端的操作数据也要通过网络传输到计算机,因此网络通信和LCD显示需要很强的实时性才能合理使用计算机和ARM11的资源,从而提高系统的运行效率。 该文以ARM11处理器S3C6410为平台,基于Linux操作系统设计了一种在ARM11内核直接控制LCD显示的方法,并采用TCP/IP协议
[单片机]
ARM11网络终端实时通信特性分析及<font color='red'>LCD</font>显示实现
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved