标题:在字符模式下模拟的LED时钟
只看楼主
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:289
专家分:23
注 册:2008-2-24
 问题点数:0 回复次数:1 
在字符模式下模拟的LED时钟
这一篇文章建立在上一篇用LCD样式显示数字字符串的基础上。将显示当前的BIOS时间,按任意键退出程序。代码如下:

程序代码:
/***********************************************

 * Author: hoodlum1980

 * Descri: A LCD-Style Clock in Character Mode

 ***********************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <dos.h>

void PrintVer(int,int,char*);/* 打印垂直笔划 */
void PrintHor(int,int,char*);/* 打印水平笔划 */
void PrintNumbers(int,char*);/* 打印一组数字 */

/*LCD的字型码*/

/*   -0-
    1   2
     -3-
    4   5
     -6-        */

int LCDCODES[][7]=
{                 /* char asiic figure */
    {1,1,1,0,1,1,1},/* '0' 0x30 0 */
    {0,0,1,0,0,1,0},/* '1' 0x31 1 */
    {1,0,1,1,1,0,1},/* '2' 0x32 2 */
    {1,0,1,1,0,1,1},/* '3' 0x33 3 */
    {0,1,1,1,0,1,0},/* '4' 0x34 4 */
    {1,1,0,1,0,1,1},/* '5' 0x35 5 */
    {1,1,0,1,1,1,1},/* '6' 0x36 6 */
    {1,0,1,0,0,1,0},/* '7' 0x37 7 */
    {1,1,1,1,1,1,1},/* '8' 0x38 8 */
    {1,1,1,1,0,1,1},/* '9' 0x39 9 */
    {0,0,0,1,0,0,0},/* ':' 0x3A - */
    {0,0,0,0,0,0,0} /* ';' 0x3B   */
};

char c_ver='$'; /* 组成垂直笔划的字符 */
char c_hor='='; /* 组成水平笔划的字符 */

/* 两个相邻字母中间隔了一个空列 ,因此平均每个字母占据n+3列,最后一列为间隔 */
/* 打印竖直笔画,n-笔画长度,section=1或者4,numbers-数字字符串 */
void PrintVer(int n,int section,char *numbers)
{
    char *line;
    int i,len=(n+3)*strlen(numbers);
    line=(char*)malloc(len+1);
    if(line==NULL)
        return;
    memset(line,' ',len);
    for(i=0;i<strlen(numbers);i++)
    {
        if(LCDCODES[*(numbers+i)-'0'][section])
            *(line+(n+3)*i)=c_ver;
        if(LCDCODES[*(numbers+i)-'0'][section+1])
            *(line+(n+3)*i+(n+1))=c_ver;
    }

    /*检查最后一个字符,如果没有笔画,要使\0前移2格!*/
    line[len-1]='\0';
    /*打印n行*/
    for(i=0;i<n;i++)
        printf("%s\n",line);
    free(line);
}

/*打印水平笔画,n-笔画长度,section=0,3,or 6,numbers-数字字符串*/
void PrintHor(int n,int section,char *numbers)
{
    char *line;
    int i,len=(n+3)*strlen(numbers);
    line=(char*)malloc(len+1);
    if(line==NULL)
        return;
    memset(line,' ',len);

    for(i=0;i<strlen(numbers);i++)
    {
        if(LCDCODES[*(numbers+i)-'0'][section])
            memset((line+(n+3)*i+1),c_hor,n);
    }

    /*注意最后一个数字后面无需空格了!所以多缩进一个位置*/
    line[len-1]='\0';
    /*打印1行*/
    printf("%s\n",line);
    free(line);
}

/* Print A set of Numbers : "23456" e.g. */
void PrintNumbers(int n,char *numbers)
{
    PrintHor(n,0,numbers);    /*  ----    */
    PrintVer(n,1,numbers);    /* |    |    */
    PrintHor(n,3,numbers);    /*  ----    */
    PrintVer(n,4,numbers);    /* |    |    */
    PrintHor(n,6,numbers);    /*  ----    */
}

/*用LCD样式显示当前的Bios时间*/
int main()
{
    char buffer[10];
    int n=2, lastSec=-1;     /* n: 笔画长度; lastSec: 缓存的秒; */
    struct time curTime;     /* curTime: 当前bios时间; */
    textbackground(BLACK);
    textcolor(WHITE);
    clrscr();
    while(!kbhit())
    {
        gettime(&curTime);
        if(curTime.ti_sec!=lastSec)
        {
            /* %2d:正数表示右对齐, 0表示补零,仅右对齐时有效 */
            sprintf(buffer,"%2d:%02d:%02d", curTime.ti_hour, curTime.ti_min, curTime.ti_sec);
            gotoxy(1,2);
            PrintNumbers(n,buffer);
            lastSec=curTime.ti_sec;
        }
        delay(200);
    }
}

运行效果截图:

[[it] 本帖最后由 hoodlum1980 于 2008-3-16 16:50 编辑 [/it]]

LEDCLOCK.JPG (9.66 KB)
搜索更多相关主题的帖子: LED 时钟 字符 include int 
2008-03-15 19:25
awsw911
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-2-27
得分:0 
c的高手啊!!
太有才了吧!!
不知道什么时候可以跟你一样啊!!
唉!!努力中!!
2008-03-15 20:22



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-203582-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.121994 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved