版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.深 圳 大 学 实 验 报 告实验课程名称: 实验项目名称: 基于ARM7芯片的数码相框开发 学院: 计算机与软件学院 专业: 软件工程 报告人: 学号: 班级: 同组人:学号: 班级: 指导教师: 实验时间: 2009-10-12 2010-9-12 实验报告提交时间: 教务处制实验目的与要求:(1) 了解ARM指令集;(2) 掌握直入键盘与矩阵键盘的原理和键盘寄存器的功能;(3) 掌握图像处理算法;(4) 掌握配置LCD控制器实现显示图片与文字。(5) 使用实验箱实现数码相框的功能;(6) 了解AXD Debugger 仿真调试的使用方法;(7) 掌握8 段码的知识;方法、步骤:系统设计
2、思路:实验中使用的硬件设备是实验箱的LCD显示模块,LED显示模块,4*4键盘模块。系统开始时,先显示开机图片,然后进入图片播放模式,当有按键捕获信号时,在LED上显示相应的值并进入相对应的按键中断程序。当要进行图片处理时,使用按键上一张或下一张选择要处理的图片、再按对应的图片处理按键进行图片处理。系统流程图:以上为整个系统简要流程图,之后各种模块实现皆是为此展开。LCD显示图片原理: 在系统内会有一段存储空间与显示屏的像素点对应,通过改变该存储空间的内容,从而改变显示屏的内容,该存储空间被称为Frame Buffer,或显存,显示屏上的每一点都必然与Frame Buffer 里的某一位置对应
3、,所以解决显示屏的显示问题,首先需要解决的是Frame Buffer 的大小以及屏上的每一象素与Frame Buffer 的映射关系。按照显示屏的性能或显示模式区分,显示屏可以以单色或彩色显示,我们的数码相框采用的是16位色(65536 种颜色)显示。计算机反映自然界的颜色是通过RGB 值来表示的,如果要在屏幕某一点显示某种颜色,则必须给出响应的RGB 值,Frame Buffer 为屏幕提供显示的内容,就必须能够从Frame Buffer里得到每一个象素的RGB 值,在16 位/象素的模式下,Frame Buffer 里的每个单元16 位,每个单元代表一个象素的RGB 值,如下图显示: Fr
4、ameBufferSize的大小计算公式如下图,所以640480,16 位/象素,单屏幕模式,Frame buffer 大小为614400 个字节。我们使用image2LCD软件将图片装换成数组形式,数组开始的8个数据为图片信息,之后数组中每2个数据为一个像素点的颜色,由数组开始的8个数据得出图片大小,按顺序排列之后数据便可在LCD中显示整个图片。由于长度问题,存在高8位与低8位,所以像素点的对应RGB值为后一个数据左移8位再加上前一个数据。LCD像素显示主要函数:void lcd_put_pixel(int x,int y,unsigned char c) long int base_add
5、r; base_addr = 0xa0500000; if(x1280 & y480)/限制图片显示范围 (*(unsigned char *)(base_addr+y*1280+x) = c;4*4键盘捕获原理: 通过调用直入键盘接口和矩阵键盘、并初始化和调用键盘寄存器,实现了4*4键盘同时使用,使得系统可以通过键盘的按键来驱动8 段数码管的点亮(在此实验中,LED的点亮是为了检验按键是否正常,在日后版本中此功能可去掉)和做出相应图片处理效果。4*4键盘的主要功能:系统进入图片处理时,通过按键捕获进行相应的图片处理效果。同时也会显示相应的LED。(测试期间方便检验按键是否正确)实验过程及内容
6、:图像处理算法:(所有效果图请见数据处理分析)正常图片显示:(之后所有图像处理的基础) 判断图片数组前8个数据得到图片长宽后,通过LCD像素显示主要函数按顺序把图片数组数据填充到Frame Buffer中,最终LCD得以把图片显示出来。(之后各图像处理算法均通过此算法基础进行修改得来)图片放大:图片放大采用整数倍放大,简单来说就是原来一个像素点在放大后显示4个像素点。例如2倍放大时就是将每个像素点的颜色填充为以他为左上角的2*2矩形的4个像素点,此时图片长宽都增大一倍实现图像放大效果。灰度效果:灰度效果就是将图像各个像素的RGB值提取出来进行加权运算后再填充回去,便可达到灰度效果。值得注意的是
7、,在本实验中,加权运算之前G值需要右移一位(因为本实验中LCD显示的R、G、B长度分别为5、6、5,经过实验多次尝试,要得到灰度需要在加权运算中保持长度一致),加权运算后G值再左移一位,并RGB值判断是否溢出。图片镜像: 镜像变换是指将指定区域的图像左右翻转地显示在屏幕。分析镜像变换过程可以发现:每行图像信息的处理方式是相同的,而且行顺序不发生变化,只是每一行的像素信息按从左到右的顺序进行了左右颠倒,从而实现了镜像变换。因此,采用按行逐点变换的方式实现图像的镜像。图片缩小:图片缩小采用整数倍缩小,简单来说就是像素点间隔显示。例如2倍缩小时就是将像素点矩阵的奇数坐标保留,偶数坐标舍去来实现图像缩
8、小效果。石雕效果: 浮雕效果就是只将图像的变化部分突出出来,而相同颜色部分则被淡化,使图像出现纵深感,从而达到浮雕效果,实验采用的算法是将要处理的像素取值为与处于对角线上的另一个像素间的差值,然后在让对应的RGB值分别加上16、32、16,作为新像素点的值。颜色翻转: 反色的原理是将R、G、B值反转。用0XFF减去数组中的每一个值即可以得到新的数组,在对应显示即可。旋转90:图片旋转的原理就是将像素点矩阵旋转90,然后将再将新的矩阵显示出来。如下图:百叶窗效果: 图片百叶窗效果显示就是显示图片时按一定的数目间隔显示(实验中取10)。例如纵向的百叶窗效果就是当第1列显示完毕后显示第11列,当超多
9、图片长度后回到第2列显示,如此类推知道显示完图片。图像切换的算法:程序一开始声明一指针,通过按键捕获和指针切换指向不同的图像数组便可实现不同图片间的切换。以此为基础,实现了图片的幻灯片播放效果、下一张和上一张的切换等。下一张图片切换的流程图:数据处理分析:图像放大:(左边为原图(正常效果),右边为效果图) 灰度效果:(左边为原图,右边为效果图) 镜像效果:(左边为原图,右边为效果图) 图像缩小:(左边为原图,右边为效果图) 石雕效果:(左边为原图,右边为效果图) 颜色翻转:(左边为原图,右边为效果图) 旋转90:(左边为原图,右边为效果图) 百叶窗效果:(左边为原图,中间为横向效果图,右边为纵
10、向效果图) 图像切换效果:数目相框市场调研与功能设想PPT:数码相框功能实现PPT:实验结论:通过本次实验,使我对汇编与C语言混合编程,掌握了8 段码的知识,直入键盘与矩阵键盘的原理和键盘寄存器的功能有了更深入的了解,并清楚了解到如何配置LCD控制器,实现显示图片与文字,还有学会许多图像处理算法。在实验中,使得自己学到的东西得以学以致用,并成功实现各种功能,那种喜悦心情令人难以忘怀。但同时在实验中也认识到了自己学习中的不足。在实验中遇到关于过不少的难题,如:图像显示的实验、系统架构、图像处理方面的算法等。但通过与队友相互讨论,上网或去图书馆找资料,最终都一一克服了这些难题并最后成功地完成实验。
11、期间不仅增强了自己团队合作能力与自我学习能力,更使自己的编程能力在本次实验中得到了很大的提升。虽然本次实验完成的数码相框还有一些代码没有很好完善,例如实数倍缩放,任意角度旋转等功能。功能效果方面也还存在一些不足,例如图像不能二次处理,图像压缩,缺少系统菜单等不足。但我相信通过本次实验种种成功的、不足的、失败的经验,能使我在日后的实验中更好地发挥,并使我不断进步。缺陷与不足是在所难免的,但它们却能鞭策我向前。指导教师批阅意见:成绩评定: 指导教师签字: 年 月 日备注:注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。附
12、录:(源程序代码)library_register.s EXPORT gpio_GPDR1 EXPORT gpio_GPDR2 EXPORT gpio_GAFR1_U EXPORT gpio_GAFR2_L EXPORT init_GPDR1 EXPORT init_GPDR2 EXPORT init_GAFR1_U EXPORT init_GAFR2_L EXPORT desc_word_0 EXPORT desc_word_1 EXPORT desc_word_2 EXPORT desc_word_3 EXPORT init_word_0 EXPORT init_word_1 EXPORT
13、 init_word_2 EXPORT init_word_3 EXPORT LCCR0 EXPORT LCCR1 EXPORT LCCR2 EXPORT LCCR3 EXPORT FBR0 EXPORT FBR1 EXPORT LCSR EXPORT LIIDR EXPORT FDADR0 EXPORT FDADR1 EXPORT init_LCCR0 EXPORT init_LCCR1 EXPORT init_LCCR2 EXPORT init_LCCR3 EXPORT init_FBR0 EXPORT init_FBR1 EXPORT init_FDADR0 EXPORT backlig
14、ht_cs EXPORT lcdlight EXPORT MDCNFG EXPORT MDREFR EXPORT MSC0 EXPORT MSC1 EXPORT MSC2 EXPORT MECR EXPORT SXCNFG EXPORT SXMRS EXPORT MDMRS EXPORT BOOT_DEF EXPORT init_MDCNFG EXPORT init_MDREFR EXPORT init_MSC0 EXPORT init_MSC1 EXPORT init_MSC2 EXPORT init_MECR EXPORT init_SXCNFG EXPORT init_SXMRS EXP
15、ORT init_MDMRS EXPORT init_BOOT_DEF AREA library_register ,DATA ,READONLY;GPIO configurationgpio_GPDR1 EQU 0x40e00010gpio_GPDR2 EQU 0x40e00014gpio_GAFR1_U EQU 0x40e00060gpio_GAFR2_L EQU 0x40e00064init_GPDR1 EQU 0xfc000000init_GPDR2 EQU 0x7fffinit_GAFR1_U EQU 0xaaa00000init_GAFR2_L EQU 0x2aaaaaaa;Fra
16、me Descriptordesc_word_0 EQU 0xa0300000desc_word_1 EQU 0xa0300004desc_word_2 EQU 0xa0300008desc_word_3 EQU 0xa030000cinit_word_0 EQU 0xa0300000init_word_1 EQU 0xa0500000init_word_2 EQU 0x0init_word_3 EQU 0x00096000;LCD ControllerLCCR0 EQU 0x44000000 LCCR1 EQU 0x44000004LCCR2 EQU 0x44000008LCCR3 EQU
17、0x4400000CFBR0 EQU 0x44000020FBR1 EQU 0x44000024LCSR EQU 0x44000038LIIDR EQU 0x4400003CFDADR0 EQU 0x44000200FDADR1 EQU 0x44000210init_LCCR0 EQU 0x7b008f9;3b008f8;003008f8init_LCCR1 EQU 0x6481067f;530fee7finit_LCCR2 EQU 0x220001df;210a05dfinit_LCCR3 EQU 0x4400006;0440ff07init_FBR0 EQU 0x0init_FBR1 EQ
18、U 0x0init_FDADR0 EQU 0xa0300000backlight_cs EQU 0x08000000lcdlight EQU 0x80;Memory ControllerMDCNFG EQU 0x48000000MDREFR EQU 0x48000004MSC0 EQU 0x48000008MSC1 EQU 0x4800000cMSC2 EQU 0x48000010MECR EQU 0x48000014SXCNFG EQU 0x4800001CSXMRS EQU 0x48000024MDMRS EQU 0x48000040BOOT_DEF EQU 0x48000044init_
19、MDCNFG EQU 0x02000ac9init_MDREFR EQU 0x0011e018init_MSC0 EQU 0x95c095c0init_MSC1 EQU 0xb884a691init_MSC2 EQU 0x7ff4b88cinit_MECR EQU 0x1init_SXCNFG EQU 0x0;6011init_SXMRS EQU 0x0init_MDMRS EQU 0x320032init_BOOT_DEF EQU 0x00000008ENDlibrary_variant.sEXPORTpostDelayEXPORT stack_myselfAREA library_vari
20、ant ,DATA ,READONLYpostDelayEQU0x1000stack_myself EQU 0xa0700000ENDos_lcd.cextern void print_3232(char *,int, int);/extern void print_0808(char *,int, int);/extern void print_0813(char *,int, int);extern void print_song2312(char *, int, int);extern void disable_lcd(void);extern void enable_lcd(void)
21、;extern void lighton1(void);extern void lighton2(void);extern void lightoff1(void);extern void lightoff2(void);/extern void typename(void);extern char gImage_00;extern char gImage_01;extern char gImage_02;extern char gImage_03;extern char gImage_04;extern char gImage_4114;extern char gImage_123;exte
22、rn char gImage_pic;extern char gImage_111;extern char gImage_11;extern char gImage_22;extern char gImage_33;extern char gImage_0;extern char gImage_1;extern char gImage_2;extern char gImage_3;extern char gImage_4;extern char gImage_5;extern void print_pic(char *);extern void print_pic1(char *);exter
23、n void print_pic2(char *);extern void print_pic5(char *);extern void print_pic6(char *);extern void print_pic7(char *);extern void print_pic8(char *);extern void print_pic9(char *);extern void print_pic10(char *);extern void print_pic_test(char *);extern void print_pic_exchange(char *);extern void p
24、rint_pic_exchange2(char *);extern void screen_clean(int);/extern char word_1324 ;/extern char word_2324 ;/extern char word_3324 ;/extern char word_4324 ;/extern char word_5324 ;/extern char word_6324 ;/extern char word_7324 ;/extern char character8_8;/extern char character8_13;extern char song2312_1
25、612;#define LED_CS3(*(volatile unsigned short int *)(0x10300000)#define LED_CS4(*(volatile unsigned short int *)(0x10400000)/键盘设置寄存器#define KEYPAD_1 (*(volatile unsigned int *)(0x41500000)#define KEYPAD_2 (*(volatile unsigned int *)(0x41500048)/键盘允许中断设置#define INTERRUPTION (*(volatile unsigned int *
26、)(0x40d00004)/只读寄存器#define KEYPAD_8(*(volatile unsigned char *)(0x41500008)#define KEYPAD0_11(*(volatile unsigned char *)(0x41500020)char * pictest;int pic_no = 0;void udelay(int multi) long int delay_1,delay_2; multi*=5; for (delay_2=0;delay_2multi;delay_2+) for(delay_1=0;delay_1100000;delay_1+);vo
27、id test()/whitescreen_clean(0xFFFFFFFF);print_pic(gImage_pic);udelay(50);screen_clean(0xFFFFFFFF);print_pic5(gImage_pic);udelay(50);/选择显示图片void pic_test(int i)switch(i) case 0: pictest = gImage_01; break; case 1: pictest = gImage_02; break; case 2: pictest = gImage_03; break; case 3: pictest = gImag
28、e_04; break; default: break; /全部自动播放void pic_all()int i;for(i=0;i3)pic_no=0; pic_test(pic_no); udelay(40);void IRQ_keypad(void) char k; char ch; k=KEYPAD_8; ch=KEYPAD0_11; switch(k) case 0x40: LED_CS3=0xf040; screen_clean(0xFFFFFFFF); print_pic(pictest);/由上到下,左到右显示图片 break; case 0x02: LED_CS3=0xf079
29、; screen_clean(0xFFFFFFFF); print_pic5(pictest);/左右交换,显示图片 break; case 0x04: LED_CS3=0xf024; screen_clean(0xFFFFFFFF); print_pic2(pictest);/由上到下,左到右显示图片(长宽各*2) break; case 0x20: LED_CS3=0xf030; screen_clean(0xFFFFFFFF); print_pic10(pictest);/缩小 break; default: break; switch(ch) case 0x00: LED_CS3=0x
30、f019; screen_clean(0xFFFFFFFF); print_pic_exchange2(pictest);/石雕 break; case 0x01: LED_CS3=0xf012; screen_clean(0xFFFFFFFF); print_pic6(pictest);/灰度显示 break; case 0x02: LED_CS3=0xf003; screen_clean(0xFFFFFFFF); print_pic_exchange(pictest);/颜色反转 break; case 0x05: LED_CS3=0xf078; screen_clean(0xFFFFFF
31、FF); print_pic7(pictest);/ 图片旋转90度 break; case 0x10: LED_CS3=0xf000; screen_clean(0xFFFFFFFF); print_pic8(pictest);/百叶窗横向 break; case 0x11: LED_CS3=0xf018; screen_clean(0xFFFFFFFF); print_pic9(pictest);/百叶窗纵向 break; case 0x12: screen_clean(0xFFFFFFFF); pic_all();/播放全部图片 LED_CS3=0xf008; break; case 0
32、x15: LED_CS3=0xf000; test(); break; case 0x20: LED_CS3=0xf046; screen_clean(0xFFFFFFFF); pic_no+;/播放下一张图片 if(pic_no3)pic_no=0; pic_test(pic_no); print_pic(pictest); udelay(20); break; case 0x21: LED_CS3=0xf040; screen_clean(0xFFFFFFFF); pic_no-;/播放下一张图片 if(pic_no0)pic_no=3; pic_test(pic_no); print_p
33、ic(pictest); udelay(20); break; case 0x22: LED_CS3=0xf006; screen_clean(0xFFFFFFFF); print_pic(gImage_123); break; case 0x25: LED_CS3=0xf00e; screen_clean(0xFFFFFFFF);/清屏 break; default: break; void dummyOs()/screen_clean(0xFFFFFFFF);/char pictest;/int pic_no;pictest = gImage_01;KEYPAD_1=0x7ffffff3;
34、 /中断直接键盘0x600003f3;/0x2faff1c2;/ KEYPAD_2=0x00000303; INTERRUPTION=0x00000010; LED_CS3=0x007f; LED_CS4=0xf0f0;while(1)/whitescreen_clean(0xFFFFFFFF);/typename();print_pic8(gImage_00);udelay(100);screen_clean(0xFFFFFFFF);/typename();print_pic9(gImage_00);udelay(100);lighton1();lightoff2();boot.sIMPOR
35、TpostDelayIMPORTpost_initGpioIMPORTdummyOsIMPORTpost_LcdControllerIMPORTbacklight_csIMPORTlcdlight IMPORTstack_myselfIMPORTinit_MemoryIMPORTscreen_cleanIMPORTIRQ_HandlerAREA boot ,CODE ,READONLYENTRYResetEntryB Reset_HandlerB Undefined_HandlerB SWI_HandlerB Prefetch_HandlerB DataAbort_HandlerNOPB IR
36、Q_Handler B FIQ_HandlerUndefined_HandlerBUndefined_HandlerSWI_Handler BSWI_HandlerPrefetch_HandlerBPrefetch_HandlerDataAbort_HandlerBDataAbort_Handler;IRQ_Handler;BIRQ_HandlerFIQ_HandlerBFIQ_Handler;Defined by yourselfReset_Handler;*;Init GPIO;*mov r14,pcldr pc,=post_initGpio ;*;Init Memory;*mov r14
37、,pc ldr pc,=init_Memory;*;Init Stack;*ldr r11, =stack_myselfmov r13, r11;*;堆栈init_Stack;* MSR CPSR_c, #0xd2 ;MRS和MSR都是程序状态寄存器传指令.把0XD2送到CPSR_c中的低字节中70LDR SP, =0xa0605000 ;LDR 是把一个数字常量或一个地址加载到寄存器伪指令0xa0605000 MSR CPSR_c, #0xd1LDR SP, =0xa060a000 MSR CPSR_c, #0xd7LDR SP, =0xa060e000 MSR CPSR_c, #0xdbL
38、DR SP, =0xa0714000MSR CPSR_c, #0xdfLDR SP, =0xa0720000MSR CPSR_c, #0xd3LDR SP, =0xa0600000;/;I位置1才允许IRQ中断 P23MRS R1, CPSRBIC R1, R1,#0x80MSR CPSR_c, r1 ;*IMPORT |Image$RO$Base|IMPORT |Image$RO$Limit|IMPORT |Image$RW$Base|IMPORT |Image$ZI$Base|IMPORT |Image$ZI$Limit|BaseOfROMDCD|Image$RO$Base|TopOfRO
39、MDCD|Image$RO$Limit|BaseOfRWDCD|Image$RW$Base|BaseOfZeroDCD|Image$ZI$Base|EndOfBSSDCD|Image$ZI$Limit|adr r0, ResetEntryldr r2, BaseOfROMcmp r0, r2ldreq r0, TopOfROMbeq InitRAMldr r3, TopOfROM;copy RO Data0ldmia r0!, r4-r7stmia r2!, r4-r7cmp r2, r3bcc %B0sub r2, r2, r3sub r0, r0, r2InitRAM;copy RW Da
40、taldr r2, BaseOfRWldr r3, BaseOfZero1cmp r2, r3ldrcc r1, r0, #4strcc r1, r2, #4bcc %B1;zero initmov r0, #0ldr r3, EndOfBSS2cmp r2, r3strcc r0, r2, #4bcc %B2;mov r14,pc;ldr pc, =screen_clean;*;LCD_Controller;*mov r14,pcldr pc,=post_LcdController;*;Loop;*ldr r0,=postDelaypostLoopsub r0,r0,#0x1cmp r0,#
41、0x0bne postLoop;*;turn on the light of board;*MOV R0,#0xa000000LDRH R2,R0,#0AND R2,R2,#0xFFFFCFFFSTRH R2,R0,#0;*;turn on backlight;*LDRH R2,R0,#0ORR R2,R2,#0x100STRH R2,R0,#0 ldr pc,=dummyOsENDpost_initDescriptor.s IMPORT desc_word_0 IMPORT desc_word_1 IMPORT desc_word_2 IMPORT desc_word_3 IMPORT init_word_0 IMPORT init_word_1 IMPORT init_word_2 IMPORT init_word_3 IMPORT LCCR0 IMPORT LCCR1 IMPORT LCCR2 IMPORT LCCR3 IMPORT FBR0 IMPORT FBR1 IMPORT LCSR
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小型工程安全指南讲解
- 国外医院宣教经验
- 骨科患者康复指导
- 小学卫生健康宣教
- 钻孔机司机达标竞赛考核试卷含答案
- 津优力健康产品宣
- 颜料生产工常识竞赛考核试卷含答案
- 混合集成电路装调工岗前合规化考核试卷含答案
- 评茶师安全防护竞赛考核试卷含答案
- 苯乙烯类热塑性弹性体(SBCs)装置操作工交接评优考核试卷含答案
- 2026年湖南中考(数学)考试试卷真题(含答案)
- 2026年肾内科医生三基三严培训试卷及答案
- 2026年哈尔滨市道里区六年级下学期期末英语试题及答案
- 2026湖北武汉市区属国有企业招聘笔试历年参考题库附带答案详解
- 2026年公安机关人民警察高级执法资格考试真题含答案
- 护理人员的情绪管理与礼仪
- 2026上海博物馆公开招聘12名工作人员考试备考试题及答案解析
- 安宁疗护中的灵性关怀与信仰支持
- 2026年高考化学终极冲刺:专题03 化学反应原理综合题(大题专练逐空突破)(全国适用)(原卷版及解析)
- 中医诊断学之诊断思路与诊断方法
- 会计管理内部控制制度
评论
0/150
提交评论