嵌入式课设报告-LCDLED数码时钟显示修改解读.doc_第1页
嵌入式课设报告-LCDLED数码时钟显示修改解读.doc_第2页
嵌入式课设报告-LCDLED数码时钟显示修改解读.doc_第3页
嵌入式课设报告-LCDLED数码时钟显示修改解读.doc_第4页
嵌入式课设报告-LCDLED数码时钟显示修改解读.doc_第5页
免费预览已结束,剩余8页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录1.设计目的 .22.设计要求 .23.设计内容 .23.1.实验电路及说明 .23.2.程序流程及分析 .23.2.1. 中断程序 .23.2.2. 主函数程序 .33.3.程序清单 .43.3.1. 头文件 includes.h .43.3.2. 中断程序 .53.3.3. 主函数 main.c .74.调试说明 .94.1.调试情况 .94.2. 程序结果及分析 .114.2.1. 调试过程中遇到的问题及解决方法.114.2.2. 对程序设计技巧的总结及分析 .125.设计总结及体会 .126.参考文献 .121. 设计目的( 1)理解点阵字符型 LCD的显示原理。( 2)了解 UA

2、RT 通信基本概念、 UART 通信基本原理。( 3)理解和掌握 KL25 的 UART 模块的基本编程方法。2. 设计要求( 1) LCD数字钟能够正常的显示 24小时时间的时分秒以及正常跳变。( 2)通过串口可以重新设置数字钟的时间3. 设计内容3.1. 实验电路及说明( 1)硬件说明: PC 机, KL25*1 , UART-USB 数据线。( 2)电路说明:用数据线将 PC 机与试验箱连接即可。3.2. 程序流程及分析3.2.1. 中断程序(1)isr_uart1_re(void)变量:ch:接受字符, length: 接受字符的长度, data 存放字符数组, g_flag:标志位,

3、说明data 存放字符结束(补充说明:#为结束符)程序:1.ch 接受字符2.判断 datalength 是否为 #是 g_flag=1; 否 length+1 功能:把接受的字符存到 data 中(2) tpm0_isr(void)变量:TPMCounter :计时器,LEDindex :位选口声明, kbv32=00:00:00 :LCD 显示缓冲区。程序:1.设置 TPMCounter 计时器2.处理 LED 部分:用 if (LEDindex=4) LEDindex=0 实现对 4 个 led 的刷新3. 如 果 TPMCounter1000 , TPMCounter+ ( 每 1 秒

4、 循环 一次 )对 LEDDataBuffer6 实现时钟现实的秒 +14. 把 LEDDataBuffer6 赋值给 kbv, 显示 LCD3.2.2. 主函数程序程序:1.判断 g_flag 是否为 1,为 1 跳到 2,为 0 跳到 1, g_flag 清零2.switch(data0) 选择操作3.length 清零3.3. 程序清单3.3.1.头文件includes.h#ifndef INCLUDES_H_#define INCLUDES_H_#include common.h#include gpio.h#include light.h#include uart.h#include

5、 sysinit.h#include lcd.h#include kb.h#include tpm.h#include led.h/定义小灯闪烁频率#define RUN_COUNTER_MAX1500000ul/定义使用的调试号#define UART_TEST UART_1#define TEST_UART_BAUDRATE#definebus_clk_khz240009600UL/ 芯片总线时钟频率,Khz/定义全局变量uint_8 LEDDataBuffer6;uint_8 ch;uint_8 Data10;uint_16 Length;uint_8 g_Flag;#endif3.3.

6、2.中断程序( 1 ) isr.h (注册中断)#ifndef ISR_H/ 防止重复定义(ISR_H开头 )#define ISR_H/=用户中断向量表注册表/1 注册 TPM0 中断向量=#ifdef VECTOR_033#undef VECTOR_033extern void tpm0_isr(void);#define VECTOR_033tpm0_isr#endif/2 注册串口1 中断向量#ifdef VECTOR_029#undef VECTOR_029extern void isr_uart1_re(void);#define VECTOR_029isr_uart1_re#en

7、dif#endif/ 防止重复定义(结尾 )( 2 ) isr.c#include includes.hvoid tpm0_isr(void)static uint_32 TPMCounter = 0;/ 计时器/static uint_8 value =0;/ 键盘变量static uint_8 LEDindex=0;/ 位选口声明/LED显示缓冲区uint_8 i;/LED 缓冲区赋值/LCD显示缓冲区,其中.表示按下的数字uint_8 kbv32=00:00:00;if(TPM_SC_REG(TPM0_BASE_PTR)&TPM_SC_TOF_MASK)=TPM_SC_TOF_MASK)

8、TPMCounter+;BSET(TPM_SC_TOF_SHIFT,TPM_SC_REG(TPM0_BASE_PTR);/ 中 断 置标志位写1清 0/ 处理 LED 部分LEDindex+;/ 位选位+1if (LEDindex=4)LEDindex=0;/ 大于 4 位选口置0i=LEDchangeCode(LEDDataBufferLEDindex-0);/ 转 码LEDshow1(LEDindex,i);/ 显示 LEDif(TPMCounter1000)TPMCounter = 0;if(LEDDataBuffer3=9)LEDDataBuffer3=0;LEDDataBuffer2

9、+;else LEDDataBuffer3+;if(LEDDataBuffer2=6&LEDDataBuffer1!=9)LEDDataBuffer2=0;LEDDataBuffer1+;elseif(LEDDataBuffer2=6&LEDDataBuffer1=9)LEDDataBuffer2=0;LEDDataBuffer1=0;LEDDataBuffer0+;if(LEDDataBuffer0=6)LEDDataBuffer0=0;LEDDataBuffer4+;if(LEDDataBuffer4=4)LEDDataBuffer4=0;LEDDataBuffer5+;if(LEDDat

10、aBuffer5=3)LEDDataBuffer5=0;kbv0= LEDDataBuffer5;kbv1= LEDDataBuffer4;kbv3= LEDDataBuffer0;kbv4= LEDDataBuffer1;kbv6= LEDDataBuffer2;kbv7= LEDDataBuffer3;LCDShow(kbv);/串口 1 接收中断服务例程void isr_uart1_re(void)uint_8 flag = 1;enter_critical();ch = uart_re1(UART_TEST, &flag);uart_send1(UART_1,ch);if (0 = f

11、lag)DataLength=ch;if(DataLength=#)g_Flag = 1;Length+;exit_critical();3.3.3.主函数main.c#include includes.h/ 包涵总头文件int main(void)/1. 声明主函数使用的局部变量LEDDataBuffer0=5;LEDDataBuffer1=8;LEDDataBuffer2=1;LEDDataBuffer3=1;LEDDataBuffer4=3;LEDDataBuffer5=2;uint_32 run_counter;/ 运行计数器Length=0;g_Flag=0;/2. 关总中断ente

12、r_critical();/ 进入临界区/3. 初始化底层模块LEDInit();/LED 初始化LCDInit();/LCD 初始化KBInit();/ 键盘初始化tpm_init(TPM0,TPM_CLKSRC_PLL,1000);/ 初始化TPM模块, 1ms 中断一次uart_init(UART_TEST,bus_clk_khz,9600);/串口1 初始化 ,总线时钟24000Khz, 波特率 9600/4. 缓冲区赋值/5. 开中断tpm_enable_int(0);init_critical();uart_enable_re_int(UART_TEST);uart_send_st

13、ring(UART_1,Uart Initialrn);uart_send_string(UART_1,SD-FSL Library Flash Test!rnrn); uart_send_string(UART_1,Press ? to get helprn);/=for(;)run_counter+;if (run_counter RUN_COUNTER_MAX)run_counter = 0; / end_ifif(g_Flag=1)g_Flag=0;switch(Data0)case ?:/命令帮助uart_send_string(UART_1,写入格式如下 :rn);uart_sen

14、d_string(UART_1,写入Wrn);break;case w:/ 写入操作case W:LEDDataBuffer5=Data1;LEDDataBuffer4=Data2;LEDDataBuffer0=Data3;LEDDataBuffer1=Data4;LEDDataBuffer2=Data5;LEDDataBuffer3=Data6;break;default:break;Length=0;/=return 0;4. 调试说明4.1. 调试情况( 1)发送? #收到帮助命令LCD 显示默认的时间23:58: 11LED 显示分钟和秒58:11(2) 发送 w+6 位时间 +#结束

15、,设置时间LCD 显示默认的时间12:34:56LED 显示分钟和秒34:564.2. 程序结果及分析4.2.1. 调试过程中遇到的问题及解决方法( 1) 问题:输入命令如? #,输出是帮助命令无限循环,应该帮助命令只出现一次。解决:有一个 g_flag 标志位,当标志位为 1 时,要先把标志位清零再开始判断 data0 使得? #的命令只执行一次。( 2) 问题:命令只能输入一次,输入第二个命令时,串口就会没反应解决:在 switch 结束后要把 length 清零,这样就可以输入新的命令了。( 3) 问题:如何设置时间解决:重新注册了一个中断,利用串口中断接收命令,实现对时间的设置。4.2

16、.2. 对程序设计技巧的总结及分析( 1)设个数组 datalength 既能存储收到的字符串也能统计收到字符串的个数。这样操作很方便也很易懂。( 2)设个结束符,让程序知道命令已经输入完成5. 设计总结及体会经过短短两天时间的课程设计,我们小组设计LCD数字钟,实现了数字钟正常显示24 小时时间的十分秒和正常跳变,而且可以通过串口发送命令来实现重置时间的功能。当我们看到此题目的时候,联想到之前做LCD显示时间的实验以及图片存储写入和读取的实验,受到这两个实验的启发,我们将两次实验结合,采用两个中断, 并加以修改。 先是调试正常的23:59:59后跳变成 00:00:00 ,接着调试串口重置时

17、间,经过不断的测试与调试,一步一步的把功能都已实现。这次课程设计,充分提高了我们对实验应用的综合能力,同时也是对所学各个模块设计的综合运用能力。这实验是最能学习知识的时候,通过实践动手,一次又一次的修改、调试,不断重复,是很好的锻炼自己的机会。以后我们会继续努力的。6. 参考文献1 王宜怀 . 嵌入式技术基础与实践 .北京清华大学学研大厦 A 座:清华大学出版社, 2013 年 8 月第三版读书的好处1 、行万里路,读万卷书。2 、书山有路勤为径,学海无涯苦作舟。3 、读书破万卷,下笔如有神。4 、我所学到的任何有价值的知识都是由自学中得来的。 达尔文5 、少壮不努力,老大徒悲伤。6 、黑发不知勤学早,白首方悔读书迟。 颜真卿7 、宝剑锋从磨砺出,梅花香自苦寒来。8 、读书要三到:心到

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论