基于mini2440按键控制电子相册(裸机代码)

发布者:zhihua最新更新时间:2020-05-13 来源: eefocus关键字:mini2440  按键控制  电子相册 手机看文章 扫描二维码
随时随地手机看文章


#define  GLOBAL_CLK 1

#include "def.h"

#include "option.h"

#include "2440addr.h"

#include "profile.h"

 

#define LCD_WIDTH 320 //屏幕宽度

#define LCD_HEIGHT 240 //屏幕高度

#define CLKVAL 4 //时钟信号

 

//垂直同步信号的脉宽、后肩和前肩

#define VSPW (2-1)

#define VBPD (11-1)

#define VFPD (5-1)

 

//水平同步信号的脉宽、后肩和前肩

#define HSPW (2-1)

#define HBPD (69-1)

#define HFPD (5-1)

 

//显示尺寸

#define HOZVAL (LCD_WIDTH-1)

#define LINEVAL (LCD_HEIGHT-1)

 

#define LED1_on  rGPBDAT = ((0xf<<5)^(1<<5))  //GPB5=0

#define LED4_on  rGPBDAT = ((0xf<<5)^(1<<8)) //GPB8=0

#define LED_off  rGPBDAT = (0xf<<5) //GPB5=1,GPB6=1,GPB7=1,GPB8=1

 

//定义显示缓存,volatile声明编译不对此进行优化,直接读取原始地址

volatile static U16 LCD_BUFFER[LCD_HEIGHT][LCD_WIDTH];

//声明为静态函数,仅在本文件可见,其他文件不能使用该函数

static void LCD_IO_init(void);

static void LCD_init(void);

static void LCD_POWER(void);

 

void CLK_init(void);

void LCD_on(void);

void LCD_off(void);

void LCD_clear(U16 n);

void BMP_display(int x0,int y0,int x1,int y1,const U8 *bmp);

 

extern unsigned char gImage_1[]; //extern声明引用外部数组

extern unsigned char gImage_2[];

extern unsigned char gImage_3[];

extern unsigned char gImage_4[];

extern unsigned char gImage_5[];

extern unsigned char gImage_6[];

extern unsigned char gImage_7[];

extern unsigned char gImage_8[];

 

/********************************** 

*主函数

**********************************/

void Main(void)

{

    U16 n;

//保存各张图片的尺寸

    U16 num[8][2]={320,240,320,240,320,240,320,240

,320,240,320,240,320,240,320,240};

    U8 *photo[8]={

    gImage_1,gImage_2,

    gImage_3,gImage_4,

    gImage_5,gImage_6,

    gImage_7,gImage_8,

};

    rGPBCON=(01<<00);//关闭蜂鸣器

    rGPBDAT=0x00;

    rGPGCON=((0<<1)|(0<<11)); //GPG0,GPG5为输入,即按键KEY1和KEY3输入

rGPBCON = ((1<<16)|(1<<14)|(1<<12)|(1<<10)); //GPB5~8设为输出 

LED_off;

    CLK_init();

LCD_POWER();

    LCD_IO_init();

    LCD_init();

    LCD_on();

    LCD_clear((0x1f<<11)|(0x3f<<5)|(0x1f) )  ;        //清屏显示白色

    BMP_display(0, 0, num[0][0], num[0][1], photo[0]); //显示第一张图片

n=0;

    while(1)

    { 

/*利用轮询对按键实行扫描,外加goto调转实现去抖,

可以利用中断对按键检测则去抖问题即可解决*/

m:

if(!(rGPGDAT&(1<<0))) //当KEY1按下

{

LED1_on;

n++;

            BMP_display(0, 0, num[n][0], num[n][1], photo[n]);

if(n>7) n=0; //未超出数组范围n自加

if(!(rGPGDAT&(1<<0))) //若按键未放开则进入goto等待按键放开

{

loop1: 

if(rGPGDAT&(1<<0)) goto m; //若按键放开再次进入

else //goto返回等待下一次按下

goto loop1;

}

        }

else 

k:

if(!(rGPGDAT&(1<<5))) //当KEY3按下

{

LED4_on;

if(n==0) n=7; //未超出数组范围n自减

n--;

BMP_display(0, 0, num[n][0], num[n][1], photo[n]);

if(!(rGPGDAT&(1<<5)))

{

loop2: 

if(rGPGDAT&(1<<5)) goto k;

else

goto loop2;

}

}

    }

}

 

/********************************** 

*时钟初始化

**********************************/

void CLK_init(void)

{

    rMPLLCON &= ~0xFFFFF;

    rMPLLCON |= (127<<12)|(2<<4)|1; //初始化FCLK为405M

    rCLKDIVN = (2<<1)|1; //HCLK = FCLK/4 =100M,PCLK = HCLK/2 = 50M

}

 

/********************************** 

*LCD端口初始化

**********************************/

static void LCD_IO_init(void)

{

    rGPCUP=0xff; //GPC口上拉电阻不可用

    rGPCCON=0xaaaa02aa;//GPC8-15设置为VD, VM,VFRAME,VLINE,VCLK,LEND

 

    rGPDUP=0xff; //GPD口上拉电阻不可用

    rGPDCON=0xaaaaaaaa; //GPD0-15设置为VD

}

 

/********************************** 

*LCD电源管理

**********************************/

static void LCD_POWER(void)

{

rGPGUP=(1<<4);

rGPGCON=(3<<8); //GPG4设置为LCD_PWREN

rLCDCON5=(1<<3); //Enable PWREN signal

}

 

/********************************** 

*LCD初始化

**********************************/

static void LCD_init(void)

{

    rLCDCON1=(CLKVAL<<8)|(3<<5)|(12<<1)|(0<<0); //VCLK=10M,TFT LCD,16bpp

    rLCDCON2=(VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW);

    rLCDCON3=(HBPD<<19)|(HOZVAL<<8)|(HFPD);

    rLCDCON4=HSPW;

/*5:6:5Format,Enable PWREN signal,Swap Enable*/

    rLCDCON5=(1<<11)|(1<<9)|(1<<8)|(1<<3)|1;

/*显存起始地址[30:22]保存到LCDSADDR1[29:21],显存始地址[21:1]位

保存到LCDSADDR1[20:0],显存结束地址[21:1]保存到LCDSADDR2[20:0]*/

    rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|(((U32)LCD_BUFFER&0x3fffff)>>1);

    rLCDSADDR2=(((U32)LCD_BUFFER+LCD_WIDTH*LCD_HEIGHT*2)>>1)&0x1fffff;

    rLCDSADDR3=LCD_WIDTH; //设置虚拟屏设置为屏幕宽度,没有可以不设置

    rTPAL=0; //临时调色板不可用

    rLCDINTMSK |=3; //屏蔽 LCD 中断

    rTCONSEL &=~(0x17); //LCC3600,LPC3600不可用

}

 

/********************************** 

*LCD开启

**********************************/

void LCD_on(void)

{

    rLCDCON1 |=1; //利用LCDCON1控制相关参数实现开启LCD

}

 

/********************************** 

*LCD关闭

**********************************/

void LCD_off(void)

{

    rLCDCON1 &=~1; //利用LCDCON1控制相关参数实现关闭LCD

}

 

/********************************** 

*刷新背景颜色

**********************************/

void LCD_clear(U16 n)

