功能

裸机程序,实现LCD显示数字时钟


主要代码

 

1)背景绘制

  1. void Brush_ U32 c)
  2. {
  3. int x,y ;
  4. for ( y = 0 ; y < LCD_HEIGHT ; y++ )
  5. {
  6. for ( x = 0 ; x < LCD_WIDTH ; x++ )
  7. {
  8. LCD_BUFFER[y][x] = c ;
  9. }
  10. }
  11. }

 


2)文字绘制

  1. void Draw_Text16(U32 x,U32 y,U32 color,U32 backColor,const unsigned char ch[])
  2. {
  3. unsigned short int i,j;
  4. unsigned char mask,buffer;
  5. /*一个汉字16行*/
  6. for (i=0;i<16;i++)
  7. {
  8. /*汉字左半部分*/
  9. mask=0x80; //从bit7开始判断
  10. buffer=ch[i*2]; //提取一行的第一个字节
  11. /*一个字节有8个位,每一位代表字模数据对应的点是否描颜色*/
  12. for (j=0;j<8;j++)
  13. {
  14. if (buffer&mask)
  15. {
  16. PutPixel(x+j,y+i,color); //为笔画上色
  17. }
  18. else
  19. {
  20. PutPixel(x+j,y+i,backColor); //背景色
  21. }
  22. mask=mask>>1; //移位,为判断下一位作准备
  23. }
  24. /*汉字右半部分*/
  25. mask=0x80; //从bit7开始判断
  26. buffer=ch[i*2+1]; //提取一行的第二个字节
  27. /*一个字节有8个位,每一位代表字模数据对应的点是否描颜色*/
  28. for (j=0;j<8;j++)
  29. {
  30. if (buffer&mask)
  31. {
  32. PutPixel(x+j+8,y+i,color); //为笔画上色
  33. }
  34. else
  35. {
  36. PutPixel(x+j+8,y+i,backColor);//背景色
  37. }
  38. mask=mask>>1; //移位,为判断下一位作准备
  39. }
  40. }
  41. }

 


3)时钟设置

  1. void RTC_Time_Set( void )
  2. {
  3. /*RTC读写使能,选择BCD时钟、计数器,无复位,1/32768*/
  4. rRTCCON = 1 ;
  5. rBCDYEAR = 0x13; /*年*/
  6. rBCDMON = 0x05; /*月*/
  7. rBCDDATE = 0x09; /*日*/
  8. rBCDDAY = 0x04; /*星*/
  9. rBCDHOUR = 0x10; /*小时*/
  10. rBCDMIN = 0x57; /*分*/
  11. rBCDSEC = 0x20; /*秒*/
  12. /*关读写使能*/
  13. rRTCCON &= ~1 ;
  14. }

 


4)数字绘制

  1. void Draw_Text_8_16(U32 x,U32 y,U32 color,U32 backColor,const unsigned char *chs)
  2. {
  3. U32 i=0;
  4. while (*chs != '\0')
  5. { //汉字内码都是大于0xa0
  6. if (*chs > 0xa0)
  7. {
  8. /*查汉字表*/
  9. for (i=0 ;i < GB16_NUM();i++)
  10. {
  11. /*换行*/
  12. if(x>235)
  13. {
  14. x=0;
  15. y=y+16;
  16. }
  17. /*判断汉字是否匹配*/
  18. if ((*chs == hz_index[i]) && (*(chs+1) == hz_index[i+1]))
  19. {
  20. /*写汉字*/
  21. Draw_Text16(x,y,color,backColor,&hz[16*(i)]);
  22. /*增加X坐标值,为写下一个汉字或字符作准备*/
  23. x +=16;
  24. break;
  25. }
  26. }
  27. /*字符串指针加2,一个汉字编译后内码占两个字节*/
  28. chs+=2;
  29. }
  30. /*如果是字符*/
  31. else
  32. {
  33. /*换行*/
  34. if(x>230)
  35. {
  36. x=0;
  37. y=y+16;
  38. }
  39. /*查字符表*/
  40. for (i=0 ;i < ASCII_NUM();i++)
  41. {
  42. /*判断字符是否匹配*/
  43. if (*chs == zf_index[i])
  44. {
  45. /*写字符*/
  46. Draw_ASCII(x,y,color,backColor,&zf[16*i]);
  47. /*增加X坐标值,为写下一个汉字或字符作准备*/
  48. x += 8;
  49. break;
  50. }
  51. }
  52. /*字符串指针加1,一个字符编译后内码占1个字节*/
  53. chs++;
  54. }
  55. }
  56. }

 


