设计论证书与结题报告-基于ARM7与HD7279、12864的键盘显示模块.doc

上传人:西安人 文档编号:3292286 上传时间:2019-08-08 格式:DOC 页数:21 大小:763.51KB
返回 下载 相关 举报
设计论证书与结题报告-基于ARM7与HD7279、12864的键盘显示模块.doc_第1页
第1页 / 共21页
设计论证书与结题报告-基于ARM7与HD7279、12864的键盘显示模块.doc_第2页
第2页 / 共21页
设计论证书与结题报告-基于ARM7与HD7279、12864的键盘显示模块.doc_第3页
第3页 / 共21页
设计论证书与结题报告-基于ARM7与HD7279、12864的键盘显示模块.doc_第4页
第4页 / 共21页
设计论证书与结题报告-基于ARM7与HD7279、12864的键盘显示模块.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《设计论证书与结题报告-基于ARM7与HD7279、12864的键盘显示模块.doc》由会员分享,可在线阅读,更多相关《设计论证书与结题报告-基于ARM7与HD7279、12864的键盘显示模块.doc(21页珍藏版)》请在三一文库上搜索。

1、设计类别任务编号报告类型 设计论证书与结题报告 设计题目: 基于ARM7与HD7279、12864的键盘显示模块 学 生: 指导教师: 专 业: 电子信息工程2008级 提交日期: 2011年5月7日 2011年 5月论证题目: 键盘与显示模块任务内容键盘与显示是硬件设备的基本组成模块。本项目为实现按键的输入,数码管与液晶屏显示。首先建立硬件连接,之后基于ARM7编写,并制作pcb板。 论证内容一、 系统硬件组成:1. 硬件系统描述: 硬件实现:(1)、按键与数码管部分:以ARM7LPC2138为核心控制HD7279a ,最终实现按键的串行输入并将输入显示到数码管上。 (有关芯片HD7279a

2、内容请参考“hd7279a 8位数码管64键盘中文”)(2)、LCD显示部分: 以ARM7LPC2131为核心控制液晶屏、以并行传输数据方式将内容显示在液晶屏上(有关12864内容请参考“中显ZX12864R中文字库LCD”)2. 硬件系统框图: (1)、按键与数码管部分: 键盘ARM7 LPC2138HD7279a数码管 (2)、LCD显示部分:ARM7 LPC2131LCD12864 数码管3. 原理图 (1)、按键与数码管部分:按键排阻Hd7279(2)、LCD显示部分:输入端口排阻插排4. pcb这区域放置LCD点阵LCD控制数码管,按键与点阵控制区键盘区数码管 二、 系统软件设计:1

3、、软件系统设计描述: (1)、按键与数码管部分:LPC2138控制HD7279a读写操作,读取键码值显示在数码管上 (2)、LCD显示部分:LPC2131以并行的方式控制液晶屏显示内容 2主流程图:按键与数码管部分流程图 LCD显示部分流程图3、源代码分析:按键与数码管显示程序:/*- FILE Info -*File Name:jpxs.c*Last Modified Date: 2011-05-6*Last Version:V1.0*Description:基于 LPC2138与HD7279 的键盘显示程序设计*-*Created By:姚金龙、张翃敔*Created Date:2011-

4、05-6*E-mail Address:*/ /* Begin of File */* 包含头文件 */#include #include /* HD7279 指令 */#define CMD_RESET 0xA4/ 复位指令#define CMD_MODE10xC8/ 0xC8 | a2 a1 a0下载数据且按方式1译码0-F #define CMD_READ 0x15/ 读键盘数据指令/* 宏定义 */ #defineCS (18) /定义P0.8为HD7279 CS(片选)#defineCLK (19)/定义P0.9为HD7279 CLK #defineDATA (110)/定义P0.1

5、0为HD7279 DATA/* Function name: delay* Descriptions: 延时函数* input parameters: uiD : 定时器精确延时1US,延时参数,值越大,延时越久* output parameters: 无* Returned value: 无*/void delay1u(unsigned long t) T1PR = 0x00000000; /Load prescaler T1TCR = 0x00000003; /Reset counter and prescaler T1MCR = 0x00000003; /On match reset t

