微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > 基于ARM9的带农历实时时钟LCD显示设计

基于ARM9的带农历实时时钟LCD显示设计

时间:04-27 来源:电子科技 点击:

S3C2440A是Samsung公司为手持设备应用提供的低功耗、高性价比芯片。S3C2440A基于ARM920T内核,并在ARM920T内核基本功能的基础上集成了丰富的外围功能模块,如UART、RTC、LCD控制器等外围器件,从而降低了嵌入式应用系统的成本。本文采用S3C2440A和WXCAT35液晶显示屏模块,搭建以两者为基础的嵌入式液晶系统工作平台。在此平台基础上,详细讨论带农历的实时时钟在液晶显示屏上的显示以及更改时间和设置报警时间的方法,并给出了具体的实现程序。

1 系统硬件设计

1.1 实时时钟(RTC)模块

S3C2440A集成了具有日历功能的RTC模块,它可以在系统关闭的情况下使用备用电池工作。RTC使用STRB/LDRB ARM操作传输二进制编码的十进制数(BCD)的8位数据给CPU。数据包括年、月、日、星期、小时、分钟、秒的时间信息。此外,RTC模块还可以实现报警功能。RTC模块采用32.768 kHz的外部晶体振荡器,外部晶体振荡器与S3C2440A的连接如图1所示。XTIrtc和XTOrtc分别是RTC的32.768 kHz晶体振荡器输入和输出,2个22 pF电容是晶体振荡器的匹配电容,只有在外部所接电容为匹配电容的情况下,晶体振荡器频率才能保证在标称频率附近的误差范围内。


1.2 通用异步接收传输(UART)模块

S3C2440A的UART提供了3个独立的异步串行I/O端口,每个端口都可以在中断模式或者DMA模式下操作。UART使用系统时钟可以支持最高115.2 kb·s-1的速率。在对UART进行操作时,数据接收帧和发送帧的格式都是可编程的,它包含1个开始位,5~8个数据位,1个可选的奇偶位和1或2个停止位,这些都是通过线性控制器(ULCONn)设置。本文采用UART更改时间和设置报警时间,串口通信连接图如图2所示。


1.3 LCD显示模块

S3C2440A的LCD控制器的作用是将LCD图像数据从系统存储器中的视频缓冲区传送到外部LCD驱动器。LCD控制可以通过编程实现屏幕的不同要求,比如:水平和垂直像素的数量、接口时钟、刷新率等。S3C2440A与WXCAT35液晶显示屏模块的连接电路如图3所示。

图中LCD控制器接口信号的意义:
VFRAME:LCD控制器与LCD驱动器之间的帧同步信号,它通知LCD屏新一帧的显示,LCD控制器在一个完整帧的显示后发出VFRAME信号,开始新一帧显示。
VLINE:LCD控制器与LCD驱动器之间的同步脉冲信号,LCD驱动器通过它来将水平移位寄存器的内容显示到LCD屏上。
VCLK:LCD控制器与LCD驱动器之间的像素时钟信号。
VM:LCD驱动器所使用的交流信号。LCD驱动器使用VM信号改变用于打开或者关闭像素的行和列电压的极性,从而控制像素点的显示或熄灭。
VD0~VD23:LCD像素数据输出端口。

2 软件设计

2.1 读写RTC操作

S3C2440内部集成了RTC模块,其内部的寄存器 BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON和BCDYEAR分别存储了当前的秒,分,小时,星期,日,月和年,表示时间的数值都是BCD码。这些寄存器的内容可读可写。在进行读写操作时,必须将RTC控制寄存器RTCCON的第0位置1 。实现读写功能的程序如下。


2.2 更改时间和设置报警时间

采用S3C2440A的UART,在PC机上实现对实时时钟的更改和设置报警时间。其通讯协议为:当从PC机上发送0xaa时,分别将年、月、日、星期、小时、分和秒写到实时时钟数据寄存器中。当S3C2440A接收到数据后发送0xaa以示确认,调用前面的写操作函数,从而实现对实时时钟的更改;当从PC机上发送0xbb时,分别将预置的报警时间ALMYEAR(年)、ALMMON(月)、ALMDATE(日)、ALMHOUR(小时)、ALMMIN(分)和ALMSEC(秒)写到报警时间数据寄存器中,当S3C2440A接收到数据后发送0xbb以示确认,调用设置报警时间设置函数,从而实现对报警时间的设置。通过设置报警控制寄存器RTCALM,即可实现报警,程序流程图如图4所示。

2.3 农历显示设计

S3C2440的实时时钟模块没有提供农历的时间信息,因此采用公历转农历的方式,实现对农历的显示。公历转换为农历的算法是:首先建立公历年对应的农历数据,并将其存放入数组中,然后通过查表的方式实现公历与农历的转换。

建立公历年对应的农历数据,每年用3个字节表示。

公历年对应的农历数据的第1 Byte的高4位表示农历闰年月份,低4位表示农历1~4月的大小,其具体含义如表1所示。第2 Byte表示农历5~12月的大小,其具体含义如表2所示。第3 Byte的最高位表示农历第13个月的大小,第7位和第6位表示春节所在的公历月份,低5位表示春节所在的公历日期,其具体含义如表3所示。

以2010年为例,农历无闰月,农历1月和3月是大月,2月和4月是小月,故而第1 Byte为00001010(即0x0A);农历的5月、8月、10月和12月是大月,6月、7月、9月和11月是小月,故而第2 Byte为10010101(即0x95);由于2010年的农历没有闰月,所以也就没有第13个月,故而第3Byte的第7位为0,2010年春节所在的公历2月14日,故而第3 Byte的第6~0位为1001110,即第3 Byte为0x4E。

公历转农历的算法框图如图5所示。


2.4 实时时钟的显示

通过调用字符显示函数,将读取的实时时钟显示在LCD屏幕上。本文将要显示的实时时钟字符转换成字模,把所得的字模放在数组中,读取实时时钟寄存器,调用字符显示函数显示数字和汉字,从而将实时时钟显示在LCD屏幕上。最后显示效果图如图6所示。


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top