课程设计论文基于arm7的电子万年历设计大学论文Word文档格式.docx
《课程设计论文基于arm7的电子万年历设计大学论文Word文档格式.docx》由会员分享,可在线阅读,更多相关《课程设计论文基于arm7的电子万年历设计大学论文Word文档格式.docx(31页珍藏版)》请在冰豆网上搜索。
![课程设计论文基于arm7的电子万年历设计大学论文Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/27/9df6337c-78bf-43e8-919a-ddc42ba3e177/9df6337c-78bf-43e8-919a-ddc42ba3e1771.gif)
学院教学副院长:
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;
//临