?? lcd.c
字號(hào):
/*
***********************************************************************************************************
**
** S3C44BOX ARM7TDMI MotherBoard
**
** (c) Copyright 2003-2015, yang zhi-gang
** All Rights Reserved
**
** S3C2410 LCD display Program for 1.0
**
** File Name : LCD.c
** By Write : yang Zhi-gang
** First Write : 2004-9-10 11:35
** Last Write :
** where Write : Room B201 Shenzhen International Tech-innovation Academy, Kejinan 10 Road,
** High-Tech Industrial Park,Shenzhen,China.
** Function :
** LCD_MemRead 讀顯示緩沖區(qū)的內(nèi)容
** LCD_MemWrite 寫顯示緩沖區(qū)的內(nèi)容
** LCD_Reset Reset LCD and LCD State Machine
** LCD_Init intiialized LCD
**
***********************************************************************************************************
*/
#include "S3C44B0X.h"
#include "LCD.h"
unsigned int LCD_MemRead(unsigned int *addr)
{
return *addr;
}
unsigned int LCD_MemWrite(unsigned int *addr, unsigned int b)
{
*addr = b;
return *addr;
}
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* LCD_Reset */
/* */
/* DESCRIPTION */
/* */
/* reset LCD */
/* */
/* AUTHOR */
/* */
/* designed by Nancy watertek */
/* code by Nancy watertek */
/* */
/* INPUTS */
/* */
/* None */
/* */
/* */
/* OUTPUTS */
/* */
/* None */
/* */
/*************************************************************************/
void LCD_Reset(void)
{
}
int LCD_Init(void)
{
unsigned short i,j,n;
unsigned int b,b1,b2;
unsigned dly;
LCD_Reset();
// LDR R0,=PCONB
// LDR R1,=0X7CF
// STR R1,[R0]
//設(shè)置IO口B,因?yàn)镚PB5和ADJ_DN相連,GPB4和ADJ_UP相連,將這兩pin設(shè)置output
rPCONB = 0x7cf;
// LDR R0,=PDATB
// ldr R1,=0X0
// STR R1,[R0]
//設(shè)置這兩pin為低電平,???
rPDATB = 0;
// LDR R0,=PCOND
// LDR R1,=0XAAAA
// STR R1,[R0]
//設(shè)置GPIOD,因?yàn)長(zhǎng)CD的控制腳VFRAME、VM、VLINE、VCLK、VD3、VD2、VD1、VD0與I/0共用,具體可看文檔
rPCOND = 0xaaaa;
// LDR R0,=PUPD
// mov R1,#0XFF
// STR R1,[R0]
//禁止上拉電阻,以防該腳始終為一.
rPUPD = 0xff;
// LDR R0,=PCONE
// LDR R1,=0X4500
// STR R1,[R0]
//LCD_EN用來控制是否顯示,VEE_EN用來控制電壓的開關(guān),EL_EN則是用來控制背景光,
//這三個(gè)腳通過PORTE口的GPE5,GPE7,GPE4來設(shè)置,,故將這幾個(gè)腳改為output
//注意:如果用到串口A, 則應(yīng)小心設(shè)置這個(gè)寄存器
rPCONE = 0x4500;
// LDR R0,=PDATE
// ldr R1,=0XBE
// STR R1,[R0]
//將GPE5,GPE7,GPE4設(shè)置為輸出為高電壓, ???
rPDATE = 0xbe;
// LDR R0,=PUPE
// ldr R1,=0XFF
// STR R1,[R0]
//disable 上拉電阻
rPUPE = 0xff;
// 設(shè)置ENVID = 0,這樣才使后面的設(shè)置有意義
rLCDCON1 = 0x180a0;
/* ;CLOCK
LDR R0,=PLLCON
LDR R1,=0X7C081
STR R1,[R0]
LDR R0,=CLKCON
mov R1,#0X4C0
STR R1,[R0]
;LCD
*/
// LDR R0,=DITHMODE
// LDR R1,=0X12210
// STR R1,[R0]
//設(shè)置抖動(dòng)模式,此處值只有兩種0x12210或0x0,用戶應(yīng)將此處的值改為0x12210
rDITHMODE = 0x12210;
// LDR r0,=LCDCON1
// ldr r1,=0x180a0
// str r1,[r0]
//此處在后面設(shè)置
// ldr r0,=LCDCON2
// LDR R1,=0XED3F
// STR R1,[R0]
//設(shè)置垂直寬度(LINEVAL)、水平寬度(HOZVAL)、LINEBLANK
//LINEVAL = 0x13f=319(因?yàn)榇颂幉捎玫腖CD為320*240,4bit single scan,此值為垂直像素點(diǎn)數(shù)-1)
//HOZVAL = 0x3b (因?yàn)闉?bit single scan,所以VD=4,水平為240 piexl,
// HOZVAL = ( Horizontal display size / Number of the valid VD data line) -1
// In color mode: Horizontal display size = 3 * Number of Horizontal Pixel
// In the 4-bit single scan display mode, number of valid VD data lines should be 4. In the 4-bit dual scan display or
// 8-bit single scan display mode, the number of valid VD data lines should be 8.
//LINEBLANK = 0
rLCDCON2 = 0xed3f;
// LDR R0,=LCDCON3
// mov R1,#0X0
// STR R1,[R0]
//設(shè)置刷新模式,禁止自刷新
rLCDCON3 = 0;
// LDR R0,=LCDSADDR1
// LDR R1,=0X163FB500
// STR R1,[R0]
//設(shè)置幀開始的地址及顯示模式
//MODESEL = 10 (16層灰度)
//LCD panel = 320*240, 16層灰度,單掃描
//幀起始地址為0xc500000,offset dot number = 2048 dots(512 half words)
//PAGEWIDTH = 320*4/16 =0x50 (半字?jǐn)?shù))
//OFFSIZE = 512 =0x200
//LCDBANK =0xc500000>>22 = 0x31
//LCDBASEU = 0x100000>>1= 0x80000
//LCDBASEL= 0x80000 + (0x50 + 0x200)*(0xef + 1) = 0xa2b00
// rLCDSADDR1 = 0x2<<27 + 0x31<<21 + 0x80000;
rLCDSADDR1 = 0x16280000;
// LDR R0,=LCDSADDR2
// LDR R1,=0X21A00000
// STR R1,[R0]
//BSWP Enable
//MVAL = 2
//LCDBASEL = 0xa2b00;
// rLCDSADDR2 = 1<<29 + 0x2<<21 + 0xa2b00;
rLCDSADDR2 = 0x20402b00;
// LDR R0,=LCDSADDR3
// mov R1,#0X3C
// STR R1,[R0]
// rLCDSADDR3 = 0x200<<9 + 0x50;
rLCDSADDR3 = 0x40050;
// LDR r0,=LCDCON1
// ldr r1,=0x180a1
// str r1,[r0]
//設(shè)置LINECNT(只讀)、CLKVAL、WLH、WDLY、MMODE、DISMODE、
//INVCLK、INVLINE、INVFRAME、INVVD、ENVID等等
//CLKVAL = 0x1c (由以下確立,此LCD frame_rate=60HZ)
//VCLK = MCLK/(CLKVAL*2) (CLKVAL>=2)
//VCLK(HZ) =(HOZVAL+1)/[(1/(frame_rate*(LINEVAL+1)))-((WLH+WDLY+LINEBLANK)/MCLK)]
//WLH = 00 (4 clock)
//WDLY = 00 (4 clock)
//MMODE = 0 (每一幀)
//DISMODE = 01 (4bit single scan)
//INVCLK = 0 (下降沿)
//INVLINE = 0 (Normal)
//INVFRAME = 0 (Normal)
//INVVD = 0 (Normal)
//ENVID =1 (注:使能,應(yīng)該在所用到的寄存器都設(shè)置好以后,才能使能,這樣打出來的點(diǎn)才一一對(duì)應(yīng))
rLCDCON1 = 0x1c0a1;
/* mov r0,#7
ldr r1,=PDATB
LOOP1 CMP R0,#0
BEQ OUT
MOV R2,#0X20
STR R2,[R1]
MOV R2,#0X0
STR R2,[R1]
SUB R0,R0,#0X1
B LOOP1
*/
/*降電壓* /
/*其中GPB5一個(gè)上升沿電平上升0.1伏特,*/
/*GPB4一個(gè)上升沿電平下降0.1伏特,因此可在調(diào)試時(shí)設(shè)置來調(diào)電壓。*/
/*本LCD電壓因電路板設(shè)置上電時(shí)電壓為22.6V,而適合電壓為22V,*/
/**即需在GPB5上連續(xù)6個(gè)上升沿****************************/
for(i=0;i<7;i++)
{
rPDATB = 0x20;
rPDATB = 0x0;
}
return(0);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -