课程设计论文基于arm7的电子万年历设计大学论文Word文档格式.docx

上传人:b****6 文档编号:21590653 上传时间:2023-01-31 格式:DOCX 页数:31 大小:158.31KB
下载 相关 举报
课程设计论文基于arm7的电子万年历设计大学论文Word文档格式.docx_第1页
第1页 / 共31页
课程设计论文基于arm7的电子万年历设计大学论文Word文档格式.docx_第2页
第2页 / 共31页
课程设计论文基于arm7的电子万年历设计大学论文Word文档格式.docx_第3页
第3页 / 共31页
课程设计论文基于arm7的电子万年历设计大学论文Word文档格式.docx_第4页
第4页 / 共31页
课程设计论文基于arm7的电子万年历设计大学论文Word文档格式.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

课程设计论文基于arm7的电子万年历设计大学论文Word文档格式.docx

《课程设计论文基于arm7的电子万年历设计大学论文Word文档格式.docx》由会员分享,可在线阅读,更多相关《课程设计论文基于arm7的电子万年历设计大学论文Word文档格式.docx(31页珍藏版)》请在冰豆网上搜索。

课程设计论文基于arm7的电子万年历设计大学论文Word文档格式.docx

学院教学副院长:

2015年7月13日

目录

1系统设计1

1.1电子显示屏特性1

1.2按键控制1

1.3LCD显示端1

1.4万年历调控电路2

1.5万年历的实现3

1.6LCD调试电路图3

2软件的具体功能和要求4

2.1基本要求4

2.2软件设计平台的介绍及实现方法4

2.3程序设计流程图4

3设计总结6

3.1proteus仿真电路图6

3.2Keil源代码7

3.3性能分析23

[参考文献]24

1系统设计

1.1电子显示屏特性

1>

LED由计算机专用设备、显示屏幕、视频输入端口和系统软件等组成。

2>

计算机及专用设备直接决定了系统的功能,可根据用户对系统的不同要求选择不同的类型

3>

提供视频输入端口。

1.2按键控制

用于年月日的调控,复位。

用于时分秒的置换,清屏。

1.3LCD显示端

LCD显示端如图1所示。

图1LCD显示端

1.4万年历调控电路

万年历调控电路如图2所示。

图2万年历调控电路

1.5万年历的实现

使用调试功能,经过反复的调试终于实现了计时功能,然后通过查询资料,实现了计时过程中时钟实时更新功能及实现LED灯跟节奏闪烁。

再经过程序的改进,实现了实时时钟和闹钟调整功能。

添加了LED灯指示调整时间点(秒、分、时、星期、日、月、年)功能。

1.6LCD调试电路图

调试电路图如图3所示。

图3调试电路图

2软件的具体功能和要求

2.1基本要求

本课题所设计的系统要求:

(1)在理解基本实验代码的基础上,掌握万年历的工作原理,基于程序控制方式的驱动设计。

(2)在proteus中使用ARM7的LPC2106芯片并且结合Keil的源代码,实现万年历功能。

(3)编写基于万年历程序,实现代码编译。

2.2软件设计平台的介绍及实现方法

本设计中采用可编程逻辑设计环境ARM7进行设计,KeiluVsion5采用C语言进行编程。

2.3程序设计流程图

万年历程序流程图如图4所示。

图4万年历程序流程图

3设计总结

3.1proteus仿真电路图

仿真结果如图5所示。

图5仿真电路图

3.2Keil源代码

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

*功能:

LCD12864液晶显示驱动程序

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

#include"

config.h"

#defineLCD12864_DIRIO0DIR//端口方向

#defineLCD12864_CLRIO0CLR//数据清零

#defineLCD12864_SETIO0SET//数据置一

#defineLCD12864_PINIO0PIN//端口状态

#defineLCD12864_BUSY(1<

<

26)//BUSY

#defineLCD12864_CTL_NO11//控制线起始端口

#defineLCD12864_DAT_NO16//数据线起始端口

#defineLCD12864_RS(1<

(LCD12864_CTL_NO+2))//命令/数据

#defineLCD12864_RW(1<

(LCD12864_CTL_NO+3))//读/写

#defineLCD12864_EN(1<

(LCD12864_CTL_NO+4))//使能位

