📄 lcd.c
字号:
/*
***********************************************************************************************************
**
** 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 读显示缓冲区的内容
** LCD_MemWrite 写显示缓冲区的内容
** 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]
//设置IO口B,因为GPB5和ADJ_DN相连,GPB4和ADJ_UP相连,将这两pin设置output
rPCONB = 0x7cf;
// LDR R0,=PDATB
// ldr R1,=0X0
// STR R1,[R0]
//设置这两pin为低电平,???
rPDATB = 0;
// LDR R0,=PCOND
// LDR R1,=0XAAAA
// STR R1,[R0]
//设置GPIOD,因为LCD的控制脚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用来控制电压的开关,EL_EN则是用来控制背景光,
//这三个脚通过PORTE口的GPE5,GPE7,GPE4来设置,,故将这几个脚改为output
//注意:如果用到串口A, 则应小心设置这个寄存器
rPCONE = 0x4500;
// LDR R0,=PDATE
// ldr R1,=0XBE
// STR R1,[R0]
//将GPE5,GPE7,GPE4设置为输出为高电压, ???
rPDATE = 0xbe;
// LDR R0,=PUPE
// ldr R1,=0XFF
// STR R1,[R0]
//disable 上拉电阻
rPUPE = 0xff;
// 设置ENVID = 0,这样才使后面的设置有意义
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]
//设置抖动模式,此处值只有两种0x12210或0x0,用户应将此处的值改为0x12210
rDITHMODE = 0x12210;
// LDR r0,=LCDCON1
// ldr r1,=0x180a0
// str r1,[r0]
//此处在后面设置
// ldr r0,=LCDCON2
// LDR R1,=0XED3F
// STR R1,[R0]
//设置垂直宽度(LINEVAL)、水平宽度(HOZVAL)、LINEBLANK
//LINEVAL = 0x13f=319(因为此处采用的LCD为320*240,4bit single scan,此值为垂直像素点数-1)
//HOZVAL = 0x3b (因为为4bit 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]
//设置刷新模式,禁止自刷新
rLCDCON3 = 0;
// LDR R0,=LCDSADDR1
// LDR R1,=0X163FB500
// STR R1,[R0]
//设置帧开始的地址及显示模式
//MODESEL = 10 (16层灰度)
//LCD panel = 320*240, 16层灰度,单扫描
//帧起始地址为0xc500000,offset dot number = 2048 dots(512 half words)
//PAGEWIDTH = 320*4/16 =0x50 (半字数)
//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]
//设置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 (注:使能,应该在所用到的寄存器都设置好以后,才能使能,这样打出来的点才一一对应)
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一个上升沿电平上升0.1伏特,*/
/*GPB4一个上升沿电平下降0.1伏特,因此可在调试时设置来调电压。*/
/*本LCD电压因电路板设置上电时电压为22.6V,而适合电压为22V,*/
/**即需在GPB5上连续6个上升沿****************************/
for(i=0;i<7;i++)
{
rPDATB = 0x20;
rPDATB = 0x0;
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -