【ARM】s3c2440裸机之RTC数字时钟

功能

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



主要代码


1)背景绘制

1
2
3
4
5
6
7
8
9
10
11
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)文字绘制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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)时钟设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)数字绘制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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)时钟显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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)实时刷新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
     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;
     }



时钟效果

105756106.jpg



本文转自infohacker 51CTO博客,原文链接:http://blog.51cto.com/liucw/1197253


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值