博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【ARM】s3c2440裸机之RTC数字时钟
阅读量:6293 次
发布时间:2019-06-22

本文共 4793 字,大约阅读时间需要 15 分钟。

功能

   裸机程序,实现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

转载地址:http://sbjta.baihongyu.com/

你可能感兴趣的文章
【GoldenGate】使用OGG,两个Oracle库之间单向同步数据
查看>>
Jenkins构建完成后通过SVN Publisher Plugin上传文件到指定的SVN(教程收集)
查看>>
10-01 Java 类,抽象类,接口的综合小练习--运动员和教练
查看>>
一级域名和二级域名的区别是什么?作用怎样?
查看>>
Jedis连接redis
查看>>
在windows下安装python包管理器pip及使用
查看>>
CSS属性选择器和部分伪类
查看>>
JAVA正則表達式小总结
查看>>
BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers 总结
查看>>
母亲与背影
查看>>
pasty公式
查看>>
jmeter使用beanshell构造参数化
查看>>
python 学习笔记 12 -- 写一个脚本获取城市天气信息
查看>>
Error code:1728 Cannot load from mysql.proc. The table is probably corrupted
查看>>
soapUI学习笔记--用例字段参数化
查看>>
一些通用性的haproxy调优tips
查看>>
Java中泛型的各种使用
查看>>
这些git技能够你用一年了
查看>>
Android开发学习之路--Notification之初体验
查看>>
用友ERP T6技术解析(六) 库龄分析
查看>>