SSD1963驱动板原理图
基于STM32的餐车机器人

• 13•如今,人工智能成为新一轮技术革命和工业变化的核心力量,推动了传统工业的更新换代,各行各业均在积极向智能技术转变,服务行业也是如此。
传统点菜是依靠纯人工方式进行,造成了点餐效率低,服务体验质量差等问题。
因此,在智能化不断普及的背景下,服务行业进入智能服务机器人时代已经是大势所趋。
由于我国铁路的迅速发展,且具有方便、快捷、实惠等特点,使得铁路成为不少人出行的第一选择。
但是传统的铁路运输送餐模式选用人工推车式送餐,这种送餐模式效率低下,不仅不能实现随时点餐的需求而且容易因餐车体积庞大占据车厢过道而造成拥堵问题。
本文设计的餐车机器人将专门应用于铁路运输,其最大特点是缩小了传统餐车的体积,且操作灵活、运输平稳,能从根本上解决车厢拥堵问题,提高了旅客的乘车满意度。
同时,本产品的设计,实现了“随想随点、随点随做、随做随送”的一系列人性化服务,运用智能化服务模式取代人工服务模式,可以大大降低人为缘故的出错概率,有效提高服务质量和效率,更能满足旅客的用餐需求。
1 整体设计结构餐车机器人以STM32F103ZET6作为主控芯片,主要功能有:循迹、避障、显示点餐信息、点评服务以及人机对话。
餐车的循迹功能是通过灰度模块实现,使用超声波模块检测障碍物达到避障效果,利用车内的液晶屏显示用户点餐信息,采用按键输入模块对服务进行评价,添加语音模块实现人机对话,进一步提高人机交互感。
Cortex-M3,最高工作频率为72MHz 。
同时作为STM32F1系列中最高配置的芯片,其拥有:64KB SRAM 、 512KB FLASH 、4个通用定时器、2个基本定时器、2个高级定时器、2个DMA 控制器、2个IIC 、5个串口、1个USB 、3个12 位ADC 以及112个通用IO 口等。
出于项目代码量与需要运行UC/OS-II 操作系统综合考虑后,我们决定选用大容量Flash 的ZET6类型设计本产品,运用到的芯片外设有颜色传感器的ADC 转换,两路特殊的高级定时器产生PWM 控制电机等。
SSD1963开发板使用手册

电源选择开关(USB:选择 USB 供电,E_POWER:选择 DC 电源输入)
2.LCD 背光电压(CON3)
PIN NO. 1 2 3 4 描述 背光负级输入 背光正级输入 GND 电源地 5.0V
如果被测产品背光电压为 5V 直接将 1 和 3,2 和 4 短接即可;否则,分别有 1 和 2 单独给 背光供电。
VSS VDDLCD LDATA17 BPIO0 GPIO1 GPIO2 GPIO3 VDDD VSS VDDLCD LFRAME LLINE LSHIFT VDDD VSS VDDLCD LDEN TE PWM GAMAS0 GAMAS1 VDDLCD VSS VDDD VSS VDDLCD LDATA16 LDATA15 LDATA14 LDATA13 LDATA12 VDDD
1 3 5 7 9
2 4 6 8 10
VDDD VSS VSS VDDIO VSS VDDD D0 D1 D2 D3 D4 VDDIO VSS VDDD CLK VDDIO VSS VDDPLL VSSPLL VSS VDDD XTAL_IN VSS STAL_OUT VDDD VSS VDDLCD LDATA23 LDATA22 LDATA21 LDATA20 VDDD
此开发板支持 SD 卡读写,读写方式采用 C8051 自带的 SPI,速度可高达 (25M) ;支持 USB 驱动,通过 PC 端软件,可直接将需要现实的图片数据下载 到 SD 卡中;陪送底层软件(C8051)源代码,不同的 TFT LCD 只需要修改部分 初始化参数即刻。 三.产品应用介绍 1.电源参数:输入电压 5V。如果工作电流小于 500mA,可 3.3V RSTC2CK 13 C2D 14 D7 15 D6 16 D5 17 D4 18 D3 19 D2 20 D1 21 22 D0 KEY3 23 KEY2 24
SSDOLED驱动芯片中文手册

SSDOLED驱动芯⽚中⽂⼿册简介SSD1306是⼀个单⽚CMOS OLED/PLED驱动芯⽚可以驱动有机/聚合发光⼆极管点阵图形显⽰系统。
由128 segments 和64 Commons组成。
该芯⽚专为共阴极OLED⾯板设计。
SSD1306中嵌⼊了对⽐度控制器、显⽰RAM和晶振,并因此减少了外部器件和功耗。
有256级亮度控制。
数据/命令的发送有三种接⼝可选择:6800/8000串⼝,I2C接⼝或SPI接⼝。
适⽤于多数简介的应⽤,注⼊移动电话的屏显,MP3播放器和计算器等。
特性1.分辨率:128 * 64 点阵⾯板2.电源:a)VDD = 1.65V to 3.3V ⽤于IC逻辑b)VCC = 7V to 15V ⽤于⾯板驱动3.点阵显⽰a)OLED驱动输出电压,最⼤15Vb)Segment最⼤电流:100uAc)常见最⼤反向电流:15mAd)256级对⽐亮度电流控制4.嵌⼊式128 * 64位SRAM显⽰缓存5.引脚选择MCU接⼝a)8位6800/8000串⼝b)3/4线SPI接⼝c)I2C接⼝6.⽔平和垂直两个⽅向的屏幕保存连续滚动功能。
7.RAM写同步信号8.可编程的帧率和多重⽐率9.⾏重映射和列冲映射10.⽚上晶振11.两种封装 COG和COF12.⼯作温度范围⼴:‐40℃ to 85℃订购信息暂不翻译结构⽅框图SSD1306MCU接⼝由8个数据引脚和5个控制引脚组成。
引脚分配由不同的接⼝选择决定,详情如下表。
不同的MCU模块可以通过BS[2:0]引脚的硬件选择设置。
MCU 并⼝ 6800系列接⼝不翻译MCU 并⼝8080系列接⼝不翻译MCU串⼝(4‐wire SPI)不翻译MCU串⼝(3‐wire SPI)不翻译MCU I2C 接⼝I2C通讯接⼝由从机地址为SA0,I2C总线数据信号(SDAout/D2输出和SDAin/D1输⼊)和I2C 总线时钟信号SCL(D0)组成。
数据和时钟信号线都必须接上上拉电阻。
硬盘内部硬件结构和工作原理详解概论

图1-1 硬盘的外观图1-2 控制电路板图1-3 硬盘接口电源插座连接电源,为硬盘工作提供电力保证。
数据接口是硬盘与主板、内存之间进行数据交换的通道,使用一根40针40线(早期)或40针80线(当前)的IDE 接口电缆进行连接。
新增加的40线是信号屏蔽线,用于屏蔽高速高频数据传输过程中的串扰。
中间的主、从盘跳线插座,用以设置主、从硬盘,即设置硬盘驱动器的访问顺序。
其设置方法一般标注在盘体外的标签上,也有一些标注在接口处,早期的硬盘还可能印在电路板上。
此外,在硬盘表面有一个透气孔(见图1-1),它的作用是使硬盘内部气压与外部大气压保持一致。
由于盘体是密封的,所以,这个透气孔不直接和内部相通,而是经由一个高效过滤器和盘体相通,用以保证盘体内部的洁净无尘,使用中注意不要将它盖住。
1.2 硬盘的内部结构硬盘的内部结构通常专指盘体的内部结构。
盘体是一个密封的腔体,里面密封着磁头、盘片(磁片、碟片)等部件,如图1-4所示。
图1-4 硬盘内部结构硬盘的盘片是硬质磁性合金盘片,片厚一般在0.5mm左右,直径主要有1.8in(1in=25.4mm)、2.5in、3.5in和5.25in 4种,其中2.5in和3.5in盘片应用最广。
盘片的转速与盘片大小有关,考虑到惯性及盘片的稳定性,盘片越大转速越低。
一般来讲,2.5in硬盘的转速在5 400 r/min~7 200 r/ min之间;3.5in硬盘的转速在4 500 r/min~5 400 r/min之间;而5.25in硬盘转速则在3 600 r/min~4 500 r/min之间。
随着技术的进步,现在2.5in硬盘的转速最高已达15 000 r/min,3.5in硬盘的转速最高已达12 000 r/min。
有的硬盘只装一张盘片,有的硬盘则有多张盘片。
这些盘片安装在主轴电机的转轴上,在主轴电机的带动下高速旋转。
每张盘片的容量称为单碟容量,而硬盘的容量就是所有盘片容量的总和。
SSD1963_1.2 彩屏TFT液晶驱动芯片 最新原版

6 7
PIN DESCRIPTIONS ................................................................................................................ 13 FUNCTIONAL BLOCK DESCRIPTIONS ............................................................................ 16
7.1 MCU INTERFACE .................................................................................................................................................16 7.1.1 6800 Mode ..................................................................................................................................................16 7.1.2 8080 Mode ..................................................................................................................................................16 7.1.3 Register Pin Mapping .................................................................................................................................16 7.1.4 Pixel Data Format ......................................................................................................................................16 7.1.5 Tearing Effect Signal (TE) ..........................................................................................................................17 7.2 SYSTEM CLOCK GENERATION .............................................................................................................................18 7.3 FRAME BUFFER....................................................................................................................................................19 7.4 SYSTEM CLOCK AND RESET MANAGER ...............................................................................................................19 7.5 LCD CONTROLLER ..............................................................................................................................................20 7.5.1 Display Format ...........................................................................................................................................20 7.5.2 General Purpose Input/Output (GPIO) ......................................................................................................20
基于SSD1963控制器的液晶显示模块设计

基于SSD1963控制器的液晶显示模块设计赵彩虹;刘凯;尹涓【摘要】为了满足嵌入式工业控制系统终端显示的需要,提出了一种基于微处理器R1610和LCD控制器SSD1963的液晶显示模块的设计方法;详细阐述了硬件接口电路的设计和控制软件的编程,重点介绍了R1610、SSD1963以及TFT液晶屏AT070TN83之间的硬件连接方法,分析了SSD1963液晶控制的使用方法以及针对液晶屏显示时序的系统设置;进行了显示控制测试,通过该显示模块实现了图像在液晶屏上的显示;测试结果表明,硬件设计和控制软件设计能够满足显示要求,显示效果良好;文章提出的显示模块设计方法同样适用于其他液晶屏的显示控制,具有一定的应用前景和参考价值.【期刊名称】《计算机测量与控制》【年(卷),期】2015(023)011【总页数】3页(P3797-3799)【关键词】SSD1963;液晶显示模块;R1610;AT070TN83【作者】赵彩虹;刘凯;尹涓【作者单位】南京航空航天大学金城学院机电工程系,南京211156;南京航空航天大学机电学院,南京210016;南京航空航天大学金城学院机电工程系,南京211156【正文语种】中文【中图分类】TN141.9液晶显示模块应用于人机交互过程中的文本及图形信息的显示[1]。
嵌入式工业控制系统中要求实时显示运行状态、系统参数以及相关图表图形等信息,采用液晶屏显示模块作为终端显示设备,显示内容丰富,直观性强[2]。
本文基于金丽科技公司(RDC)的X86系列的微处理器R1610和晶门科技公司(SolomonSystech)的SSD1963液晶显示控制器,采用群创公司(Innolux)的AT070TN83液晶屏,进行相关硬件电路和控制软件的设计,实现液晶屏的图形显示功能。
液晶显示模块结构框图如图1所示。
系统控制器采用微处理器控制,把系统信息以文本、图表的形式发送至LCD控制器;LCD控制器根据接收到的显示指令,通过LCD驱动器,以一定的扫描时序将需要显示的内容传输给液晶屏实时地进行显示。
SSD1963驱动