5)时钟显示

  1. void rtc_display_lcd(void)
  2. {
  3. //0 1 2 3 4
  4. unsigned char time[]={'2','0','1','3','-',
  5. //5 6 7 8 9 10
  6. '0','5','-','0','9',' ',
  7. //11 12 13 14 15 16 17 18
  8. '1','5',':','2','1',':','5','9',
  9. '\0'};
  10. time[2]=rBCDYEAR/16+'0'; //年十位,16进制
  11. time[3]=rBCDYEAR%16+'0'; //年个位
  12. time[5]=rBCDMON/16+'0'; //月十位
  13. time[6]=rBCDMON%16+'0'; //月个位
  14. time[8]=rBCDDATE/16+'0'; //天十位
  15. time[9]=rBCDDATE%16+'0'; //天个位
  16. time[11]=rBCDHOUR/16+'0'; //时十位
  17. time[12]=rBCDHOUR%16+'0'; //时个位
  18. time[14]=rBCDMIN/16+'0'; //分十位
  19. time[15]=rBCDMIN%16+'0'; //分个位
  20. time[17]=rBCDSEC/16+'0'; //秒十位
  21. time[18]=rBCDSEC%16+'0'; //秒个位
  22. /*调用LCD显示时间程序*/
  23. if(time[18]%2==1)
  24. {
  25. time[16]=':';
  26. }
  27. else
  28. {
  29. time[16]=' ';
  30. }
  31. Draw_Text_8_16(50,220,0x0,0xffff,(const unsigned char * )time);
  32. }

 


6)实时刷新

  1. while (1)
  2. {
  3. /*读取时间,并LCD显示*/
  4. rtc_display_lcd();
  5. for(r=0;r<3;r++)
  6. {
  7. for(a=0;a<(2*PI);)
  8. {
  9. X=(int)(r*cos(a)+120);
  10. Y=(int)(r*sin(a)+120);
  11. LCD_BUFFER[Y][X]=0X00;
  12. a=a+(PI/360);
  13. }
  14. }
  15. /************秒指针的显示*************/
  16. n=(rBCDSEC/16)*10+(rBCDSEC%16);
  17. if(secondbit!=n)
  18. {
  19. for(w=0;w<66;w++)//清前一秒秒表指针,必须要清掉
  20. {
  21. X=(int)(w*cos((3*PI/2)+secondbit*(PI/30))+120);
  22. Y=(int)(w*sin((3*PI/2)+secondbit*(PI/30))+120);
  23. LCD_BUFFER[Y][X]=0Xffff;
  24. }
  25. for(w=0;w<66;w++) //显示当前秒表指针
  26. {
  27. X=(int)(w*cos((3*PI/2)+n*(PI/30))+120);
  28. Y=(int)(w*sin((3*PI/2)+n*(PI/30))+120);
  29. LCD_BUFFER[Y][X]=0X00;
  30. }
  31. }
  32. /************分指针的显示*************/
  33. m=(rBCDMIN/16)*10+(rBCDMIN%16);
  34. if(minbit!=m||m==secondbit)
  35. {
  36. for(w=0;w<55;w++)//清前一秒分钟指针
  37. {
  38. X=(int)(w*cos((3*PI/2)+minbit*(PI/30))+120);
  39. Y=(int)(w*sin((3*PI/2)+minbit*(PI/30))+120);
  40. LCD_BUFFER[Y][X]=0Xffff;
  41. }
  42. for(w=0;w<55;w++) //显示当前分钟指针
  43. {
  44. X=(int)(w*cos((3*PI/2)+m*(PI/30))+120);
  45. Y=(int)(w*sin((3*PI/2)+m*(PI/30))+120);
  46. LCD_BUFFER[Y][X]=0X00;
  47. }
  48. }
  49. /************小时指针的显示*************/
  50. h=(rBCDHOUR/16)*10+(rBCDHOUR%16);
  51. if(h>12)
  52. h-=12;
  53. if(hourbit!=h||h==(minbit/5)||h==(secondbit/5))
  54. {
  55. for(w=0;w<38;w++)//清前一小时指针
  56. {
  57. X=(int)(w*cos((3*PI/2)+hourbit*(PI/30))+120);
  58. Y=(int)(w*sin((3*PI/2)+hourbit*(PI/30))+120);
  59. LCD_BUFFER[Y][X]=0xffff;
  60. }
  61. for(w=0;w<38;w++) //显示当前小时指针
  62. {
  63. X=(int)(w*cos((3*PI/2)+h*(PI/6))+120);
  64. Y=(int)(w*sin((3*PI/2)+h*(PI/6))+120);
  65. LCD_BUFFER[Y][X]=0X00;
  66. }
  67. }
  68. hourbit = h;
  69. minbit = m;
  70. secondbit = n;
  71. }

