打印

1602电子钟

[复制链接]
2166|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xzwangc|  楼主 | 2009-10-6 19:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


//******** 文 件 名:   lcd_time  ************
//******** 功能概要: LCD液晶显示时间 ***********

//******** 说明:   调时、报时、闹钟 ***********

//**********头文件区************
#include<reg52.h>
#include<math.h>
#include<absacc.h>
#include<intrins.h>

//*********宏定义方便使用*******
#define uchar unsigned char
#define uint unsigned int

//*********定义变量区***********
sbit dula=P2^6;       //数码管段选
sbit wela=P2^7;       //数码管位选
sbit lcden=P3^4;      //LCD使能信号
sbit lcdrs=P3^5;      //LCD数据/命令选择信号

uchar code tab_index[]="www.wch16621.cn";
uchar tab_time[]={0,0,10,0,0,10,0,0};       //装时间转换数据
uchar code tab_char[]="0123456789:";       //
uchar code tab_chartime[]="Time ";

uchar count,hour=22,minu=58,sec=26;

//*********函数声明区*****************
void lcd_dis();          //lcd显示函数
void lcd_init();         //LCD初始化函数
void write_com(uchar);   //写命令函数
void write_data(uchar); //写数据函数
void delay(uint);        //延时函数
void trans();            //时间转换函数
void write_char();       //写字符串函数
void int_time0();        //定时器0中断函数
void time();             //计时函数


//*********主函数开始***********
void main()
{
    TMOD=0x01;     //定时器0方式1
    EA=1;
    ET0=1;
    TH0=0xb8;      //20ms初值,11.0592MHZ
    TL0=0X00;
    TR0=1;
   
    write_com(1);
    lcd_init();
    while(1)
    {
        time();
        trans();
        lcd_dis();
    }
}

void int_time0() interrupt 1
{
    TMOD=0x01;     //定时器0方式1
    EA=1;
    ET0=1;
    TH0=0xb8;
    TL0=0X00;   ////20ms初值,11.0592MHZ
    TR0=1;
    count++;
}

void time()
{
    if(count>=50)   //20ms*50=1s
    {
        count=0;
        sec++;
        if(sec>=60)
        {
           sec=0;
           minu++;
           if(minu>=60)
           {
            minu=0;
            hour++;
            if(hour>=24)
            {
             hour=0;
            }
           }
        }
    }
}


//*********时间转换函数开始*****
void trans()
{
    tab_time[0]=hour/10;
    tab_time[1]=hour%10;
    tab_time[3]=minu/10;
    tab_time[4]=minu%10;
    tab_time[6]=sec/10;
    tab_time[7]=sec%10;
}

//*********lcd显示函数开始******
void lcd_dis()
{
    uchar m;
    write_com(0x80+1);          //设置光标位置
    for(m=0;m<5;m++)            //显示"Time "
    {
        write_data(tab_chartime[m]);
        delay(2);
    }
    write_char();              //显示时间
    write_com(0x80+0x40);      //设置光标位置为第二行
    for(m=0;m<15;m++)          //显示"www.wch16621.cn"
    {
        write_data(tab_index[m]);
        delay(2);
    }
}
   
//*********LCD初始化函数开始****
    void lcd_init()
    {
        dula=0;
        wela=0;      // 关闭数码管显示
        lcden=0;
        write_com(0x38);      //设置显示模式:16X2,5X7,8位数据接口
        write_com(0x0c);      //开显示,显示光标,光标闪烁
        write_com(0x06);      //读写一个字符后,地址指针及光标加一,且光标加一整屏显示不移动
        write_com(0x80);      //设置光标指针
    }

//*********写字符串函数开始*****
void write_char()
{
    uchar n,a;
    for(n=0;n<8;n++)
    {
        a=tab_time[n];              //分别取时分秒十个位数字
        write_data(tab_char[a]);    //显示对应数字符号
    }
}

//*********写命令函数开始*******
void write_com(uchar com)
{
    lcdrs=0;      //低电平写命令
    P0=com;       //写入命令
    delay(3);     //延时约3ms
    lcden=1;      //LCD使能端置高电平
    delay(5);     //延时约5ms
    lcden=0;      //LCD使能端拉低电平
}

//*********写数据函数开始*******
void write_data(uchar dat)
{
    lcdrs=1;      //低电平写数据
    P0=dat;       //写入命令
    delay(3);     //延时约3ms
    lcden=1;      //LCD使能端置高电平
    delay(5);     //延时约5ms
    lcden=0;      //LCD使能端拉低电平
}

//*********延时函数开始*********
void delay(uint k)
{
    uint i,j;
    for(i=k;i>0;i--)
       for(j=110;j>0;j--);
}

相关帖子

沙发
ningling_21| | 2009-10-6 22:40 | 只看该作者
怎么了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

30

帖子

1

粉丝