{

    U32 x,y;

    for(y=0;y    {

        for(x=0;x        {

            LCD_BUFFER[y][x]=n;

        }

    }

}

 

/********************************** 

*BMP数组图片显示

**********************************/

void BMP_display(int x0,int y0,int x1,int y1,const U8 *bmp)

{

    int x,y,p=0;

    U32 data;

    for(y=0;y    {

        for(x=0;x        {

            data=(bmp[p]<<8|bmp[p+1]);

            if((x0+x)                LCD_BUFFER[y0+y][x0+x]=data;

            p=p+2;

        }

    }

}

关键字:mini2440  按键控制  电子相册 引用地址:基于mini2440按键控制电子相册(裸机代码)

上一篇:基于mini2440的按键中断控制LED(裸机代码)
下一篇:mini2440按键裸机程序编写运行

推荐阅读最新更新时间:2024-10-15 15:01

基于MINI2440开发板的LED流水灯实验(含init.s)
晚上看完了S3C2140A的GPIO开发部分,然后对着2440的数据手册写了个LED的小程序,总结下,程序如下: 初始化部分程序: Init.s IMPORT Main CODE32 AREA Init,CODE,READONLY ENTRY ldr r0, =0x53000000 ;关门狗 mov r1, #0x0 str r1, ;关闭关门狗 ldr sp, =1024*4 ;设置堆栈,由于main函数里调用了其他函数,所以一定要设置堆栈 bl Main main
[单片机]
STM32(二)之GPIO操作(2)——通过按键控制LED灯的开关
STM32是一款低功耗的芯片,所以其外设均有一个与之对应的时钟,而在芯片刚上电的时候这些时钟是被关闭的,所以如果想要外设工作,便必须将与之对应的时钟打开。 本文介绍如何基于GPIO来通过按键控制LEN灯的开关。 (1)按键的控制 上图所示为按键的电路,在按键未被按下的时候,KEY2的输出信号为低电平(按键所在的电路不通,其与地相连);在按键按下时,KEY2的输出状态为高电平(按键所在的电路导通,其与3.3V的电源相连)。因此,通过对引脚的电平进行检测便可以判断按键是否按下。 按键的机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳点接通或断开,其会产生如下图所示的带波纹信号,需要使用软
[单片机]
构建MINI2440开发板Ubuntu开发环境
1 引言   做嵌入式开发,调试开发板最常使用的工具就是串口和网口,本文主要介绍在 Ubuntu 系统如何安装和设置串口软件(minicom和kermit)连接MINI2440开发板。本文假设你已经在电脑上安装了Ubuntu系统。   对于现今大多数的笔记本而言,主板上一般都没有配置串口接口。我们可以在网上购买到USB口转串口接口,网上有很多种类型的USB转接口,可以根据价格选择一个合适的就行。这里使用的是基于PL2303芯片的USB转接口。 2 连接MINI2440开发板   将USB串口转接器插上开发板和电脑后,在终端上敲dmesg命令,可以查看USB转接口已经被PC识别,如下图所示:   从上图中我们可以看到我们所连接的
[单片机]
构建<font color='red'>MINI2440</font>开发板Ubuntu开发环境
u-boot-2009.08在mini2440上的移植 增加yaffs2文件系统
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-eabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 5.1,添加Yaffs2镜像烧写功能 由于现在很多使用Nand Flash 的系统,在Linux 下都用Yaffs2作为存储数据的文件系统,甚至是根文件系统。所以在BootLoader 下能够烧写Yaffs2 映像文件变得很必要。对于Yaffs2 映像烧写的支持其实
[单片机]
mini2440上移植使用FFmpeg录像
最近想在板子上插个摄像头,录个像,搞了两三天,算是能用人家的ffmpeg程序在自己的板子上摄像,然后将文件.avi格式保存到PC机上了。过程有些曲折,但是也算乱撞了。 (1)编译x264 官网上下了个最新的x264,地址在这里。解压之后,参考【1】用了个./configure --disable-asm,改写了下config.mak,改写ARCH=ARM SYS=LINUX CC=arm-linux-gcc,其中CC写成你自己的交叉编译环境位置,相应的AR、RANLIB也是,我的部分修改的config.mak如下: prefix=/usr/local exec_prefix=${prefix} bindir=${exec_pref
[单片机]
在<font color='red'>mini2440</font>上移植使用FFmpeg录像
mini2440裸机编程--------LCD驱动
记录一下lcd编程的过程。文章有一部分是转载的。 要想正确使用LCD,必须注意两点:1、时序;2、显示缓存区。 1、时序 LCD一般需要三个时序信号:VSYNC、HSYNC和VCLK。VSYNC是垂直同步信号,在每进行一个帧(即一个屏)的扫描之前,该信号就有效一次,由该信号可以确定LCD的场频,即每秒屏幕刷新的次数(单位Hz)。HSYNC是水平同步信号,在每进行一行的扫描之前,该信号就有效一次,由该信号可以确定LCD的行频,即每秒屏幕从左到右扫描一行的次数(单位Hz)。VCLK是像素时钟信号。 s3c2440处理LCD的时钟源是HCLK,通过寄存器LCDCON1中的CLKVAL可以调整VCLK频率大小,它的公式为:
[单片机]
<font color='red'>mini2440</font>裸机编程--------LCD驱动
mini2440编译2.6.39.4内核
mini2440编译2.6.39.4内核 # cat /proc/version Linux version 2.6.40.3-0.fc15.i686.PAE (mockbuild@x86-16.phx2.Fedoraproject.org) (gcc version 4.6.0 20110603 (Red Hat 4.6.0-10) (GCC) ) #1 SMP Tue Aug 16 04:17:30 UTC 2011 //the host version is 2.6.40.3,fedora 15 //the kernel vision used to compiled is 2.6.39.4 #
[单片机]
mini2440裸机试炼之——IIC控制EEPROM数据传输
内容: 向EEPROM(AT24C02)内部地址0x00—0xff,依次写入0x00—0xff,然后再读出数据。 IIC总线介绍: IIC(Inter-IntegratedCircuit,I2C)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微处理器及其外围设备。在iic总线上,只需要两条线:串行数据线SDA和串行时钟线SCL,便可完成通信 IIC要点 1、清IIC中断标志语句rIICCON&= ~0x10;一定要在读写寄存器IICDS的后面,中断是读写寄存器后发生的; 2、由于EEPROM的读取速度并不快,所以每次读写中断都需要短暂的延时函数; 3、在对AT24C02A进行读取数据时,在发送带有读命
[单片机]
<font color='red'>mini2440</font>裸机试炼之——IIC<font color='red'>控制</font>EEPROM数据传输
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved