【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 ...
随机推荐
- Mac系统清理、占用空间大、空间不够、查看系统文件大小分布
背景: 最近老提示空间不够,很尴尬,一直弹系统提示 如图,256的空间,就剩下几个G了,其中最大头的系统占用:160G,占比60%多 正常情况下:我们可以点击管理,进入到系统磁盘优化界面: 这种适用于 ...
- iOS10 打开APP设置界面和WIFI界面
在iOS10以上,权限这块有了一些变化 首先在info的URL Types 添加 prefs 1.打开APP设置界面 //打开设置 let url:NSURL = NSURL(string: UIA ...
- Delphi单元文件引用名称问题
Delphi新版本的单元文件格式变化了,如windows变成了winapi.windows,如果想在单元引用中使用简称,则需要在工程选项中配置: 这样就可以使用全名或简写来引用单元了.
- 【LeetCode】213. House Robber II
House Robber II Note: This is an extension of House Robber. After robbing those houses on that stree ...
- linux平台下server运维问题分析与定位
结合我工作中碰到的运维问题,总结一下Linux下server常见的运维问题以及定位方式.这里的server主要指自主开发的逻辑server,web srv因为通常采用通用的架构所以问题比较少. 逻辑s ...
- Oracle中INTERSECT,MINUS,UNION,UNION ALL用法
intersect 就是交集minus 就是差集 交集就是两个结果集中都有的元素 比如 select uid from tb1 intersect select uid from tb2 那么既存在t ...
- Git 获取仓库(分布式版本控制系统)
1.在现有目录中初始化仓库 如果你打算使用 Git 来对现有的项目进行管理,你只需要进入该项目目录并输入以下命令. # 初始化仓库 $ git init 该命令将创建一个名为 .git 的子目录,这个 ...
- ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段
ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...
- 忙里偷闲写的小例子---读取android根目录下的文件或文件夹
最近几天真的是各种意义上的忙,忙着考试,还要忙着课程设计,手上又有外包的项目,另一边学校的项目还要搞,自己的东西还在文档阶段,真的是让人想死啊!! 近半个月来,C#这方面的编码比较多,android和 ...
- 高级Unix命令
在Unix操作中有太多太多的命令,这些命令的强大之处就是一个命令只干一件事,并把这件事干好.Do one thing, do it well.这是unix的哲学.而且Unix首创的管道可以把这些命令任 ...