历史上的今天
今天是:2024年11月08日(星期五)
2021年11月08日 | MINI2440裸机实验之LCD
2021-11-08 来源:eefocus
硬件部分
上诉文章中使用的LCD都是常规液晶显示器,但在查看原理图及液晶数据手册时发现我使用的MINI2440开发板上自带的液晶跟文中的液晶并不一致,区别主要体现在只有DE、CLK和RGB引脚,该液晶型号为TD35-TD035STEB2,其时序图如下。
从时序图中可以看出,DE为该液晶屏的主要控制引脚,通过控制DE引脚的下拉就可以控制液晶屏的刷新,但有一个问题就是如何使用s3c2440的LCD控制器来控制该液晶屏呢?
这里我进行了这样的尝试,认为上图中的Tvdisp = LINEVAL +1 ;Tvblank = VSPW+1+VBPD+1;VFPD+1 = 0;Thdisp = HOZVAL+1;
Thblank = HSPW+1 + HBPD+1;HFPD+1 = 0;
其他部分参考了mini2440硬件篇之LCD并对本液晶的特点进行了相应的修改,最终的程序共包含3个文件:
lcd.c
/* lcd.c */
#define rLCDCON1 (*(volatile unsigned int *)0x4D000000)
#define rLCDCON2 (*(volatile unsigned int *)0x4D000004)
#define rLCDCON3 (*(volatile unsigned int *)0x4D000008)
#define rLCDCON4 (*(volatile unsigned int *)0x4D00000C)
#define rLCDCON5 (*(volatile unsigned int *)0x4D000010)
#define rLCDSADDR1 (*(volatile unsigned int *)0x4D000014)
#define rLCDSADDR2 (*(volatile unsigned int *)0x4D000018)
#define rLCDSADDR3 (*(volatile unsigned int *)0x4D00001C)
#define rGPCCON (*(volatile unsigned int *)0x56000020)
#define rGPCUP (*(volatile unsigned int *)0x56000028)
#define rGPDUP (*(volatile unsigned int *)0x56000038)
#define rGPDCON (*(volatile unsigned int *)0x56000030)
#define LCD_WIDTH 240
#define LCD_HEIGHT 320
#define M5D( n ) ( ( n ) & 0x1fffff )
volatile static unsigned short LCD_BUFFER[LCD_HEIGHT][LCD_WIDTH];
#define LCD_ADDR ( (unsigned long)LCD_BUFFER )
void delay(volatile unsigned long count)
{
while(count--);
}
void LCDInit(void)
{
rGPCUP = 0xffffffff;//Disable Pull-up register
rGPCCON = 0xaaaa02a8;//设置GPC各引脚对应引脚功能为 VD[7...0],VM,VFRAME,VLINE,VCLK
rGPDUP = 0xffffffff;//Disable Pull-up register
rGPDCON = 0xaaaaaaaa;//设置VD[15:8]
rLCDCON1 = (6 << 8) | (3 << 5) | (0x0C << 1);
rLCDCON2 = (2 << 24) | ((320 - 1) << 14) | (9 << 0);
rLCDCON3 = (8 << 19) | ((240 - 1) << 8);
rLCDCON4 = (70 << 0);
rLCDCON5 = (1 << 11) | (1 << 0);
rLCDSADDR1 = ( ( LCD_ADDR >> 22 ) << 21 ) | ( ( M5D ( LCD_ADDR >> 1 ) ) << 0 );
rLCDSADDR2 = M5D ( ( LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2 ) >> 1 );
rLCDSADDR3 = LCD_WIDTH;
}
void LCDClearScreen( unsigned short usColor)
{
unsigned int x,y ;
for( y = 0 ; y < LCD_HEIGHT ; y++ )
{
for( x = 0 ; x < LCD_WIDTH ; x++ )
{
LCD_BUFFER[y][x] = usColor ;
}
}
}
void main(void)
{
unsigned int x,y,z=0x0000;
LCDInit();
for(x=0;x<320;x++)
{
for(y=0;y<240;y++)
{
LCD_BUFFER[x][y] = z++;
}
}
rLCDCON1 |= 1;
while(1)
{
}
}
start.S
.text
.global _start
_start:
ldr r0,=0x53000000
mov r1,#0x00
str r1,[r0] /* disable the watchdog timer */
ldr sp,=0x34000000 /* set stack pointer */
b main
Makefile
objs := start.o lcd.o
lcd.bin:$(objs)
arm-linux-ld -Ttext 0x30000000 -o lcd_elf $^
arm-linux-objcopy -O binary -S lcd_elf $@
arm-linux-objdump -D -m arm lcd_elf > lcd.dis
%.o:%.c
arm-linux-gcc -c -o $@ $<
%.o:%.S
arm-linux-gcc -c -o $@ $<
clean:
rm -f lcd_elf *.o
这里要说明的是,这个程序编译完成之后将不在使用JLINK进行下载,而使用友善之臂提供的工具MINITools来直接下载至SDRAM来之前,这个可以从Makefile中的链接地址以及start.S的文件内容看出来,之前不使用该方法下载的原因是为了熟悉及实践SDRAM的操作。
该程序最终的显示效果如下图所示
史海拾趣
|
原理图有了,可是不会选择材料,不知道各个电子元器件都应该是什么型号,有大虾能帮帮忙指点下吗?电流响铃瞬间是90V交流电。标明SCR的并不是可控硅,应该是双向晶闸管输出型光耦。 [ 本帖最后由 sky880502 于 2010-3-22 09:57 编辑 ]… 查看全部问答> |
|
我点击另外一个按钮想更换之前创建的btn背景图,所以就采用向btn窗口句柄发送消息 sendMessage(g_Wnd,BM_SETIMAGE,(WPARAM)IMAGE_BITMAP,(LPARAM)bitmap);---->在CE中提示 error C2065: \'BM_SETIMAGE\' : undeclared identifier BM_SETIMAGE--- ...… 查看全部问答> |
|
硬件街机游戏开发,单片机游戏开发,CPLD/FPGA、ARM平台游戏开发群成立 本超级QQ群成立,上限人数为500。 目标是发展中国游戏产业,提升硬件游戏开发技术交流。提供大的平台。 发展的方向是游戏动漫相结合,此群不是网络游戏开发,为单板街机游戏开发。 所属第三产业。以电脑板游戏开发为主体,希望大家能在这个平 ...… 查看全部问答> |
|
最近做个抢答器,用nrf24l01做无线收发模块,单片机控制,其实做的时候思路不是很清晰,看了datasheet还有网上一个程序,他原本是用个3v的单片机做的,我用的这个是5v的,MI,MO,SCK口都是接的P1口那几个最后好像没什么反应,我是直接接上去的...昨天看了下 ...… 查看全部问答> |
|
短学期的实习内容是dds信号发生器的设计,单片机老师要求用430,查了几天资料还是一头雾水,想知道msp430f149跟ad9850的管脚是怎么接的,求高手赐教。… 查看全部问答> |
|
求助 电脑耳机孔输出的信号怎样接到ADC0809的输入端 [ 本帖最后由 chinauk 于 2011-10-15 16:42 编辑 ]… 查看全部问答> |






