【ARM】2440裸机系列-RTC数字时钟
功能
裸机程序,实现LCD显示数字时钟
主要代码
1)背景绘制
- void Brush_ U32 c)
- {
- int x,y ;
- for ( y = 0 ; y < LCD_HEIGHT ; y++ )
- {
- for ( x = 0 ; x < LCD_WIDTH ; x++ )
- {
- LCD_BUFFER[y][x] = c ;
- }
- }
- }
2)文字绘制
- void Draw_Text16(U32 x,U32 y,U32 color,U32 backColor,const unsigned char ch[])
- {
- unsigned short int i,j;
- unsigned char mask,buffer;
- /*一个汉字16行*/
- for (i=0;i<16;i++)
- {
- /*汉字左半部分*/
- mask=0x80; //从bit7开始判断
- buffer=ch[i*2]; //提取一行的第一个字节
- /*一个字节有8个位,每一位代表字模数据对应的点是否描颜色*/
- for (j=0;j<8;j++)
- {
- if (buffer&mask)
- {
- PutPixel(x+j,y+i,color); //为笔画上色
- }
- else
- {
- PutPixel(x+j,y+i,backColor); //背景色
- }
- mask=mask>>1; //移位,为判断下一位作准备
- }
- /*汉字右半部分*/
- mask=0x80; //从bit7开始判断
- buffer=ch[i*2+1]; //提取一行的第二个字节
- /*一个字节有8个位,每一位代表字模数据对应的点是否描颜色*/
- for (j=0;j<8;j++)
- {
- if (buffer&mask)
- {
- PutPixel(x+j+8,y+i,color); //为笔画上色
- }
- else
- {
- PutPixel(x+j+8,y+i,backColor);//背景色
- }
- mask=mask>>1; //移位,为判断下一位作准备
- }
- }
- }
3)时钟设置
- void RTC_Time_Set( void )
- {
- /*RTC读写使能,选择BCD时钟、计数器,无复位,1/32768*/
- rRTCCON = 1 ;
- rBCDYEAR = 0x13; /*年*/
- rBCDMON = 0x05; /*月*/
- rBCDDATE = 0x09; /*日*/
- rBCDDAY = 0x04; /*星*/
- rBCDHOUR = 0x10; /*小时*/
- rBCDMIN = 0x57; /*分*/
- rBCDSEC = 0x20; /*秒*/
- /*关读写使能*/
- rRTCCON &= ~1 ;
- }
4)数字绘制
- void Draw_Text_8_16(U32 x,U32 y,U32 color,U32 backColor,const unsigned char *chs)
- {
- U32 i=0;
- while (*chs != '\0')
- { //汉字内码都是大于0xa0
- if (*chs > 0xa0)
- {
- /*查汉字表*/
- for (i=0 ;i < GB16_NUM();i++)
- {
- /*换行*/
- if(x>235)
- {
- x=0;
- y=y+16;
- }
- /*判断汉字是否匹配*/
- if ((*chs == hz_index[i]) && (*(chs+1) == hz_index[i+1]))
- {
- /*写汉字*/
- Draw_Text16(x,y,color,backColor,&hz[16*(i)]);
- /*增加X坐标值,为写下一个汉字或字符作准备*/
- x +=16;
- break;
- }
- }
- /*字符串指针加2,一个汉字编译后内码占两个字节*/
- chs+=2;
- }
- /*如果是字符*/
- else
- {
- /*换行*/
- if(x>230)
- {
- x=0;
- y=y+16;
- }
- /*查字符表*/
- for (i=0 ;i < ASCII_NUM();i++)
- {
- /*判断字符是否匹配*/
- if (*chs == zf_index[i])
- {
- /*写字符*/
- Draw_ASCII(x,y,color,backColor,&zf[16*i]);
- /*增加X坐标值,为写下一个汉字或字符作准备*/
- x += 8;
- break;
- }
- }
- /*字符串指针加1,一个字符编译后内码占1个字节*/
- chs++;
- }
- }
- }
5)时钟显示
- void rtc_display_lcd(void)
- {
- //0 1 2 3 4
- unsigned char time[]={'2','0','1','3','-',
- //5 6 7 8 9 10
- '0','5','-','0','9',' ',
- //11 12 13 14 15 16 17 18
- '1','5',':','2','1',':','5','9',
- '\0'};
- time[2]=rBCDYEAR/16+'0'; //年十位,16进制
- time[3]=rBCDYEAR%16+'0'; //年个位
- time[5]=rBCDMON/16+'0'; //月十位
- time[6]=rBCDMON%16+'0'; //月个位
- time[8]=rBCDDATE/16+'0'; //天十位
- time[9]=rBCDDATE%16+'0'; //天个位
- time[11]=rBCDHOUR/16+'0'; //时十位
- time[12]=rBCDHOUR%16+'0'; //时个位
- time[14]=rBCDMIN/16+'0'; //分十位
- time[15]=rBCDMIN%16+'0'; //分个位
- time[17]=rBCDSEC/16+'0'; //秒十位
- time[18]=rBCDSEC%16+'0'; //秒个位
- /*调用LCD显示时间程序*/
- if(time[18]%2==1)
- {
- time[16]=':';
- }
- else
- {
- time[16]=' ';
- }
- Draw_Text_8_16(50,220,0x0,0xffff,(const unsigned char * )time);
- }
6)实时刷新
- while (1)
- {
- /*读取时间,并LCD显示*/
- rtc_display_lcd();
- for(r=0;r<3;r++)
- {
- for(a=0;a<(2*PI);)
- {
- X=(int)(r*cos(a)+120);
- Y=(int)(r*sin(a)+120);
- LCD_BUFFER[Y][X]=0X00;
- a=a+(PI/360);
- }
- }
- /************秒指针的显示*************/
- n=(rBCDSEC/16)*10+(rBCDSEC%16);
- if(secondbit!=n)
- {
- for(w=0;w<66;w++)//清前一秒秒表指针,必须要清掉
- {
- X=(int)(w*cos((3*PI/2)+secondbit*(PI/30))+120);
- Y=(int)(w*sin((3*PI/2)+secondbit*(PI/30))+120);
- LCD_BUFFER[Y][X]=0Xffff;
- }
- for(w=0;w<66;w++) //显示当前秒表指针
- {
- X=(int)(w*cos((3*PI/2)+n*(PI/30))+120);
- Y=(int)(w*sin((3*PI/2)+n*(PI/30))+120);
- LCD_BUFFER[Y][X]=0X00;
- }
- }
- /************分指针的显示*************/
- m=(rBCDMIN/16)*10+(rBCDMIN%16);
- if(minbit!=m||m==secondbit)
- {
- for(w=0;w<55;w++)//清前一秒分钟指针
- {
- X=(int)(w*cos((3*PI/2)+minbit*(PI/30))+120);
- Y=(int)(w*sin((3*PI/2)+minbit*(PI/30))+120);
- LCD_BUFFER[Y][X]=0Xffff;
- }
- for(w=0;w<55;w++) //显示当前分钟指针
- {
- X=(int)(w*cos((3*PI/2)+m*(PI/30))+120);
- Y=(int)(w*sin((3*PI/2)+m*(PI/30))+120);
- LCD_BUFFER[Y][X]=0X00;
- }
- }
- /************小时指针的显示*************/
- h=(rBCDHOUR/16)*10+(rBCDHOUR%16);
- if(h>12)
- h-=12;
- if(hourbit!=h||h==(minbit/5)||h==(secondbit/5))
- {
- for(w=0;w<38;w++)//清前一小时指针
- {
- X=(int)(w*cos((3*PI/2)+hourbit*(PI/30))+120);
- Y=(int)(w*sin((3*PI/2)+hourbit*(PI/30))+120);
- LCD_BUFFER[Y][X]=0xffff;
- }
- for(w=0;w<38;w++) //显示当前小时指针
- {
- X=(int)(w*cos((3*PI/2)+h*(PI/6))+120);
- Y=(int)(w*sin((3*PI/2)+h*(PI/6))+120);
- LCD_BUFFER[Y][X]=0X00;
- }
- }
- hourbit = h;
- minbit = m;
- secondbit = n;
- }
时钟效果
【ARM】2440裸机系列-RTC数字时钟的更多相关文章
- 【ARM】2440裸机系列-gpio按键控制
功能 通过GPIO,实现按键1点亮LED1,按键2点亮LED2…… 说明 1)因为2440的按键只涉及行,所以在扫描按键时比2410简单了很多 2)在进行移位操作之前,必须进行数据寄存器的初始化,否则 ...
- 【ARM】2440裸机系列-图片显示
功能 LCD显示字汉字,字符和图片 说明 汉字,字符和图片需要用相应的取模软件得到相应的c文件,然后包含到工程中 主要代码 1)绘制背景 void Brush_ U32 c) { int x,y ...
- 第43章 RTC—实时时钟—零死角玩转STM32-F429系列
第43章 RTC—实时时钟 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fireg ...
- RTC实时时钟驱动
RTC(Real-Time Clock)实时时钟为操作系统提供了一个可靠的时间,并且在断电的情况下,RTC实时时钟也可以通过电池供电,一直运行下去. RTC通过STRB/LDRB这两个ARM指令向CP ...
- RTC实时时钟
作者:宋老师,华清远见嵌入式学院讲师. 1.1 RTC介绍 在 一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能够正常工作(通常采用后备 ...
- nrf51822裸机教程-RTC
RTC0被协议栈使用了.所以在跑蓝牙程序的情况下.RTC0不能使用. RTC相关寄存器如下: EVTEN,EVTENSET,EVTENCLR. 这三个寄存器用来设置是否使能某个事件.(TICK,OVR ...
- 第43章 RTC—实时时钟
第43章 RTC—实时时钟 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fireg ...
- 模拟时钟(AnalogClock)和数字时钟(DigitalClock)
Demo2\clock_demo\src\main\res\layout\activity_main.xml <LinearLayout xmlns:android="http://s ...
- stm32——RTC实时时钟
stm32——RTC实时时钟 一.关于时间 2038年问题 在计算机应用上,2038年问题可能会导致某些软件在2038年无法正常工作.所有使用UNIX时间表示时间的程序都将将受其影响,因为它们以自19 ...
随机推荐
- Eclipse启动分析。。
最近研究了一下Eclipse的启动过程,查了点资料,也有点收获.下面是搜集到的一个比较好的说明,共享下... 在Eclipse启动过程中,Eclipse.exe负责启动,也就是把startup.jar ...
- iOS转让app-您必须移除要转让的 App 的所有构建版本和测试员,并清除“测试信息”下的所有信息字段解决方案
原文详细步骤篇: iOS App转让流程详情教程篇 此文为遇到的一个问题,及如何解决: 问题描述: 转让app遇到这个错误,如何解决? 不解决这个,app是无法进行转让的. 原因分析: 这个是由于Te ...
- Java反编译工具:Java Decompiler
Java Decompiler项目旨在开发一套工具集,这套工具集可以反编译并分析Java5之后的Java字节码. 它主要包括四个部分. JD-Core:Java Decompiler的核心库,它能够根 ...
- struts2基本配置详解2
接上篇struts2基本配置详解,还有一些配置没有讲到,下面将继续. struts.xml <package name="com.amos.web.action" names ...
- iOS 关于 GIF 图片那点事
前言 前几天我们项目组的群里提了这么一件事情:在我们的应用中存储动态的GIF图到相册,保存的图片变成了静态图片.而微博则能正确保存,可见这并不是一个技术不可实现的.前不久刚好看了苹果关于ImageIO ...
- Java多线程编程:Callable、Future和FutureTask浅析
通过前面几篇的学习,我们知道创建线程的方式有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果,那如果我们想要获取返回结 ...
- 两段检验系统生成的identityHashCode是否重复的代码
前言:承接上一篇hashCode和identityHashCode 的关系,下面的两段简单的程序主要是检验一下系统生成的identityHashCode是否存在重复的情况. 1:可以自由控制生成对象的 ...
- 【转】Kotlin 和 Checked Exception
Kotlin 和 Checked Exception 最近 JetBrains 的 Kotlin 语言忽然成了热门话题.国内小编们传言说,Kotlin 取代了 Java,成为了 Android 的“钦 ...
- 纯css打造美丽的html表格
花了点时间,自己做了个美丽的html表格,採用技术有css,html,其它的废话我也不多说了,直接上图.上代码. 界面图片: HTML代码: <%@ page language="ja ...
- C#中const 详细分析与说明
const是一个c语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮 ...