单片机论坛

 找回密码
 立即注册

QQ登录

只需一步快速开始

搜索
查看: 648|回复: 0
打印 上一主题 下一主题
收起左侧

LPC2138+LCD12864显示实时时钟程序 keil与proteus联调

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下proteus仿真工程文件可到本帖附件中下载


近年来随着计算机技术及集成电路技术的发展嵌入式技术日渐普及在通讯网络工控医疗电子等领域发挥着越来越重要的作用嵌入式系统无疑成为当前最热门最有发展前途的IT应用领域之一32位嵌入式系统发展很快32位单片机已逐渐占领8位机的市场并以很高的性价比赢得了越来越多的用户的青睐随着科技和工艺的进步32位单片机的优势会更加突显出来将会成为嵌入式系统的主流在32位嵌入式系统中基于ARM的应用占据了大部分份额

     实时时钟RTC器件是一种能提供日历/时钟数据存储等功能的专用集成电路常用作各种计算机系统的时钟信号源和问设置存储电路RTC具有计时准确耗电低和体积小等特点特别适用于在各种嵌入式系统忠记录录发生的时间和相关信息尤其是在通信工程电力自动化工业控频自动化程度细领域的无人职守环场随着集成电路技术的不断发展RTC器件的新品也不断推出这些新品不仅具有准返RTC还有大容量的存储器温度传感器和A/D数据采集通道等已成为集RTC数据采集和存储于一体的综合功能器件特别适用于以微控制器为核心的嵌入式系统
本次设计是采用LPC2138的32位芯片设频可调万年历具有调时调分调月调日和准点报时的功能当整点时蜂鸣器响的问为当时小时的值以及LED会了相应的问

一功能得 1
二系统硬件设计 1
21 系统结构 1
22元器件的选择 2
三系统软件设计 3
31程序和芯片的初始化 3
32构建功能模块 4
四实验测试 7
41IAR软件的编译连接和运行 7
42protues仿真软件的联合调试 8
五实验结果 9
51仿真结果 9
52实验板结果 10
六心得体会 11
七程序清单 11

一功能得
利用内部RTC的实时时钟制作一个时钟通过液晶显示模块显示年月日和时间K1键K2键K3键和K4键分别可用于调整路ݡ日小时和分钟数在调整过程中日期和时钟以新的时间为起点继续刷新显示同时该设计具有整点报时的功能当整点时蜂鸣器响的问为当时小时的值以及LED会了相应的问
本设计采用的是OCM128128液晶显示模块是128128点阵型液晶显示模块可显示各种址及图形可与CPU直接接口具有8位标准数据总线6条控制线及电源线采用T6963C驱动IC进行控制本实验板中采用的是3.3V的液晶模块可以直接连接到LPC2138的GPIO上而不需要进行电平转换
二系统硬件设计2.1 系统结构
本实验是基于LPC2138ARM处理器而设频实时时钟综合越强涉及到RTC外部中断引脚的GPIO功能C语言编程等知识
首先要定义P0口为基本I\O功能然后通过引脚功能选择寄存器PINSEL0及PINSEL1定义输入输出外部中断口所在的位另外还要对外部中断进行初始化其中有规定他们的优先级中断触发方式中断地址分配
本实验采用液晶模块OCM128128同时显示实时时间同样要运们进行初始化包括检查总线忙与闲传送地址传送数据及显示函数的编程
LPC2138微控制器自带有一个实时时钟RTC带日历和时钟功能要使用它也要进行一下的基本操作
设置RTC基准时钟分频器
初始化RTC的时钟值如YEAR,MONTH,HOUR等
启动RTC即CCR的CLKEN位职位
读取完整时间寄存器值或等待中断
陈述完以上的模块初始化后下面简要得一下程序的流程先调用以上各个模块的初始化函数lcd_int(),RTCint()然后开启RTC时钟并调用LCD显示函数SendTimetRtc(),如果没用中断发生就判断实时时间是否与以设定的报警时间相同如果相同就马上接通蜂鸣器报警并且点亮LED灯假如有中断发生在无效状态下马上给中断标志寄存器EXTINT对应位然后写1清零然后转到中断服务程序
根据项目要求确定该系统的设计方案图2-1为该系统设计方案的结构框图硬件电路由6个部分组成即ARMLPC2138处理器时钟电路复位电路液晶显示模块时间调整模块整点报时模块

2.2元器件的选择
选用嵌入式arm 7系列的LPC2138芯片和LCDPG128128a显示器

三系统软件设计
3.1程序和芯片的初始化
程序中包括Lcd的初始化
void init_lcd (void)
{
  IO0CLR=rst;
  IO0SET=rst;
  delay1(50);
  IO0CLR=ce;
  IO0SET=wr;
  IO0SET=rd;
wr_xd(addr_w,0x40);                  //文本显示区首地址
wr_xd(addr_t,0x42);                   //图形显示区首地址
wr_td(width,0x00,0x41);              //文本显示区宽度
wr_td(width,0x00,0x43);              //图形显示区宽度
wr_comm(0x81);                       //逻辑"异或"
wr_td(0x56,0x00,0x22);               //CGRAM偏置地址设置
wr_comm(0x9c);                        //启用文本显示,启用图形显示
}
中断向量的初始化
VICIntSelect =0x00000000;                                                                                         
  VICVectCntl0 = 0x20|13;                     
  VICVectAddr0 = (uint32)RTC_int;            
   ILR=0x03;                                                                                                                     
  VICIntEnable = (1<<13);                                                                                             
  __enable_irq();