#defineLCD_DispOn0x3F//开显示命令

#defineLCD_STARTROW0xC0//设置起始行指令,0xC0为第0行

#defineLCD_PAGE0xB8//设置页指令。

10111000

#defineLCD_COL0x40//设置列指令。

#defineLCD_LINE0x40//设置列指令

#defineSINGLE_SCREEN_COL64//左右屏,每屏64列

#defineLCD12864_CSA(1<

(LCD12864_CTL_NO))//控制线端口定义,选中左部屏幕

#defineLCD12864_CSB(1<

(LCD12864_CTL_NO+1))//选中右部屏幕

#defineLCD12864_WIDTH128//宽度

#defineLCD12864_HIGH64//高度

#defineLCD12864_PAGE8//页数

//引用外部字模

externuint8sytx[8][32];

externuint8snum[][16];

externuint8hytx[8][32];

externuint8Nums[10][16];

externuint8week[][16];

externuint8menu1[];

externuint8menu0[];

externuint8degree[];

//externuint8dianqiguan[];

externuint8menu2[];

externuint8menu3[];

externuint8menu4[];

uint8tm[6];

//获取时间存在数组中

uint8year[6];

//获取日期存在数组中

uint8day;

//获取星期号

uint8dis_buf[22];

//数据缓冲区

//uint8dayoder;

//延时函数

voidDelay(uint32x);

//初始化函数

voidRTCInit(void);

voidLCDInit2(void);

voidvCheckBusy(void);

voidvWriteCMD2(uint8ucCMD);

voidWriteData2(uint8ucData);

voidClearAll2(void);

//显示字符函数

voidDisplayByte(uint8ucPage,uint8ucCol,uint8ucData);

//显示字符

voidvDisplayByte(uint8ucPage,uint8ucCol,uint8ucData);

//反选显示字符

//显示数字函数

voidDisplaynum(uint8ucPage,uint8ucCol,uint8*pDisTable);

//显示数字

//显示汉字、字符串函数

voidDispOneChinese(uint8ucPage,uint8ucCol,uint8*pDisTable,uint8Col);

//一个汉字

voidDispChinese(uint8ucPage,uint8ucCol,uint8pDisTable[][32],uint8Num,uint8Col);

//多个汉字

//全屏显示图片

voidDisPicture(uint8*pDisTable);

voidvDisPicture(uint8*pDisTable,uint8sur);

//刷新屏幕函数---只刷新其中一部分

voidDateupdated(uint8numcode[]);

voidWeekupdated(uint8oder);

voidTimeupdated(uint8numcode[]);

voidSetTimeRtc(void);

//填充时间变量

//刷新屏幕函数

voidfresh(void);

//定时器中断处理函数,其中调用屏幕刷新函数fresh

void__irqRTC_Int(void);

//主函数入口

intmain()

{

LCDInit2();

//初始化后清屏

RTCInit();

//初始化实时时钟

DispChinese(0,0,hytx,8,16);

//显示"

欢迎同学止步的风"

VICIntSelect=0x00;

//设置所有中断连接IRQ中断

VICVectCntl0=0x20|13;

//分配通道0

VICVectAddr0=(int)RTC_Int;

//设置中断服务程序地址

VICIntEnable=(1<

13);

//使能RTC中断

SetTimeRtc();

Timeupdated(tm);

Dateupdated(year);

Weekupdated(day);

while

(1)

{

while(0==(ILR&

0x01));

//等待RTC增量中断

ILR=0x01;

//清除中断标志

}

//WriteData2(0xff);

//DispChinese(1,0,Nums,10,8);

0123456789"

//ClearAll2();

//Displaynum(6,2+8*2,*(snum+10));

//DispOneChinese(6,96,*(week+6),16);

//每次循环,显示一个汉字

//Displaynum(2,32+8*4,*(snum+year[4]));

//Displaynum(0,0,*(snum+year[4]));

//Displaynum(0,0,*(snum));

//vDisPicture(menu4,0);

//反选8块中的一块区域

//DisPicture(menu4);

}

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

//*名称:

Delay()

//*功能:

延时函数

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

voidDelay(uint32x)

unsignedinti1,j1;

for(j1=0;

j1<

100;

j1++)

for(i1=0;

i1<

x;

i1++);

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

//*名称:

vCheckBusy

//*功能:

检查LCD是否忙

voidvCheckBusy(void)

LCD12864_DIR&

=0xF9FFFF03;

//数据线为输入

while

(1)

LCD12864_CLR=LCD12864_RS;

LCD12864_SET=LCD12864_RW;

LCD12864_SET=LCD12864_EN;

LCD12864_CLR=LCD12864_EN;

if(!

(LCD12864_PIN&

LCD12864_BUSY))

break;

LCD12864_DIR|=0x060000FC;

//数据线为输出*/

vWriteCMD2

写命令

voidvWriteCMD2(uint8ucCMD)

vCheckBusy();

//RS置L,数据格式为:

命令

LCD12864_CLR=LCD12864_RW;

//RW置L,为写操作

LCD12864_CLR=0xFF<

LCD12864_DAT_NO;

//清零数据端口

LCD12864_SET=ucCMD<

//传递命令

//给EN一个高脉冲,发送数据

//发送完成后,使能位置L,供以后继续使用

WriteData2

写数据

voidWriteData2(uint8ucData)

LCD12864_SET=LCD12864_RS;

//写数据时,RS为H,RW为L

//清零8位数据端口

LCD12864_SET=ucData<

CleanAll2

清屏

voidClearAll2(void)

uint8ucPage,ucCol;

//页号,列号

LCD12864_SET=LCD12864_CSA;

//左右两屏都选中

LCD12864_SET=LCD12864_CSB;

for(ucPage=0;

ucPage<

8;

ucPage++)

vWriteCMD2(LCD_PAGE+ucPage);

//设置页号,从0行开始,光标位置

vWriteCMD2(LCD_COL);

//设置列号,定位在第0列

for(ucCol=0;

ucCol<

64;

ucCol++)//左右半屏都是64列,所以循环64次就可以啦,两边同时清屏

vWriteCMD2(LCD_COL+ucCol);

//设置列号,从0列开始,到63列结束

WriteData2(0x00);

//写零,表示清空当前列

LCDInit2

初始化

voidLCDInit2(void)

LCD12864_DIR|=0x00FFF800;

//11-23为输出

LCD12864_CLR|=0x00FFF800;

//清零11-23

vWriteCMD2(LCD_DispOn);

//开显示

vWriteCMD2(LCD_STARTROW);

//设置起始行地址,列地址和页地址是变化的

ClearAll2();

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

//*FunctionName:

DisplayByte

//Date:

*

//*Parameter:

ucPage

//ucData

voidDisplayByte(uint8ucPage,uint8ucCol,uint8ucData)

//先选择显示屏幕(左or右)

if(ucCol/SINGLE_SCREEN_COL==0)//为0说明ucCol小于64。

,在左半屏幕

//左开

LCD12864_CLR=LCD12864_CSB;

//右关

elseif(ucCol/SINGLE_SCREEN_COL==1)//为1说明ucCol大于64。

,在右半屏幕

LCD12864_CLR=LCD12864_CSA;

//左关

//右开

//设置坐标

//设置开始的页号

vWriteCMD2(LCD_COL+ucCol%SINGLE_SCREEN_COL);

//设置开始的列号

//显示数据

WriteData2(ucData);

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

//*名称vDisplayByte

//*功能反显一个字符

//*参数解释ucPage显示的起始页数ucCol显示的起始列数ucData要显示的数据

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

voidvDisplayByte(uint8ucPage,uint8ucCol,uint8ucData)

if(ucCol/LCD12864_HIGH==0)

else{

}

vWriteCMD2(LCD_LINE+ucCol%LCD12864_HIGH);

WriteData2(~ucData);

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

//*名称vDisPicture

//*功能显示一个被选中一部分的界面

//*参数解释*pDisTable图像数据的指针

//*sur值作用01234567分别为选中八块中的一块12243648分别为选中01页23页45页67页

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

voidvDisPicture(uint8*pDisTable,uint8sur)

{uint8ucPage=0;

//起始页

uint8ucCol=0;

//起始列

uint8width=128;

//lcd宽度

uint8hight=64;

//lcd高度

uint8i,j;

//临

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1