功能
裸机程序,实现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;
}
|
时钟效果
本文转自infohacker 51CTO博客,原文链接:http://blog.51cto.com/liucw/1197253