RTC的初始化
void  RTC_int(void)
{  
   uint32 i,h;
   uint8hh[2];
   h=HOUR;
   hh[0] =HOUR /10+0x30;
   hh[1] =HOUR%  10+0x30;

  clrram();                //清屏
  disp_img(0,16,64,nBitmapDot);   //显示图画
  disp_zf(0,12,"Current Time:");

   for(i=0;i<2;i++)
    {
       disp_zfyg(13+i,12,hh);
    }
  for(i=0;i<h;i++)
   {
    IO0CLR=LED;
    IO0SET=BEAK;
    DelayNS(30);
    IO0SET=LED;
    IO0CLR=BEAK;
    DelayNS(30);
   }      
  ILR = 0x03;                                                                                                                           
  VICVectAddr= 0x00;
clrram();                //清屏
}


3.2构建功能模块
调整时间和日期的函数
void key()
{
   if((IO0PIN&ATH)==0)
       {
          CIIR=0x00;
          HOUR++;
          if(HOUR>23)HOUR=0;     
          CIIR=0x04;
         while((IO0PIN&ATH)==0);  
       }
        if((IO0PIN&ATM)==0)
       {
          CIIR=0x00;
          MIN++;
          if(MIN>59)  MIN=0;      
          CIIR=0x04;
         while((IO0PIN&ATM)==0);
       }
    if((IO0PIN&ATS)==0)
       {
          CIIR=0x00;
          MONTH++;   
           if(MONTH>12)  MONTH=0;  
          CIIR=0x04;
         while((IO0PIN&ATS)==0);
       }
      if((IO0PIN&ATD)==0)
       {
          CIIR=0x00;
          DOM++;   
          CIIR=0x04;
         while((IO0PIN&ATD)==0);
       }
}
延时函数
void  DelayNS(uint32  dly)
{  uint32  i;
   for(; dly>0; dly--)
      for(i=0; i<50000; i++);
}
整点报时函数
void   RTC_int(void)
{  
   uint32 i,h;
   uint8 hh[2];
   h=HOUR;
   hh[0] = HOUR /10+0x30;
   hh[1] = HOUR%  10+0x30;
  
   clrram();                //清屏
   disp_img(0,16,64,nBitmapDot);    //显示图画
   disp_zf(0,12,"CurrentTime:");
    for(i=0;i<2;i++)
    {
        disp_zfyg(13+i,12,hh);
    }
   for(i=0;i<h;i++)
   {
     IO0CLR=LED;
     IO0SET=BEAK;
     DelayNS(30);
     IO0SET=LED;
     IO0CLR=BEAK;
     DelayNS(30);
   }      
  ILR = 0x03;                                
  VICVectAddr = 0x00;
  clrram();                //清屏
}

输出址串函数
void disp_zf(uint32 x,uint32 y,uint8 *str)
{
char c;
wr_xd((addr_w+16*y+x),0x24);
wr_comm(0xb0);
while(*str!='\0')
{
c = (*str);
wr_auto(c-32);
str++;
}
wr_comm(0xb2);
}
输出一个址的函数
void disp_zfyg(uint32 x,uint32 y,uint8 str)
{
char c;
wr_xd((addr_w+16*y+x),0x24);
wr_comm(0xb0);
c = str;
wr_auto(c-32);
wr_comm(0xb2);
}
四实验测试4.1IAR软件的编译连接和运行
构建完整的程序
添加头文件中断处理汇编程序段初始化函数和主函数

4.2protues仿真软件的联合调试
   为LPC2138芯片选择Hex文件路径
五实验结果5.1仿真结果
5.2实验板结果

六心得体会
众所周知ARM微处理器功能特别的看与MC51单片机相比它更适献中高端数字系统的微处理器ARM已经成了现代主流微处理器内核,目前绝大多数码产品如手机MP3MP4数码相机他们的系统都嵌入了ARM系列内核ARM微处理器更新换代很快现在的诺基亚N系列智能手机如N78,N79已经采用了ARM11了使得运行于塞班操作系统S60第三版的应用程序流畅自如
       回顾起此次设计至今我仍感慨颇多从理论到实践在整整半个月的日子里已到很多很多的东西不仅巩固了以前所学过的知识而已到了很多在书本上所没有学到过的内容通过这次设计使我懂得了理论与实际相结合是很重要模只有理论知识是对不够模只有把所学的理论知识与实践相结合起来从理论中得出结论才是真正的知识才能提高自己的实际动手能力和独立思考的能力在设频过程遇到了各指样的问题同时在设频过程中发现了自己的不足之处对以前所学过的知识理解得不够深刻掌握得不够牢固通过这次设计把以前所学过的知识重新温故巩固了所学的知识

七程序清单


全部资料51hei下载地址
f742b19390cf1f8d6846f64f49a49657.rar (193.42 KB, 下载问: 7)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励

查看全科分

分享到:  QQ好友和群QQ好友和群 QQ占QQ占 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

快速回复 返回顶部 返回列表
ձһhƬձƵ ձƵɫwww ձƵ:ɫ