我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 869|回复: 2

电子时钟

[复制链接]

该用户从未签到

10

主题

49

回帖

372

积分

二级逆天

积分
372

终身成就奖特殊贡献奖

QQ
发表于 2016-8-19 07:45:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
/*****************能用按键实现时分秒的调节,与手表功能相差不大,本人已测试过*********************/
#include<reg51.h>   
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_DATAPINS P0
/****************位定义声明*****************/
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
uchar count,K1num;
char miao=55,shi=23,fen=59;
uchar code table[17]=" 2016-8-11 Thur  ";
uchar code table1[16]="    23:59:55    ";
/****************函数声明*****************/
void write_sfm(uchar address,uchar data1);
void write_com(uchar com);
void write_date(uchar date);
void init();
void keyscan();
void delay(uint m);
/****************主函数*****************/
void main()
{
    init();
    while(1)
    {
        keyscan();        
     }
}
/****************初始化函数*****************/
void init()
{
    uchar i;
    LCD1602_E=0;
    write_com(0x38);  //开显示
    write_com(0x0c);  //开显示不显示光标
    write_com(0x06);  //写一个指针加1
    write_com(0x01);  //清屏
    write_com(0x80);  //设置数据指针起点
    for(i=0;i<17;i++)
    {   
        write_date(table);
        delay(1);
    }
    write_com(0x80+0x40);
    for(i=0;i<16;i++)
    {
        write_date(table1);
        delay(1);
    }
    TMOD=0x01;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    EA=1;
    ET0=1;
    TR0=1;
}
/****************按键扫描函数*****************/
void keyscan()
{
    if(K1==0)
    {
        delay(5);
        if(K1==0)
        {
            delay(5);
            if(K1==0)
            {
                K1num++;
                while(!K1);
                if(K1num==1)
                {
                    TR0=0;
                    write_com(0x80+0x40+11);//光标在秒位闪烁
                    write_com(0x0f);
                }        
            }
            if(K1num==2)
            {
                write_com(0x80+0x40+8);//光标在分位闪烁
            }
            if(K1num==3)
            {
                write_com(0x80+0x40+5);    //光标在时位闪烁
            }
            if(K1num==4)
            {
                K1num=0;
                write_com(0x0c);//光标不闪烁
                TR0=1;
            }
        }               
    }
            if(K1num!=0)
            {
                if(K2==0)
                {
                    delay(5);
                    if(K2==0)
                    {
                        while(!K2);
                        if(K1num==1)
                        {                           
                            miao++;
                            if(miao==60)
                            miao=0;
                            write_sfm(10,miao);
                            write_com(0x80+0x40+10);                                                                                                
                        }
                        if(K1num==2)
                        {
                            fen++;
                            if(fen==60)
                            fen=0;
                            write_sfm(7,fen);
                            write_com(0x80+0x40+7);                                
                        }
                        if(K1num==3)
                        {
                            shi++;
                            if(shi==24)
                            shi=0;
                            write_sfm(4,shi);
                            write_com(0x80+0x40+4);   
                        }
                    }
                }
                if(K3==0)
                {
                    delay(5);
                    if(K3==0)
                    {
                        while(!K3);
                        if(K1num==1)
                        {
                            miao--;
                            if(miao==-1)
                            miao=59;
                            write_sfm(10,miao);
                            write_com(0x80+0x40+10);                           
                        }                        
                    }
                    if(K1num==2)
                    {
                        fen--;
                        if(fen==-1)
                        fen=59;
                        write_sfm(7,fen);
                        write_com(0x80+0x40+7);
                        
                    }
                    if(K1num==3)
                    {
                        shi--;
                        if(shi==-1)
                        shi=23;
                        write_sfm(4,shi);
                        write_com(0x80+0x40+4);
                        
                    }      
                }
    }                              
}        
/****************写入时分秒的十位和个位*****************/
void write_sfm(uchar address,uchar data1)
{
      uchar shi,ge;
      shi=data1/10;
      ge=data1%10;
      write_com(0x80+0x40+address);
      write_date(0x30+shi);
      write_date(0x30+ge);
}
/****************1ms延时函数*****************/
void delay(uint m)
{
    uint x,y;
    for(x=m;x>0;x--)
        for(y=110;y>0;y--);
}
/*****************写入命令*******************/
void write_com(uchar com)
{
    LCD1602_E=0;     //使能清零
    LCD1602_RS=0;     //选择发送命令
    LCD1602_RW=0;     //选择写入
    LCD1602_DATAPINS=com; //放入命令
    delay(1);      //等待数据稳定
    LCD1602_E=1;  //写入时序
    delay(1);      //保持时间
    LCD1602_E=0;
}
/*****************写入数据*******************/
void write_date(uchar date)
{
    LCD1602_E=0;      //使能清零
    LCD1602_RS=1;       //选择输入数据
    LCD1602_RW=0;      //选择写入
    LCD1602_DATAPINS=date; //写入数据
    delay(1);         //等待数据稳定
    LCD1602_E=1;     //写入时序
    delay(1);         //保持时间
    LCD1602_E=0;
}
/*****************定时器0中断*******************/
void timer0() interrupt 1
{
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    count++;
    if(count==18)
        {
            count=0;
            miao++;
            if(miao==60)
            {   
                miao=0;
                fen++;
                if(fen==60)
                {   
                    fen=0;
                    shi++;
                    if(shi==24)
                    {   
                         shi=0;   
                    }
                    write_sfm(4,shi);
                }
                write_sfm(7,fen);
            }
            write_sfm(10,miao);
        }
}
回复

使用道具 举报

该用户从未签到

1

主题

64

回帖

0

积分

二级逆天

积分
0

终身成就奖

QQ
发表于 2016-8-22 23:09:46 | 显示全部楼层
51单片机的程序,哈哈,一点一点写,觉得以前自己也是这样,好慢但理解很透
回复

使用道具 举报

该用户从未签到

10

主题

49

回帖

372

积分

二级逆天

积分
372

终身成就奖特殊贡献奖

QQ
 楼主| 发表于 2016-8-23 18:42:12 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

每日签到,有金币领取。


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

平平安安
TOP
快速回复 返回顶部 返回列表