亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
ssd1289 STM32F103 LCD驅動程序
[打印本頁]
作者:
dhma
時間:
2017-11-7 10:55
標題:
ssd1289 STM32F103 LCD驅動程序
STM32F103單片機下的 LCD驅動
0.png
(7.2 KB, 下載次數: 81)
下載附件
2017-11-8 02:39 上傳
單片機源程序如下:
/*
*********************************************************************************************************
*
* 模塊名稱 : TFT液晶顯示器驅動模塊
* 文件名稱 : LCD_tft_lcd.c
* 版 本 : V1.0
* 說 明 : 安富萊開發板標配的TFT顯示器分辨率為240x400,3.0寸寬屏,帶PWM背光調節功能。
* 支持的LCD內部驅動芯片型號有:SPFD5420A、OTM4001A、R61509V
* 驅動芯片的訪問地址為: 0x60000000
* 修改記錄 :
* 版本號 日期 作者 說明
* v1.0 2011-08-21 armfly ST固件庫版本 V3.5.0版本。
* a) 取消訪問寄存器的結構體,直接定義
* V2.0 2011-10-16 armfly 增加R61509V驅動,實現圖標顯示函數
*
*
*********************************************************************************************************
*/
/*
友情提示:
TFT控制器和一般的12864點陣顯示器的控制器最大的區別在于引入了窗口繪圖的機制,這個機制對于繪制局部圖形
是非常有效的。TFT可以先指定一個繪圖窗口,然后所有的讀寫顯存的操作均在這個窗口之內,因此它不需要CPU在
內存中保存整個屏幕的像素數據。
*/
#include "stm32f10x.h"
#include <stdio.h>
#include <string.h>
#include "bsp_tft_lcd.h"
#include "bsp_timer.h"
#include "fonts.h"
/* 定義LCD驅動器的訪問地址
TFT接口中的RS引腳連接FSMC_A0引腳,由于是16bit模式,RS對應A1地址線,因此
LCD_RAM的地址是+2
*/
#define LCD_BASE ((uint32_t)(0x60000000 | 0x0C000000))
#define LCD_REG *(__IO uint16_t *)(LCD_BASE)
#define LCD_RAM *(__IO uint16_t *)(LCD_BASE + 2)
static __IO uint8_t s_RGBChgEn = 0; /* RGB轉換使能, 4001屏寫顯存后讀會的RGB格式和寫入的不同 */
static __IO uint8_t s_AddrAutoInc = 0; /* 讀回一個像素后,顯存地址是否自動增1 */
void LCD_DrawCircle(uint16_t _usX, uint16_t _usY, uint16_t _usRadius, uint16_t _usColor);
void LCD_WriteReg(__IO uint16_t _usAddr, uint16_t _usValue);
uint16_t LCD_ReadReg(__IO uint16_t _usAddr);
static void LCD_SetDispWin(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth);
static void LCD_QuitWinMode(void);
static void LCD_SetCursor(uint16_t _usX, uint16_t _usY);
static void LCD_CtrlLinesConfig(void);
static void LCD_FSMCConfig(void);
static void LCD_Init_ssd1289(void);
//static void LCD_Init_61509(void);
static uint16_t LCD_BGR2RGB(uint16_t _usRGB);
/*
*********************************************************************************************************
* 函 數 名: LCD_InitHard
* 功能說明: 初始化LCD
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
void LCD_InitHard(void)
{
uint16_t id;;
/* 配置LCD控制口線GPIO */
LCD_CtrlLinesConfig();
/* 配置FSMC接口,數據總線 */
LCD_FSMCConfig();
/* FSMC重置后必須加延遲才能訪問總線設備 */
//bsp_DelayMS(10);
id = LCD_GetID(); /* 讀取LCD驅動芯片ID */
if (id == 0x8989) /* 4001屏和5420相同,4001屏讀回顯存RGB時,需要進行轉換,5420無需 */
{
// GPIO_ResetBits(GPIOE, GPIO_Pin_2); /* 點亮LED1 */
// bsp_DelayMS(100);
// GPIO_SetBits(GPIOE, GPIO_Pin_2); /* 關閉LED1 */
// bsp_DelayMS(100);
//
// GPIO_ResetBits(GPIOE, GPIO_Pin_2); /* 點亮LED1 */
// bsp_DelayMS(100);
// GPIO_SetBits(GPIOE, GPIO_Pin_2); /* 關閉LED1 */
// bsp_DelayMS(100);
LCD_Init_ssd1289();
}
/* 清除顯存 */
LCD_ClrScr(CL_BLACK); /* 黑色 */
}
/*
*********************************************************************************************************
* 函 數 名: LCD_WriteReg
* 功能說明: 修改LCD控制器的寄存器的值。
* 形 參:
* LCD_Reg :寄存器地址;
* LCD_RegValue : 寄存器值
* 返 回 值: 無
*********************************************************************************************************
*/
void LCD_WriteReg(__IO uint16_t _usAddr, uint16_t _usValue)
{
/* Write 16-bit Index, then Write Reg */
LCD_REG = _usAddr;
/* Write 16-bit Reg */
LCD_RAM = _usValue;
}
/*
*********************************************************************************************************
* 函 數 名: LCD_ReadReg
* 功能說明: 讀取LCD控制器的寄存器的值。
* 形 參:
* LCD_Reg :寄存器地址;
* LCD_RegValue : 寄存器值
* 返 回 值: 無
*********************************************************************************************************
*/
uint16_t LCD_ReadReg(__IO uint16_t _usAddr)
{
/* Write 16-bit Index (then Read Reg) */
LCD_REG = _usAddr;
/* Read 16-bit Reg */
return (LCD_RAM);
}
/*
*********************************************************************************************************
* 函 數 名: LCD_CtrlLinesConfig
* 功能說明: 配置LCD控制口線,FSMC管腳設置為復用功能
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
static void LCD_CtrlLinesConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE); //使能FSMC時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO,ENABLE);//使能PORTB,D,E,G以及AFIO復用功能時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PA8 推挽輸出 背光
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//PORTD復用推挽輸出
/*
PD0 -> D2
PD1 -> D3
PD4 -> RD(FSMC_NOE)
PD5 -> WR(FSMC_NWE)
PD8 -> D13
PD9 -> D14
PD10 -> D15
PD14 -> D0
PD15 -> D1
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_14|GPIO_Pin_15; // //PORTD復用推挽輸出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
//PORTE復用推挽輸出
/*
PE7 -> D4
PE8 -> D5
PE9 -> D6
PE10 -> D7
PE11 -> D8
PE12 -> D9
PE13 -> D10
PE14 -> D11
PE15 -> D12
*/
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; // //PORTD復用推挽輸出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
//PORTG12復用推挽輸出
/*
PG12 -> CS(FSCM_NE4)
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // //PORTD復用推挽輸出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure);
/* 設置 PF0(A0 (RS)) 為復用推挽輸出 */
/*
PF0 -> RS(FSCM_A0)
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // //PORTF復用推挽輸出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
}
/*
*********************************************************************************************************
* 函 數 名: LCD_FSMCConfig
* 功能說明: 配置FSMC并口訪問時序
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
static void LCD_FSMCConfig(void)
{
//兩種不同的初始化
// FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
// FSMC_NORSRAMTimingInitTypeDef readWriteTiming;
// FSMC_NORSRAMTimingInitTypeDef writeTiming;
//
//
// 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; //0x01 地址建立時間(ADDSET)為1個HCLK
// writeTiming.FSMC_AddressHoldTime = 0x00; //地址保持時間(A
// writeTiming.FSMC_DataSetupTime = 0x03; ////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_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE); // 使能BANK1
//
FSMC_NORSRAMInitTypeDef init;
FSMC_NORSRAMTimingInitTypeDef timing;
/*-- FSMC Configuration ------------------------------------------------------*/
/*----------------------- SRAM Bank 4 ----------------------------------------*/
/* FSMC_Bank1_NORSRAM4 configuration */
timing.FSMC_AddressSetupTime = 1;
timing.FSMC_AddressHoldTime = 0;
timing.FSMC_DataSetupTime = 0x3; //必須大于2
timing.FSMC_BusTurnAroundDuration = 0;
timing.FSMC_CLKDivision = 0;
timing.FSMC_DataLatency = 0;
timing.FSMC_AccessMode = FSMC_AccessMode_A;
//timing.FSMC_AccessMode = FSMC_AccessMode_B;
/*
LCD configured as follow:
- Data/Address MUX = Disable
- Memory Type = SRAM
- Data Width = 16bit
- Write Operation = Enable
- Extended Mode = Enable
- Asynchronous Wait = Disable
*/
init.FSMC_Bank = FSMC_Bank1_NORSRAM4;
init.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
init.FSMC_MemoryType = FSMC_MemoryType_SRAM;
//init.FSMC_MemoryType = FSMC_MemoryType_NOR;
init.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
init.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
init.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
init.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
init.FSMC_WrapMode = FSMC_WrapMode_Disable;
init.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
init.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
init.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
init.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
init.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
init.FSMC_ReadWriteTimingStruct = &timing;
init.FSMC_WriteTimingStruct = &timing;
FSMC_NORSRAMInit(&init);
/* - BANK 3 (of NOR/SRAM Bank 1~4) is enabled */
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
}
/*
*********************************************************************************************************
* 函 數 名: LCD_GetID
* 功能說明: 讀取LCD的器件ID
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
uint16_t LCD_GetID(void)
{
return LCD_ReadReg(0x0000);
}
/*
*********************************************************************************************************
* 函 數 名: LCD_Init_ssd1289
* 功能說明: 初始化ssd1289屏
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
static void LCD_Init_ssd1289(void)
{
/* 初始化LCD,寫LCD寄存器進行配置 */
/*
R003H 寄存器很關鍵, Entry Mode ,決定了掃描方向
參見:SPFD5420A.pdf 第15頁
240x400屏幕物理坐標(px,py)如下:
R003 = 0x1018 R003 = 0x1008
------------------- -------------------
|(0,0) | |(0,0) |
| | | |
| ^ ^ | | ^ ^ |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | ------> | | | | <------ | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |
| | | |
| (x=239,y=399)| | (x=239,y=399)|
|-------------------| |-------------------|
| | | |
------------------- -------------------
按照安富萊開發板LCD的方向,我們期望的虛擬坐標和掃描方向如下:(和上圖第1個吻合)
--------------------------------
| |(0,0) |
| | ---------> |
| | | |
| | | |
| | | |
| | V |
| | ---------> |
| | (399,239)|
--------------------------------
虛擬坐標(x,y) 和物理坐標的轉換關系
x = 399 - py;
y = px;
py = 399 - x;
px = y;
*/
//************* Start Initial Sequence **********//
//for 3.2_37Pin_SSD1289
LCD_WriteReg(0x0000,0x0001);//打開晶振
LCD_WriteReg(0x0003,0xA8A4);//0xA8A4
LCD_WriteReg(0x000C,0x0000);
LCD_WriteReg(0x000D,0x080C);
LCD_WriteReg(0x000E,0x2B00);
LCD_WriteReg(0x001E,0x00B0);
LCD_WriteReg(0x0001,0x2B3F);//驅動輸出控制320*240 0x6B3F
LCD_WriteReg(0x0002,0x0600);
LCD_WriteReg(0x0010,0x0000);
LCD_WriteReg(0x0011,0x6070); //定義數據格式 16位色 橫屏 0x6058
LCD_WriteReg(0x0005,0x0000);
LCD_WriteReg(0x0006,0x0000);
LCD_WriteReg(0x0016,0xEF1C);
LCD_WriteReg(0x0017,0x0003);
LCD_WriteReg(0x0007,0x0233); //0x0233
LCD_WriteReg(0x000B,0x0000);
LCD_WriteReg(0x000F,0x0000); //掃描開始地址
LCD_WriteReg(0x0041,0x0000);
LCD_WriteReg(0x0042,0x0000);
LCD_WriteReg(0x0048,0x0000);
LCD_WriteReg(0x0049,0x013F);
LCD_WriteReg(0x004A,0x0000);
LCD_WriteReg(0x004B,0x0000);
LCD_WriteReg(0x0044,0xEF00);
LCD_WriteReg(0x0045,0x0000);
LCD_WriteReg(0x0046,0x013F);
LCD_WriteReg(0x0030,0x0707);
LCD_WriteReg(0x0031,0x0204);
LCD_WriteReg(0x0032,0x0204);
LCD_WriteReg(0x0033,0x0502);
LCD_WriteReg(0x0034,0x0507);
LCD_WriteReg(0x0035,0x0204);
LCD_WriteReg(0x0036,0x0204);
LCD_WriteReg(0x0037,0x0502);
LCD_WriteReg(0x003A,0x0302);
LCD_WriteReg(0x003B,0x0302);
LCD_WriteReg(0x0023,0x0000);
LCD_WriteReg(0x0024,0x0000);
LCD_WriteReg(0x0025,0x8000);
LCD_WriteReg(0x004f,0); //行首址0
LCD_WriteReg(0x004e,0); //列首址0
}
/*
*********************************************************************************************************
* 函 數 名: LCD_DispOn
* 功能說明: 打開顯示
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
void LCD_DispOn(void)
{
LCD_WriteReg(0x0007, 0x0033); /* 打開顯示 */
}
/*
*********************************************************************************************************
* 函 數 名: LCD_DispOff
* 功能說明: 關閉顯示
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
void LCD_DispOff(void)
{
LCD_WriteReg(0x0007, 0x0000); /* 關閉顯示*/
}
/*
*********************************************************************************************************
* 函 數 名: LCD_ClrScr
* 功能說明: 根據輸入的顏色值清屏
* 形 參:_usColor : 背景色
* 返 回 值: 無
*********************************************************************************************************
*/
void LCD_ClrScr(uint16_t _usColor)
{
uint32_t i;
LCD_SetCursor(0, 0); /* 設置光標位置 */
LCD_REG = LR_GRAM; /* 準備讀寫顯存 */
for (i = 0; i < LCD_HEIGHT * LCD_WIDTH; i++)
{
LCD_RAM = _usColor;
}
}
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
ssd1289.rar
(10.49 KB, 下載次數: 92)
2017-11-7 10:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
syp999
時間:
2018-12-6 14:22
只有文件,沒有整個工程,不能直接跑起來的
作者:
qqhuacong
時間:
2019-5-14 22:04
頭回學習圖形
作者:
lzhcccc
時間:
2019-9-23 09:25
qqhuacong 發表于 2019-5-14 22:04
頭回學習圖形
能用嗎?
作者:
BBMBB
時間:
2019-10-28 21:46
PS[3:0]怎么接?
作者:
JaneJiang
時間:
2020-6-11 16:31
老板 想要資料
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1