数字时钟C代码/ PIC,Protues

时间:2015-05-08 08:47:26

标签: microcontroller digital lcd pic18

本学期我参加了一个微控制器课程,我有一个使用PIC18制作数字时钟并在LCD上显示的任务。我的代码是用C语言编写的,我可以用来模拟。

我写了一段代码,但是如果有人能帮助我搞清楚我的错误,那就错了。 谢谢

    #include <P18F4580.h>

#define ldata PORTD
#define rs PORTBbits.RB0
#define rw PORTBbits.RB1
#define en PORTBbits.RB2


void msdelay(unsigned int itime)
{   unsigned int i,j;
    for (i=0; i<itime; i++)
        for (j=0; j<135; j++);
}

void lcdcmd(unsigned char value)
{   ldata = value;
    rs = 0;
    rw = 0;
    en = 1;
    msdelay(1);
    en = 0;
}

void lcddata(unsigned char value)
{   ldata = value;
    rs = 1;
    rw = 0;
    en = 1;
    msdelay(1);
    en = 0;
}

void main()
{
    TRISD = 0;
    TRISB = 0;
    en = 0;

    int msCounter  =0;
    int secCounter =0;
    int minCounter =0;
    int hrCounter  =0;

    msdelay(15);
    lcdcmd(0x01);   //Clear display
    msdelay(15);
    lcdcmd(0x02);   //Home cursor
    msdelay(15);
    lcdcmd(0x06);   //Left to right, still
    msdelay(250);
    lcdcmd(0x0E);   //display cursor
    msdelay(250);
    lcdcmd(0x3C);   //5x10 2 lines
    msdelay(15);
    lcdcmd(0x86);


     while(1)
    {
    msdelay(15);
    lcdcmd(0x08);
    lcddata(secCounter);

        msdelay(15);
        msCounter++;

        if (msCounter==1000)
        {secCounter++;      msCounter=0;    }
        if (secCounter==60)
        {minCounter++;      secCounter=0;   }
        if (minCounter==60)
        {hrCounter++;       minCounter=0;   }
        if (hrCounter==24)
        {hrCounter=0;                       }

        msdelay(15);
        lcddata(hrCounter);
        msdelay(15);
        lcddata(':');
        msdelay(15);
        lcddata(minCounter);
        msdelay(15);
        lcddata(':');
        msdelay(15);
        lcddata(secCounter);
    }
}

2 个答案:

答案 0 :(得分:0)

使用7段显示器比使用LCD更好地显示数字时钟。

答案 1 :(得分:0)

在您的程序中使用此代码并检查...                      对于 lcddata(mscounter);

           use *thous(mscounter);*

在代码中声明并检查                lcdcmd(0×08);改为使用                  lcdcmd(0x80的);

         void thous(unsigned int count)
                   {
            lcddata((count/1000)+0x30);
             lcddata(((count/100)%10)+0x30);
                lcddata(((count%100)/10)+0x30);
                lcddata((count%10)+0x30);

           }