首页阅览室馆友我的图书馆来自:mcu_mouse > 嵌入式C语言配色:字号SSD1963的样例程序2010-12-01 | 阅:1803 转:28 | 分享//===============================typedef union {unsigned char UByte[2];unsigned int UInt;} UWORD;void SSD1963Data_16(uchar sdataH,uchar sdataL);void SSD1963Data1_16(uint dat);void SSD1963Command_16(uint cmd);void SetPixel(uint Col,uint Page,uint color); //显示一个相素点uint GetPixel(uint Col,uint Page);//得到一个像素点/******************************************************SSD1963的Conf脚,用来控制读写的方式,如果为0 则为6800总线MODE如果位1 ,则为8080总线。
下面的定义是8080 MODE(默认情况下为8080),可以通过修改Conf 跳点来修改读写式。
******************************************************/void SSD1963Command_8(uchar cmd);void SSD1963Data_8(uchar sdata);uchar GetSSD1963Data_8();uint GetSSD1963Data_16();void ReadSSD1963Set();#define SetSSD1963RD() SetBit(P4,4) #define SetSSD1963WR() SetBit(P4,5)#define SetSSD1963CS() SetBit(P4,2)#define SetSSD1963DC() SetBit(P4,3) #define SetSSD1963Reset() SetBit(P4,1) #define SetSSD1963Wait() SetBit(p4,0) #define ClrSSD1963RD() ClrBit(P4,4)#define ClrSSD1963CS() ClrBit(P4,2)#define ClrSSD1963DC() ClrBit(P4,3)#define ClrSSD1963Reset() ClrBit(P4,1)#define ClrSSD1963Wait() ClrBit(p4,0)#define DataPortL P1#define DataPortH P2//UWORD 是一个结构体//注意在给1963写命令时,只能用数据线的低8位来传输数据。
SSD1963初始化