时钟效果

【ARM】2440裸机系列-RTC数字时钟的更多相关文章

  1. 【ARM】2440裸机系列-gpio按键控制

    功能 通过GPIO,实现按键1点亮LED1,按键2点亮LED2…… 说明 1)因为2440的按键只涉及行,所以在扫描按键时比2410简单了很多 2)在进行移位操作之前,必须进行数据寄存器的初始化,否则 ...

  2. 【ARM】2440裸机系列-图片显示

    功能 LCD显示字汉字,字符和图片 说明 汉字,字符和图片需要用相应的取模软件得到相应的c文件,然后包含到工程中 主要代码   1)绘制背景 void Brush_ U32 c) { int x,y ...

  3. 第43章 RTC—实时时钟—零死角玩转STM32-F429系列

    第43章     RTC—实时时钟 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fireg ...

  4. RTC实时时钟驱动

    RTC(Real-Time Clock)实时时钟为操作系统提供了一个可靠的时间,并且在断电的情况下,RTC实时时钟也可以通过电池供电,一直运行下去. RTC通过STRB/LDRB这两个ARM指令向CP ...

  5. RTC实时时钟

    作者:宋老师,华清远见嵌入式学院讲师. 1.1 RTC介绍 在 一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能够正常工作(通常采用后备 ...

  6. nrf51822裸机教程-RTC

    RTC0被协议栈使用了.所以在跑蓝牙程序的情况下.RTC0不能使用. RTC相关寄存器如下: EVTEN,EVTENSET,EVTENCLR. 这三个寄存器用来设置是否使能某个事件.(TICK,OVR ...

  7. 第43章 RTC—实时时钟

    第43章     RTC—实时时钟 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fireg ...

  8. 模拟时钟(AnalogClock)和数字时钟(DigitalClock)

    Demo2\clock_demo\src\main\res\layout\activity_main.xml <LinearLayout xmlns:android="http://s ...

  9. stm32——RTC实时时钟

    stm32——RTC实时时钟 一.关于时间 2038年问题 在计算机应用上,2038年问题可能会导致某些软件在2038年无法正常工作.所有使用UNIX时间表示时间的程序都将将受其影响,因为它们以自19 ...

随机推荐

  1. Eclipse启动分析。。

    最近研究了一下Eclipse的启动过程,查了点资料,也有点收获.下面是搜集到的一个比较好的说明,共享下... 在Eclipse启动过程中,Eclipse.exe负责启动,也就是把startup.jar ...

  2. iOS转让app-您必须移除要转让的 App 的所有构建版本和测试员,并清除“测试信息”下的所有信息字段解决方案

    原文详细步骤篇: iOS App转让流程详情教程篇 此文为遇到的一个问题,及如何解决: 问题描述: 转让app遇到这个错误,如何解决? 不解决这个,app是无法进行转让的. 原因分析: 这个是由于Te ...

  3. Java反编译工具:Java Decompiler

    Java Decompiler项目旨在开发一套工具集,这套工具集可以反编译并分析Java5之后的Java字节码. 它主要包括四个部分. JD-Core:Java Decompiler的核心库,它能够根 ...

  4. struts2基本配置详解2

    接上篇struts2基本配置详解,还有一些配置没有讲到,下面将继续. struts.xml <package name="com.amos.web.action" names ...

  5. iOS 关于 GIF 图片那点事

    前言 前几天我们项目组的群里提了这么一件事情:在我们的应用中存储动态的GIF图到相册,保存的图片变成了静态图片.而微博则能正确保存,可见这并不是一个技术不可实现的.前不久刚好看了苹果关于ImageIO ...

  6. Java多线程编程:Callable、Future和FutureTask浅析

    通过前面几篇的学习,我们知道创建线程的方式有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果,那如果我们想要获取返回结 ...

  7. 两段检验系统生成的identityHashCode是否重复的代码

    前言:承接上一篇hashCode和identityHashCode 的关系,下面的两段简单的程序主要是检验一下系统生成的identityHashCode是否存在重复的情况. 1:可以自由控制生成对象的 ...

  8. 【转】Kotlin 和 Checked Exception

    Kotlin 和 Checked Exception 最近 JetBrains 的 Kotlin 语言忽然成了热门话题.国内小编们传言说,Kotlin 取代了 Java,成为了 Android 的“钦 ...

  9. 纯css打造美丽的html表格

    花了点时间,自己做了个美丽的html表格,採用技术有css,html,其它的废话我也不多说了,直接上图.上代码. 界面图片: HTML代码: <%@ page language="ja ...

  10. C#中const 详细分析与说明

    const是一个c语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮 ...