⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 本源码为ARM三星2410芯片
💻 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 + -