SSD1963初始化/**************************************************************** mili开发板** LCD驱动代码** 版本:V1.0** 论坛:/doc/9fa31eb11a37f111f1855bd2.html** 淘宝:/doc/9fa31eb11a37f111f1855bd2.html /** 技术⽀持群:105339839***************************************************************//* Includes ------------------------------------------------------------------*/#include "stm32f10x.h"#include "hardware.h"#include "ili932x.h"#include "font.h"#includeunsigned int HDP=479;unsigned int HT=531;unsigned int HPS=43;unsigned int LPS=8;unsigned char HPW=10;unsigned int VDP=271;unsigned int VT=288;unsigned int VPS=12;unsigned int FPS=4;unsigned char VPW=10;u32 POINT_COLOR = BLUE,BACK_COLOR = WHITE; /* 分别设置点的颜⾊和底⾊ *//******************************************** 函数名:LCD_GPIO_Config* 描述:根据FSMC配置LCD的I/O*********************************************/void LCD_GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure;/* 使能FSMC时钟*/RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);/* 使能FSMC对应相应管脚时钟 D E */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE,ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/* 配置LCD背光控制管脚*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_Init(GPIOC, &GPIO_InitStructure);/* 配置FSMC相对应的数据线,FSMC-D0~D15: PD 14 15 0 1,PE 7 8 9 10 11 12 13 14 15,PD 8 9 10*/GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 |GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |GPIO_Pin_15;GPIO_Init(GPIOE, &GPIO_InitStructure);/* 配置FSMC相对应的控制线* PD4-FSMC_NOE :LCD-RD* PD5-FSMC_NWE :LCD-WR* PD7-FSMC_NE1 :LCD-CS* PD11-FSMC_A16 :LCD-DC*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ;GPIO_Init(GPIOD, &GPIO_InitStructure);/* TFT control gpio init *///GPIO_SetBits(GPIOC, GPIO_Pin_10); // 背光打开GPIO_SetBits(GPIOD, GPIO_Pin_4); // RD = 1GPIO_SetBits(GPIOD, GPIO_Pin_5); // WR = 1GPIO_SetBits(GPIOD, GPIO_Pin_7); // CS = 1}/******************************************** 函数名:LCD_FSMC_Config* 描述:LCD FSMC 模式配置*********************************************/void LCD_FSMC_Config(void){FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;FSMC_NORSRAMTimingInitTypeDef p;p.FSMC_AddressSetupTime = 0x02; //地址建⽴时间p.FSMC_AddressHoldTime = 0x00; //地址保持时间p.FSMC_DataSetupTime = 0x05; //数据建⽴时间p.FSMC_BusTurnAroundDuration = 0x00;p.FSMC_CLKDivision = 0x00;p.FSMC_DataLatency = 0x00;p.FSMC_AccessMode = FSMC_AccessMode_B;// ⼀般使⽤模式B来控制LCDFSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;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_Disable;FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);/* 使能 FSMC Bank1_SRAM Bank */FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);}/******************************************************************************* 函数名称: LCD_Write_Reg** 功能描述: 写指令及数据** 作者: Dream** ⽇期: 2010年12⽉06⽇*****************************************************************************/void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_Dat){Write_Cmd(LCD_Reg);Write_Dat(LCD_Dat);}/******************************************************************************* 函数名称: Write_Cmd** 功能描述: 写指令** 作者: Dream** ⽇期: 2010年12⽉06⽇*****************************************************************************/void Write_Cmd(uint16_t LCD_Reg){// LCD_CS = 0;// LCD_RS = 0;// GPIOC->ODR = (GPIOC->ODR&0xff00)|(LCD_Reg&0x00ff);// GPIOB->ODR = (GPIOB->ODR&0x00ff)|(LCD_Reg&0xff00);// LCD_WR = 0;// LCD_WR = 1;// LCD_CS = 1;((*(__IO u16 *) (Bank1_LCD_C)) = ((u16) LCD_Reg));}/******************************************************************************* 函数名称: Write_Dat**功能描述: 写数据** 作者: Dream** ⽇期: 2010年12⽉06⽇*****************************************************************************/void Write_Dat(uint16_t LCD_Dat){// LCD_CS = 0;// LCD_RS = 1;// GPIOC->ODR = (GPIOC->ODR&0xff00)|(LCD_Dat&0x00ff);// GPIOB->ODR = (GPIOB->ODR&0x00ff)|(LCD_Dat&0xff00);// LCD_WR = 0;// LCD_WR = 1;// LCD_CS = 1;((*(__IO u16 *) (Bank1_LCD_D)) = ((u16)(LCD_Dat)));}/******************************************************************************* 函数名称: LCD_ReadReg** 功能描述: 读指令** 作者: Dream** ⽇期: 2010年12⽉06⽇*****************************************************************************/uint16_t LCD_ReadReg(uint16_t LCD_Reg){// uint16_t temp;// Write_Cmd(LCD_Reg); //写⼊要读的寄存器号//// GPIOB->CRH = (GPIOB->CRH & 0x00000000) | 0x44444444; //将端⼝⾼8位配置成输⼊// GPIOC->CRL = (GPIOC->CRL & 0x00000000) | 0x44444444; //将端⼝低8位配置成输⼊// LCD_CS = 0;// LCD_RS = 1;// LCD_RD = 0;// temp = ((GPIOB->IDR&0xff00)|(GPIOC->IDR&0x00ff)); //读取数据(读寄存器时,并不需要读2次) // LCD_RD = 1;// LCD_CS = 1;// GPIOB->CRH = (GPIOB->CRH & 0x00000000) | 0x33333333; //释放端⼝⾼8位为输出// GPIOC->CRL = (GPIOC->CRL & 0x00000000) | 0x33333333; //释放端⼝低8位为输出// return temp;/* Write 16-bit Index (then Read Reg) */LCD->LCD_REG = LCD_Reg;/* Read 16-bit Reg */return (LCD->LCD_RAM);}/******************************************************************************* 函数名称: LCD_ReadDat** 功能描述: 读数据** 作者: Dream** ⽇期: 2010年12⽉06⽇*****************************************************************************/uint16_t LCD_ReadDat(){// uint16_t temp;//// GPIOE->CRH = (GPIOE->CRH & 0x00000000) | 0x44444444; //将端⼝⾼8位配置成输⼊// GPIOE->CRL = (GPIOE->CRL & 0x00000000) | 0x44444444; //将端⼝低8位配置成输⼊// LCD_CS = 0;// LCD_RS = 1;// LCD_RD = 0;// temp = ((GPIOB->IDR&0xff00)|(GPIOC->IDR&0x00ff)); //读取数据(读寄存器时,并不需要读2次) // LCD_RD = 1;// LCD_CS = 1;// GPIOE->CRH = (GPIOE->CRH & 0x00000000) | 0x33333333; //释放端⼝⾼8位为输出// GPIOE->CRL = (GPIOE->CRL & 0x00000000) | 0x33333333; //释放端⼝低8位为输出//// return temp;u16 tmp_color = 0;u8 Green = 0,Red=0,Black=0;Green = *((__IO u8 *)(Bank1_LCD_D)); /*第⼀个数据⽆效*/Green = *((__IO u8 *)(Bank1_LCD_D));Red = *((__IO u8 *)(Bank1_LCD_D));Black = *((__IO u8 *)(Bank1_LCD_D));tmp_color = (u16)((((u16)Red>>3)<<11)|(((u16)Green>>2)<<5)|((u16)Black>>3));return(tmp_color);}/******************************************************************************* 函数名称: LCD_Configuration** 功能描述: LCD_IO⼝配置** 作者: Dream** ⽇期: 2010年12⽉06⽇*****************************************************************************/void LCD_Configuration(){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC,ENABLE); /* 配置数据IO 连接到GPIOB *********************/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11| GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出⽅式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 输出IO⼝最⼤最速为50MHZ GPIO_Init(GPIOB, &GPIO_InitStructure);/* 配置控制IO 连接到PD12.PD13.PD14.PD15 *********************/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7| GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出⽅式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 输出IO⼝最⼤最速为50MHZ GPIO_Init(GPIOC, &GPIO_InitStructure);}/******************************************************************************* 函数名称: LCD_Init** 功能描述: LCD初始化** 作者: Dream** ⽇期: 2010年12⽉06⽇*****************************************************************************/void LCD_Init(void){static uint16_t DeviceCode;//LCD_Configuration();LCD_GPIO_Config();LCD_FSMC_Config();LCD_WriteReg(0x0000,0x0001);LCD_Delay(5); // LCD_Delay 50 msDeviceCode = LCD_ReadReg(0x0000);printf(" ID=0x%x\n",DeviceCode);///////////////////////////////////LCD_Delay(5); // delay 50 msWrite_Dat(0x0023); //N=0x36 for 6.5M, 0x23 for 10M crystalWrite_Dat(0x0002);Write_Dat(0x0004);Write_Cmd(0x00E0); // PLL enableWrite_Dat(0x0001);LCD_Delay(1);Write_Cmd(0x00E0);Write_Dat(0x0003);LCD_Delay(5);Write_Cmd(0x0001); // software resetLCD_Delay(5);Write_Cmd(0x00E6); //PLL setting for PCLK, depends on resolutionWrite_Dat(0x0001);Write_Dat(0x0033);Write_Dat(0x0032);Write_Cmd(0x00B0); //LCD SPECIFICATIONWrite_Dat(0x0020);Write_Dat(0x0000);Write_Dat((HDP>>8)&0X00FF); //Set HDPWrite_Dat(HDP&0X00FF);Write_Dat((VDP>>8)&0X00FF); //Set VDPWrite_Dat(VDP&0X00FF);Write_Dat(0x0000);Write_Cmd(0x00B4); //HSYNCWrite_Dat((HT>>8)&0X00FF); //Set HTWrite_Dat(HT&0X00FF);Write_Dat((HPS>>8)&0X00FF); //Set HPSWrite_Dat(HPS&0X00FF);Write_Dat(HPW); //Set HPWWrite_Dat((LPS>>8)&0X00FF); //Set HPSWrite_Dat(LPS&0X00FF);Write_Dat(0x0000);Write_Cmd(0x00B6); //VSYNCWrite_Dat((VT>>8)&0X00FF); //Set VTWrite_Dat(VT&0X00FF);Write_Dat((VPS>>8)&0X00FF); //Set VPSWrite_Dat(VPS&0X00FF);Write_Dat(VPW); //Set VPWWrite_Dat((FPS>>8)&0X00FF); //Set FPSWrite_Dat(FPS&0X00FF);// Write_Cmd(0x00BA);// Write_Dat(0x000F); //GPIO[3:0] out 1// Write_Cmd(0x00B8);// Write_Dat(0x0007); //GPIO3=input, GPIO[2:0]=output// Write_Dat(0x0001); //GPIO0 normalWrite_Cmd(0x0036); //rotationWrite_Dat(0x0000);Write_Dat(0x0010);//============================================ //============================================ // LCD_WR_REG(0x003A); //rotation// Write_Dat(0x0050);// Write_Cmd(0x0026); //rotation// Write_Dat(0x0003);// Write_Cmd(0x0030); //rotation// Write_Dat(0x0000);//============================================= //============================================= Write_Cmd(0x00F0);//pixel data interfaceWrite_Dat(0x0003);//16位模式//Write_Cmd(0x0021);//进⼊图形颜⾊翻转模式Write_Cmd(0x00BC);//重要Write_Dat(0x0040);//对⽐度Write_Dat(0x0070);//亮度Write_Dat(0x0040);//饱和度值 //// Write_Dat(0x0080);//对⽐度// Write_Dat(0x0080);//亮度// Write_Dat(0x0080);//饱和度值 //Write_Dat(0x0001);//处理机允许Write_Cmd(0x0029); //display on//---------------------------------------------// Write_Cmd(0x0037);//重要// Write_Dat(0x000);// Write_Dat(0);LCD_Clear(WHITE);}//void WR_DATA_Prepare(void)//{// Write_Cmd(0x002c);//}/***************************************************************************** ** 函数名称: LCD_DrawPoint** 功能描述: 写⼀个点** 作者: Dream** ⽇期: 2010年12⽉06⽇*****************************************************************************/ void LCD_DrawPoint(uint16_t x, uint16_t y, uint16_t color){// LCD_SetCursor(x,y); //设置光标位置// LCD_WriteRAM_Prepare(); //开始写⼊GRAM// Write_Dat(color);u32 point = color;unsigned char rcode,gcode,bcode;rcode = (unsigned char)(point >> 16);gcode = (unsigned char)(point >> 8);bcode = (unsigned char)point;Write_Cmd(0x002A);Write_Dat(x>>8);Write_Dat(x&0x00ff);Write_Dat(479>>8);Write_Dat(479&0x00ff);Write_Cmd(0x002b);Write_Dat(y>>8);Write_Dat(y&0x00ff);Write_Dat(271>>8);Write_Dat(271&0x00ff);Write_Cmd(0x002c);Write_Dat(color);// Write_Dat((rcode << 8) | (gcode));// Write_Dat((bcode << 8) | (rcode));// Write_Dat((gcode << 8) | (bcode));}/***************************************************************************** ** 函数名称: LCD_WriteRAM_Prepare** 功能描述: 些准备** 作者: Dream** ⽇期: 2010年12⽉06⽇*****************************************************************************/ void LCD_WriteRAM_Prepare(){Write_Cmd(0x002c);}/***************************************************************************** ** 函数名称: LCD_SetCursor** 功能描述: 设置光标函数** 作者: Dream** ⽇期: 2010年12⽉06⽇*****************************************************************************/ void LCD_SetCursor(uint8_t Xpos,uint16_t Ypos){// Write_Cmd(0x002A);// Write_Dat(Xpos>>8);// Write_Dat(Xpos&0x00ff);// Write_Dat(479>>8);// Write_Dat(479&0x00ff);// Write_Cmd(0x002b);// Write_Dat(Ypos>>8);// Write_Dat(Ypos&0x00ff);// Write_Dat(271>>8);// Write_Dat(271&0x00ff);Write_Cmd(0x002A);Write_Dat(Xpos>>8);Write_Dat(Xpos&0x00ff);Write_Dat(479>>8);Write_Dat(479&0x00ff);Write_Cmd(0x002b);Write_Dat(Ypos>>8);Write_Dat(Ypos&0x00ff);Write_Dat(271>>8);Write_Dat(271&0x00ff);}/***************************************************************************** ** 函数名称: LCD_Clear** 功能描述: 清屏幕函数** 作者: Dream** ⽇期: 2010年12⽉06⽇*****************************************************************************/ //清屏函数//Color:要清屏的填充⾊void LCD_Clear(u32 color){unsigned int l=480,w;Write_Cmd(0x002a);Write_Dat(0);Write_Dat(0);Write_Dat(HDP>>8);Write_Dat(HDP&0x00ff);Write_Cmd(0x002b);Write_Dat(0);Write_Dat(0);Write_Dat(VDP>>8);Write_Dat(VDP&0x00ff);Write_Cmd(0x002c);while(l--){for(w=0;w<272;w++){Write_Dat(color);}}}/***************************************************************************** ** 函数名称: LCD_Delay** 功能描述: ⽤于LCD驱动延时** 作者: Dream** ⽇期: 2010年12⽉06⽇*****************************************************************************/ void LCD_Delay (uint32_t nCount){__IO uint16_t i;for (i=0;i}/***名称:void LCD_WindowMax()*参数:*返回:⽆*功能:设置窗⼝**/void LCD_WindowMax (unsigned int xsta,unsigned int ysta,unsigned int xend,unsigned int yend) {Write_Cmd(0X002A);Write_Dat(xsta>>8);Write_Dat(xsta&0X00FF);Write_Dat(xend>>8);Write_Dat(xend&0X00FF);Write_Cmd(0X002B);Write_Dat(ysta>>8);Write_Dat(ysta&0X00FF);Write_Dat(yend>>8);Write_Dat(yend&0X00FF);}/***名称:void LCD_Fill(uint8_t xsta, uint16_t ysta, uint8_t xend, uint16_t yend, uint16_t colour)*参数:xsta 起始X坐标ysta 起始Y坐标xend 结束X坐标yend 结束Y坐标color 待填充颜⾊*返回:⽆*功能:在指定矩形区域填充指定颜⾊,区域⼤⼩(xend-xsta)*(yend-ysta)*备注:部分区域少⼀⾏像素点**/void LCD_Fill(uint8_t xsta, uint16_t ysta, uint8_t xend, uint16_t yend, uint16_t colour){u32 n;/*设置窗⼝ */LCD_WindowMax (xsta, ysta, xend, yend);LCD_WriteRAM_Prepare(); /*开始写⼊GRAM*/n=(u32)(yend-ysta+1)*(xend-xsta+1);while(n--){Write_Dat(colour);} /*显⽰所填充的颜⾊*/}/***名称:void LCD_DrawLine(uint16_t xsta, uint16_t ysta, uint16_t xend, uint16_t yend)*参数:xsta X起始坐标ysta Y起始坐标xend X终点坐标yend Y终点坐标*返回:⽆*功能:指定坐表(两点),画线*备注:需要添加颜⾊参数**/void LCD_DrawLine(uint16_t xsta, uint16_t ysta, uint16_t xend, uint16_t yend, uint16_t color){u16 x, y, t;if((xsta==xend)&&(ysta==yend))LCD_DrawPoint(xsta, ysta, color);elseif(abs(yend-ysta)>abs(xend-xsta))/*斜率⼤于1 */{if(ysta>yend){t=ysta;yend=t;t=xsta;xsta=xend;xend=t;}for(y=ysta;y{x=(u32)(y-ysta)*(xend-xsta)/(yend-ysta)+xsta;LCD_DrawPoint(x, y, color);}}else /*斜率⼩于等于1 */{if(xsta>xend){t=ysta;ysta=yend;yend=t;t=xsta;xsta=xend;xend=t;}for(x=xsta;x<=xend;x++) /*以x轴为基准*/{y =(u32)(x-xsta)*(yend-ysta)/(xend-xsta)+ysta;LCD_DrawPoint(x, y, color);}}}/***名称:void Draw_Circle(uint16_t x0, uint16_t y0, uint8_t r)*参数:x0 中⼼点横坐标y0 中⼼点纵坐标r 半径*返回:⽆*功能:在指定位置画⼀个指定⼤⼩的圆*备注:加⼊颜⾊参数,是否填充等**/void Draw_Circle(uint16_t x0, uint16_t y0, uint8_t r, uint16_t color) {int a,b;int di;a=0;b=r;di=3-(r<<1); /*判断下个点位置的标志*/while(a<=b){LCD_DrawPoint(x0-b, y0-a, color); //3LCD_DrawPoint(x0+b, y0-a, color); //0LCD_DrawPoint(x0-a, y0+b, color); //1LCD_DrawPoint(x0-b, y0-a, color); //7LCD_DrawPoint(x0-a, y0-b, color); //2LCD_DrawPoint(x0+b, y0+a, color); //4LCD_DrawPoint(x0+a, y0-b, color); //5LCD_DrawPoint(x0+a, y0+b, color); //6LCD_DrawPoint(x0-b, y0+a, color);a++;/*使⽤Bresenham算法画圆*/if(di<0)di +=4*a+6;else{di+=10+4*(a-b);b--;}LCD_DrawPoint(x0+a, y0+b, color);}}/***名称:void LCD_DrawRectangle(uint16_t xsta, uint16_t ysta, uint16_t xend, uint16_t yend)*参数:xsta X起始坐标ysta Y起始坐标xend X结束坐标yend Y结束坐标*返回:⽆*功能:在指定区域画矩形*备注:**/void LCD_DrawRectangle(uint16_t xsta, uint16_t ysta, uint16_t xend, uint16_t yend, uint16_t color) {LCD_DrawLine(xsta, ysta, xend, ysta, color);LCD_DrawLine(xsta, ysta, xsta, yend, color);LCD_DrawLine(xsta, yend, xend, yend, color);LCD_DrawLine(xend, ysta, xend, yend, color);}/***名称:void LCD_ShowChar(u8 x, u16 y, u8 num, u8 size, u16 PenColor, u16 BackColor)*参数:x,y 起始坐标(x:0~234 y:0~308)num 字符ASCII码值size字符⼤⼩,使⽤默认8*16PenColor 字体颜⾊BackColor 字体背景颜⾊*功能:*备注:注意屏幕⼤⼩**/void LCD_ShowChar(u8 x, u16 y, u8 num, u8 size, u16 PenColor, u16 BackColor){#define MAX_CHAR_POSX 232#define MAX_CHAR_POSY 304u8 temp;u8 pos,t;if(x>MAX_CHAR_POSX||y>MAX_CHAR_POSY)return;num=num-' '; /*得到偏移后的值 */for(pos=0;pos{temp=asc2_1608[num][pos]; /*调⽤1608字体 */for(t=0;t{if(temp&0x01) /*从低位开始*/{LCD_DrawPoint(x+t, y+pos, PenColor); /*画字体颜⾊⼀个点*/}elseLCD_DrawPoint(x+t, y+pos, BackColor); /*画背景颜⾊⼀个点*/temp>>=1;}}}//m^n函数u32 mypow(u8 m,u8 n){u32 result=1;while(n--)result*=m;return result;}//显⽰2个数字//x,y :起点坐标//len :数字的位数//size:字体⼤⼩//color:颜⾊//num:数值(0~4294967295);void LCD_ShowNum(u8 x,u8 y,u32 num,u8 len, u16 PenColor, u16 BackColor){u8 size = 16; /* 这⾥使⽤默认的16*8 */u8 t,temp;u8 enshow=0;for(t=0;t{temp=(num/mypow(10,len-t-1))%10;if(enshow==0&&t<(len-1)){if(temp==0){LCD_ShowChar(x+(size/2)*t,y,' ',size, PenColor, BackColor);continue;}else enshow=1;}LCD_ShowChar(x+(size/2)*t,y,temp+'0',size, PenColor, BackColor);}}/**名称:void LCD_ShowCharString(uint16_t x, uint16_t y, const uint8_t *p, uint16_t PenColor, uint16_t BackColor)参数:x,y 起始坐标p 指向字符串起始地址PenColor 字符颜⾊BackColor 背景颜⾊功能:备注:⽤16字体,可以调节此函数不能单独调⽤**/void LCD_ShowCharString(uint16_t x, uint16_t y, const uint8_t *p, uint16_t PenColor, uint16_t BackColor){uint8_t size = 16; /*---字符⼤⼩默认16*8---*/if(x>MAX_CHAR_POSX){x=0;y+=size;} /*超出X轴字体最⼩单位,换⾏*/if(y>MAX_CHAR_POSY){y=x=0;LCD_Clear(WHITE);} /*超出Y轴字体最⼩单位,回到原点,并且清屏*/LCD_ShowChar(x, y, *p, size, PenColor, BackColor); /*0表⽰⾮叠加⽅式*/}/***名称: u16 findHzIndex(u8 *hz)*参数:hz*功能:索引汉字存储的内存地址*备注:**/u16 findHzIndex(u8 *hz) /* 在⾃定义汉字库在查找所要显⽰ *//* 的汉字的位置 */{u16 i=0;FNT_GB16 *ptGb16 = (FNT_GB16 *)GBHZ_16; /*ptGb16指向GBHZ_16*/while(ptGb16[i].Index[0] > 0x80){if ((*hz == ptGb16[i].Index[0]) && (*(hz+1) == ptGb16[i].Index[1])) /*汉字⽤两位来表⽰地址码*/{return i;}i++;if(i > (sizeof((FNT_GB16 *)GBHZ_16) / sizeof(FNT_GB16) - 1)) /* 搜索下标约束 */{break;}}return 0;}/***名称:void WriteOneHz(uint16_t x0, uint16_t y0, uint8_t *pucMsk, uint16_t PenColor, uint16_t BackColor) *参数:x0,y0 起始坐标*pucMsk 指向PenColor 字符颜⾊BackColor 背景颜⾊*功能:*备注:此函数不能单独作为汉字字符显⽰**/void WriteOneHz(u16 x0, u16 y0, u8 *pucMsk, u16 PenColor, u16 BackColor){u16 i,j;u16 mod[16]; /* 当前字模 16*16 */u16 *pusMsk; /* 当前字库地址 */u16 y;pusMsk = (u16 *)pucMsk;for(i=0; i<16; i++) /* 保存当前汉字点阵式字模 */{mod[i] = *pusMsk; /* 取得当前字模,半字对齐访问 */mod[i] = ((mod[i] & 0xff00) >> 8) | ((mod[i] & 0x00ff) << 8);/* 字模交换⾼低字节*/pusMsk = pusMsk+1;}y = y0;for(i=0; i<16; i++) /* 16⾏ */{for(j=0; j<16; j++) /* 16列 */{if((mod[i] << j) & 0x8000) /* 显⽰第i⾏共16个点 */{LCD_DrawPoint(x0+j, y0+i, PenColor);}else{LCD_DrawPoint(x0+j, y0+i, BackColor);}}y++;}}/***名称:void LCD_ShowHzString(u16 x0, u16 y0, u8 *pcStr, u16 PenColor, u16 BackColor)*参数:x0,y0 起始坐标pcStr 指向PenColor 字体颜⾊BackColor 字体背景*功能:显⽰汉字字符串*备注:这个函数不能单独调⽤**/void LCD_ShowHzString(u16 x0, u16 y0, u8 *pcStr, u16 PenColor, u16 BackColor){#define MAX_HZ_POSX 224#define MAX_HZ_POSY 304u16 usIndex;u8 size = 16;FNT_GB16 *ptGb16 = 0;ptGb16 = (FNT_GB16 *)GBHZ_16;if(x0>MAX_HZ_POSX){x0=0;y0+=size;} /*超出X轴字体最⼩单位,换⾏*/if(y0>MAX_HZ_POSY){y0=x0=0;LCD_Clear(WHITE);} /*超出Y轴字体最⼩单位,回到原点,并且清屏*/ usIndex = findHzIndex(pcStr);WriteOneHz(x0, y0, (u8 *)&(ptGb16[usIndex].Msk[0]), PenColor, BackColor); /* 显⽰字符 */}/***名称:void LCD_ShowString(u16 x0, u16 y0, u8 *pcstr, u16 PenColor, u16 BackColor)*参数:x0 y0 起始坐标pcstr 字符串指针PenColor 字体颜⾊BackColor 字体背景⾊*功能:调⽤字符和汉字显⽰函数,实现字符串显⽰*备注:**/void LCD_ShowString(u16 x0, u16 y0, u8 *pcStr, u16 PenColor, u16 BackColor){while(*pcStr!='\0'){if(*pcStr>0x80) /*显⽰汉字*/{LCD_ShowHzString(x0, y0, pcStr, PenColor, BackColor);pcStr += 2;x0 += 16;}else /*显⽰字符*/{LCD_ShowCharString(x0, y0, pcStr, PenColor, BackColor);pcStr +=1;x0+= 8;}}}/***************************************************************************** 名称:u16 ili9320_BGRtoRGB(u16 Color)* 功能:RRRRRGGGGGGBBBBB 改为 BBBBBGGGGGGRRRRR 格式* ⼊⼝参数:Color BRG 颜⾊值* 出⼝参数:RGB 颜⾊值* 说明:内部函数调⽤* 调⽤⽅法:****************************************************************************/u16 LCD_RGBtoBGR(u16 Color){u16 r, g, b, bgr;b = (Color>>0) & 0x1f; /* 提取B */g = (Color>>5) & 0x3f; /* 中间六位 */r = (Color>>11) & 0x1f; /* 提取R */bgr = (b<<11) + (g<<5) + (r<<0);return( bgr );}/***************************************************************************** 名称:void LCD_DrawPicture(u16 StartX,u16 StartY,u16 EndX,u16 EndY,u16 *pic) * 功能:在指定座标范围显⽰⼀副图⽚* ⼊⼝参数:StartX ⾏起始座标* StartY 列起始座标* EndX ⾏结束座标* EndY 列结束座标pic 图⽚头指针* 出⼝参数:⽆* 说明:图⽚取模格式为⽔平扫描,16位颜⾊模式* 调⽤⽅法:LCD_DrawPicture(0,0,100,100,(u16*)demo);****************************************************************************/void LCD_DrawPicture(u16 StartX,u16 StartY,u16 Xend,u16 Yend,u8 *pic){static u16 i=0,j=0;u16 *bitmap = (u16 *)pic;for(j=0; j{for(i=0; iLCD_DrawPoint(StartX+i, StartY+j, *bitmap++);}}//快速ALPHA BLENDING算法.//src:源颜⾊//dst:⽬标颜⾊//alpha:透明程度(0~32)//返回值:混合后的颜⾊.u16 gui_alpha_blend565(u16 src,u16 dst,u8 alpha){u32 src2;u32 dst2;//Convert to 32bit |-----GGGGGG-----RRRRR------BBBBB|src2=((src<<16)|src)&0x07E0F81F;dst2=((dst<<16)|dst)&0x07E0F81F;//Perform blending R:G:B with alpha in range 0..32//Note that the reason that alpha may not exceed 32 is that there are only//5bits of space between each R:G:B value, any higher value will overflow//into the next component and deliver ugly result.dst2=((((dst2-src2)*alpha)>>5)+src2)&0x07E0F81F;return (dst2>>16)|dst2;}。