6、he counter and generate an interrupt T1MR0 = t*0x0f; /Set the cycle time T1TCR = 0x00000001; /enable timer while(T1IR & 0x01) = 0); T1IR = 0x01; T1TCR = 0x00000000;/*Function Name:send_byte *Decriptions:向HD7279 中写指令或数据* *-*Input Parameters:cmd: 向HD7279发送数据和指令*Output Parameters:NULL*Valueof Return:NU

7、LL*/void send_byte(unsigned char cmd)unsigned char i; IO0CLR |= CS;delay1u(48);/ 长延时for(i = 0;i 8;i+)if(cmd&0x80) / 写“1”IO0SET|=DATA;else/ 写“0”IO0CLR |=DATA; IO0SET|=CLK; / CLK形成下降沿 delay1u(8);IO0CLR |=CLK; delay1u(8);cmd = cmd * 2;/数据左移一位 IO0SET |=DATA;/*Function Name:Init_7279 *Decriptions:HD7279

8、初始化函数 * *-*Input Parameters:NULL*Output Parameters:NULL*Valueof Return:NULL*/void Init_7279(void)unsigned int i;IO0CLR |= CS;/ 片选使能send_byte(CMD_RESET); / 复位 HD7279for(i = 0;i 0x2000;i +);/ 延时,等待 HD7279 完成初始化/*Function Name:write_7279 *Decriptions:向HD7279 中写指令或数据* *-*Input Parameters:cmd: 向HD7279写指令

9、 * dat:向HD7279写数据*Output Parameters:NULL*Valueof Return:NULL*/void write_7279(unsigned char cmd, unsigned char dat)send_byte(cmd); / 写指令send_byte(dat);/ 写数据/*Function Name:receive_byte *Decriptions:从 HD7279 中读一个字节* *-*Input Parameters:NULL*Output Parameters:in_byte:返回从HD7279读回的数值*Valueof Return:NULL

10、*/unsigned char receive_byte(void)unsigned char i,in_byte; IO0DIR &=(DATA);/数据口改回输入delay1u(48);/长延时for (i=0;i8;i+) IO0SET |= CLK;/先拉高之后再拉低给下降沿脉冲delay1u(8);/短延时 in_byte=in_byte1;/数据左移一位 if(IO0PIN&0x00000400)/读“1”in_byte=in_byte|0x01; IO0CLR |=CLK; delay1u(8);/短延时 IO0DIR |=DATA; /数据口改回输出return (in_byt

11、e); /返回读数据/*Function Name:read7279 *Decriptions:从 HD7279 中读数据 * *-*Input Parameters:command:向HD7279发送读指令*Output Parameters:receive_byte():返回从HD7279读回的数值*Valueof Return:NULL*/unsigned char read7279(unsigned char command)send_byte (command);/发送读指令return (receive_byte();/返回读数据/*Function Name:IRQ_EINT0

12、*Descriptions: EINT0的中断服务程序 *-*Input Parameters:NULL*Output Parameters:NULL*Valueof Return:NULL*/void IRQ_EINT0() _irq unsigned char date ; date = read7279(CMD_READ);/调用读函数 write_7279(CMD_MODE1,date%10);/数码管第一位写 write_7279(CMD_MODE1|0x01,date/10);/数码管第二位写write_7279(CMD_MODE1|0x02,date/100);/数码管第三位写E

13、XTINT |= 0x01;VICVectAddr = 0; /* Function name: main* Descriptions: 主函数* input parameters: 无* output parameters: 无* Returned value: 无*/main()PINSEL0=0x0;IO0DIR |= 0x00000700; PINSEL0 = (PINSEL0 & 0xFFFFFFF3) | 0x0C; /以下五句为中断配置EXTMODE |= 0x01;EXTPOLAR &= 0x0E;VICIntSelect &= (114);VICVectCntl15 = 0x

14、20 | 14;VICVectAddr15 = (unsigned int)IRQ_EINT0;VICIntEnable = (114);Init_7279(); /HD7279 初始化 while(1) LCD显示程序:/* #include config.h/*定义与LCD相关的宏*/#define LCD_DATA 0xFF #define LCD_DI 18 /与p0.8对应 #define LCD_RW 19 /与p0.9对应#define LCD_EN 110 /与p0.10对应.#define LCD_PSB 111 /与p0.11对应/电路直接拉高#define LCD_RST

15、 112 /与p0.12对应/上电自动复位,一般也可以不接*#define clear_screen 0x01 /清屏 #define reset_address 0x02 /地址复位#define set_point 0x06 / 0000_0110#define display_set 0x0c / 显示设定#define cursor_shift_control 0x1c /0001_1100#define function_set 0x30 / 功能设定 基本指令集#define function_set_ext 0x36 /功能设定 扩充指令集 绘图开/#define set_CGR

16、AM_ADD #define set_DDRAM_ADD 0x80 /#define write_data_intenalRAM /*void Delay_1ms(uint8 d) /延时函数 uint8 i; while (d-!=0) for(i=0;i40;i+); /*void LCD_DATA_input() IO0DIR = IO0DIR & (LCD_DATA); /把p1.16-p1.23设定为输入/*void LCD_DATA_output() IO0DIR = IO0DIR | LCD_DATA; /设定p0.0-p0.7为输出/*/void CheckState( )/状

17、态检查,LCD是否忙?Delay_1ms(200); /延时/* 函数名称:GPIO_Init(* 函数功能:初始化IO端口,包含一个uart0,三个按键输入,以及几个普通的输入输出端口.* 入口参数:无* 出口参数:无 */void GPIO_init() PINSEL0 = 0; /P0口设为IO功能 IO0DIR= 0xFF8;/* 函数名称: w_data(unsigned char data_Lcm)* 函数功能:给LCD发送数据或者命令.* 入口参数:data_Lcm* 出口参数:无 */void W_data(uint8 data_Lcm)CheckState();LCD_DAT

18、A_output(); IO0SET = LCD_DI; / 将RS拉高IO0CLR = LCD_RW; / 将RW 清0IO0CLR = 0xFF; / P0.0P0.7清0IO0SET = data_Lcm; / 将数据data_Lcm 输出IO0SET = LCD_EN; /将 EN 拉高IO0CLR = LCD_EN; /将 EN 清0 产生边沿/* 函数名称:W_instruct* 函数功能:向LCD输入命令* 入口参数:data_Lcm* 出口参数: 无*/void W_instruct(uint8 data_Lcm)CheckState();LCD_DATA_output();

19、IO0CLR = LCD_DI; / RS清零IO0CLR = LCD_RW; /RW清零IO0CLR = 0xFF; / P0.0P0.7 清零IO0SET = data_Lcm; /输出 数据data_LcmIO0SET = LCD_EN; IO0CLR = LCD_EN;/* 函数名称LCD_Init()* 函数功能:初始化lcd显示屏* 入口参数:无* 出口参数:无 */void init_lcd(void) IO0SET = LCD_RST; IO0CLR = LCD_RST;/ 复位LCDIO0SET = LCD_RST;IO0SET = LCD_PSB; / 选择并行口IO0SE

20、T = LCD_PSB;W_instruct(function_set); / 输出命令 功能选择为基本指令集W_instruct(display_set); / 显示状态命令W_instruct(clear_screen); / 清屏W_instruct(reset_address); / 复位地址W_instruct(set_DDRAM_ADD); /设定DDRAM地址/*void wenzi(void)char line1 = 月落乌啼霜满天 ; 要输出的数据char line2 = 江枫渔火对愁眠 ;char line3 = 姑苏城外寒山寺 ;char line4 = 夜半钟声到客船

21、;uint8 i ;W_instruct(0x80); for(i=0;i16;i+) / 写数据W_data(line1i); W_instruct(0x90);for(i=0;i16;i+)W_data(line2i);W_instruct(0x88);for(i=0;i16;i+)W_data(line3i);W_instruct(0x98);for(i=0;i16;i+)W_data(line4i);int main (void) GPIO_init(); /初始化GPIOinit_lcd(); /初始化LCD wenzi(); / 写数据 while(1); /* End Of Fi

22、le*/1、 扩展功能 在完成按键与数码管显示、LCD显示的同时,同时完成了基于DS18b20温度传感器的程序编写,并将传感器侧得的温度值显示在LCD、数码管上。三、 总结通过本项目,我们学到了很多,刚开始调试LCD程序时,一直在错,后来在液晶与arm版之间接排阻,从而拉高了电位,程序才成功。再做按键时,因为语句的一处错误,忙了好久,后被老师发现改正。我们有几点感触:1:arm要做到延时,最好用定时器来:在编写液晶,ds18b20,键盘程序时,都要求精确延时,用简单的循环满足条件很难,采用定时器产生延时很方便。2:软件与硬件必须结合,才能成功:在调试程序时产生错误,有可能是硬件,也有可能是程序,单步运行程序,用万用表测量测量硬件来判断错误原因,是非常好的办法。3:善于看资料,尤其时序图:每个器件的资料都是相当全面的,看资料可以较快的理解元器件的用法,而时序图准确给出了管教状态,延时时间。对编程非常有帮助。4:protel99se与Altium designer:用protel99se制作pcb,而用Altium designer调整pcb,使得制作更简单和方便。5:一个人的能力是有限的,互相帮助,才能事半功倍。指导教师组意见签名:年 月 日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 信息产业


经营许可证编号:宁ICP备18001539号-1