基于ARM7的电子万年历设计汇总.docx
《基于ARM7的电子万年历设计汇总.docx》由会员分享,可在线阅读,更多相关《基于ARM7的电子万年历设计汇总.docx(31页珍藏版)》请在冰豆网上搜索。
基于ARM7的电子万年历设计汇总
成绩评定表
学生姓名
匡克新
班级学号
1203060114
专业
通信工程
课程设计题目
基于ARM7的电子万年历设计
评
语
组长签字:
成绩
日期
2015年7月19日
课程设计任务书
学院
信息科学与工程学院
专业
通信工程
学生姓名
匡克新
班级学号
1203060114
课程设计题目
基于ARM7的电子万年历设计
实践教学要求与任务:
1.学习ARM7的虚拟仪器原理、设计方法和实现技巧;
2.掌握简单ARM7程序的编程实现;
3.学会使用Proteus和Keil连接电路图和关联源代码;
4.采用ARM7语言,实现电子万年历设计;
(1)通过检索、查资料、调查研究、确定方案、画出组成系统结构方框图;
(2)采用ARM7实现电子万年历;
(3)系统调试与改进,调整系统参数,分析系统运行结果;
(4)写出设计总结报告。
工作计划与进度安排:
20周(上):
学习ARM7虚拟仪器原理、设计方法和实现技巧,掌握简单ARM7程序的编程实现,掌握简单通信系统设计和分析方法。
20周(下):
采用ARM7语言,实现电子万年历设计,并对万年历进行评估。
指导教师:
2015年7月13日
专业负责人:
2015年7月13日
学院教学副院长:
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>用于年月日的调控,复位。
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));
//DispChinese(1,0,Nums,10,8);//显示"0123456789"
//DispOneChinese(6,96,*(week+6),16);//每次循环,显示一个汉字
//ClearAll2();
//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}
}
//****************************************************************************
//*名称:
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();
LCD12864_CLR=LCD12864_RS;//RS置L,数据格式为:
命令
LCD12864_CLR=LCD12864_RW;//RW置L,为写操作
LCD12864_CLR=0xFF<LCD12864_SET=ucCMD<LCD12864_SET=LCD12864_EN;//给EN一个高脉冲,发送数据
LCD12864_CLR=LCD12864_EN;//发送完成后,使能位置L,供以后继续使用
}
//****************************************************************************
//*名称:
WriteData2
//*功能:
写数据
//****************************************************************************
voidWriteData2(uint8ucData)
{
vCheckBusy();
LCD12864_SET=LCD12864_RS;//写数据时,RS为H,RW为L
LCD12864_CLR=LCD12864_RW;
LCD12864_CLR=0xFF<LCD12864_SET=ucData<LCD12864_SET=LCD12864_EN;//给EN一个高脉冲,发送数据
LCD12864_CLR=LCD12864_EN;//发送完成后,使能位置L,供以后继续使用
}
//****************************************************************************
//*名称:
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_PAGE+ucPage);//设置页号,从0行开始,光标位置
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_SET=LCD12864_CSA;//左开
LCD12864_CLR=LCD12864_CSB;//右关
}
elseif(ucCol/SINGLE_SCREEN_COL==1)//为1说明ucCol大于64。
,在右半屏幕
{
LCD12864_CLR=LCD12864_CSA;//左关
LCD12864_SET=LCD12864_CSB;//右开
}
//设置坐标
vWriteCMD2(LCD_PAGE+ucPage);//设置开始的页号
vWriteCMD2(LCD_COL+ucCol%SINGLE_SCREEN_COL);//设置开始的列号
//显示数据
WriteData2(ucData);
}
//***************************************************************************************
//*名称vDisplayByte
//*功能反显一个字符
//*参数解释ucPage显示的起始页数ucCol显示的起始列数ucData要显示的数据
//***************************************************************************************/
voidvDisplayByte(uint8ucPage,uint8ucCol,uint8ucData)
{
if(ucCol/LCD12864_HIGH==0)
{
LCD12864_SET=LCD12864_CSA;
LCD12864_CLR=LCD12864_CSB;
}
else{
LCD12864_CLR=LCD12864_CSA;
LCD12864_SET=LCD12864_CSB;
}
vWriteCMD2(LCD_PAGE+ucPage);
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高度
uint8