找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1967|回复: 4
收起左侧

额,经过大佬指点,单片机数码管显示时钟调试正常。但是显示太麻烦

[复制链接]
ID:138080 发表于 2020-8-10 16:39 | 显示全部楼层 |阅读模式
额,经过大佬指点,数码管显示时钟调试正常。但是显示太麻烦,用1602显示来做。可是proteus仿真又出现了分钟显示和天显示不动。没找到原因;还有年用四位数表示时超内存了。数据类型该怎么选才合适;

单片机源程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

/*******1602指令端口选择******************/
sbit lcdRS = P2^0;
sbit lcden = P2^1;

/*********按键端口定义************************/
sbit key0 = P1^0;
sbit key1 = P1^1;
sbit key2 = P1^2;

uchar table[] = "KEY" ;
uchar timenum[8] = {0,0,0,0,0,0,0,0};
uchar timenum1[8]= {0,0,0,0,0,0,0,0};

/*************常数声明*****************/
int num=0;
uchar n,keynum;
char miao=12,fen=12,shi=12,year = 20,year1=20,mouth=8,day=5;

/*********延迟函数***********/
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
         for(y=120;y>0;y--);
}

/*********1602指令写入步骤***********/
void write_com(uchar com)
{
        lcdRS = 0;
        P0 = com;
        delay(5);
        lcden = 1;
        delay(5);
        lcden = 0;
}

/*********1602数据写入方法***********/
void write_data(uchar date)
{
        lcdRS = 1;
        P0 = date;
        delay(5);
        lcden = 1;
        delay(5);
        lcden = 0;
}

/*********1602关键字写入***********/
void init()
{
        lcden = 0;
        write_com(0x38); //显示模式
        write_com(0x0c); //开显示,不显示光标,光标不闪烁
        write_com(0x06);  //指针加一
        write_com(0x01);   //清显示
}

/*********1602数据写入***********/
void display()
{


        write_com(0x80);
        for(num = 0;num<3;num++)
        {
                write_data(table[num]);
                delay(5);
        }

        write_com(0x80+0x06);          //年月日显示入口地址
        for(num = 9;num>=0;num--)
        {        
                if(num==2||num==5)
                write_data(0x3a);
                else
                write_data(0X30+timenum1[num]);
                delay(5);
        }

        write_com(0x80+0x41);           //按键次数显示;
        write_data(0X30+keynum);
        delay(5);
               
        write_com(0x80+0x48);           //时分秒显示入口地址
        for(num = 7;num>=0;num--)
        {        
                if(num==2||num==5)
                write_data(0x3a);
                else
                write_data(0X30+timenum[num]);
                delay(5);
        }               
}

/************时间调整按键******************/
void key()
{
        if(key0==0)
        {
                delay(5);
                if(key0==0)
                {
                        keynum++;
                        while(!key0);
                }
                if(keynum>=6)
                keynum=0;
        }               
        if(key1==0)
        {
                delay(5);
                if(key1==0)
                {
                        switch(keynum)
                        {
                                case 1:        fen++;if(fen>=60){fen=0;}while(!key1);break;
                                case 2: shi++;if(shi>=24){shi=0;}while(!key1);break;
                                case 3:        day++;
                                        if(day==32||day==31||day==30||day==29)
                                        {
                                                switch(day)
                                                {
                                                case 32:
                                                                if(mouth==1||mouth==3||mouth==7||mouth==8||mouth==10||mouth==12){day=1;while(!key1);}break;
                                                case 31:                                                
                                                                if(mouth==4||mouth==5||mouth==6||mouth==9||mouth==11)   {        day=1;while(!key1);        }break;
                                                case 30:
                                                                if(mouth==2){        if(year/4==0&&year/100!=0||year/400==0){day=1;while(!key1);}}break;
                                                case 29:
                                                                if(mouth==2){day=1;while(!key1);}break;                        
                                                }
                                                        
                                        }  while(!key1);break;                                                                        
                                case 4: mouth++;if(mouth>=13){mouth=1;}while(!key1);break;
                                case 5: year++;if(year>=9999){year=0;}while(!key1);break;               
                        }
                }
        }               
         if(key2==0)
        {
                delay(5);
                if(key2==0)
                {
                        switch(keynum)
                        {
                                case 1:if(fen<=0){fen=60;}fen--;while(!key2);break;
                                case 2:if(shi<=0){shi=24;}shi--;while(!key2);break;
                                case 4:if(mouth<=1){mouth=13;}mouth--;while(!key2);break;
                                case 5:if(year<=0){year=9999;}year--;while(!key2);break;               
                        }
                }
        }               

}

/***********开中断定时************/
void zhongduan()
{
        TMOD = 0X01;
        TH0 = 0Xe0;
        TL0 = 0Xb1;
        TR0 = 1;
//        TF0=0;
        EA = 1;
        ET0 = 1;
        
}

void main()
{
        
        zhongduan();
        init();
        while(1)
        {
        /*************时分秒换算****************************/
        timenum[0]=miao%10;
        timenum[1]=miao/10;
        timenum[3]=fen%10;
        timenum[4]=fen/10;
        timenum[6]=shi%10;
        timenum[7]=shi/10;

/*************年月日换算****************************/
        timenum1[0]=day%10;
        timenum1[1]=day/10;
        timenum1[3]=mouth%10;
        timenum1[4]=mouth/10;
        timenum1[6]=year%10;
        timenum1[7]=year/10;
        timenum1[8]=year1%10;
        timenum1[9]=year1/10;
        display();
        key();
               
        }
}
void timer() interrupt 1
{
        TH0 = 0Xe0;
        TL0 = 0Xb1;
        n++;
        if(n>=50)
        {
                miao++;
                n=0;
                if(miao>=60)
                {
                        miao=0;
                        fen++;
                        if(fen>=60)
                        {
                                fen=0;
                                shi++;
                                if(shi>=24)
                                {
                                        shi=0;
                                        day++;
                                        if(day==32||day==31||day==30||day==29)
                                        {
                                                switch(day)
                                                {
                                                case 32:
                                                                if(mouth==1||mouth==3||mouth==7||mouth==8||mouth==10||mouth==12){        day=1;mouth++;        }break;
                                                case 31:                                                
                                                                if(mouth==4||mouth==5||mouth==6||mouth==9||mouth==11)   {        day=1;mouth++;        }break;
                                                case 30:
                                                                if(mouth==2){if(year/4==0&&year/100!=0||year/400==0){day=1;mouth++;}}break;
                                                case 29:
                                                                if(mouth==2){day=1;mouth++;}break;                        
                                                }
                                       
                                                if(mouth==13)
                                                {        
                                                        mouth=1;year++;
                                                        if(year==100)
                                                        {
                                                                year=0;year1++;
                                                        }
                                                }         
                                        }        
                                }
                        }
                 }
        
        }
}

1602.png

1602万年历分天不走.rar

44.6 KB, 下载次数: 2

回复

使用道具 举报

ID:282850 发表于 2020-8-10 17:18 | 显示全部楼层
/*************时分秒换算****************************/
        timenum[0]=miao%10;
        timenum[1]=miao/10;
        timenum[3]=fen%10;
        timenum[4]=fen/10;
        timenum[6]=shi%10;
        timenum[7]=shi/10;

/*************年月日换算****************************/
        timenum1[0]=day%10;
        timenum1[1]=day/10;
        timenum1[3]=mouth%10;
        timenum1[4]=mouth/10;
        timenum1[6]=year%10;
        timenum1[7]=year/10;
        timenum1[8]=year1%10;
        timenum1[9]=year1/10;
这两段还是用for要节约好多字节的,估计你不是超RAM,是超flash
回复

使用道具 举报

ID:584814 发表于 2020-8-10 22:52 | 显示全部楼层
的确不懂为什么要uchar timenum[8]和uchar timenum1[8]
坛子里的1602时钟程例很多可以下几个参考。
回复

使用道具 举报

ID:138080 发表于 2020-8-11 18:11 | 显示全部楼层
man1234567 发表于 2020-8-10 22:52
的确不懂为什么要uchar timenum[8]和uchar timenum1[8]
坛子里的1602时钟程例很多可以下几个参考。

。。。。。。代码写的少,还不会活用。尴尬
回复

使用道具 举报

ID:138080 发表于 2020-8-11 18:15 | 显示全部楼层
f556 发表于 2020-8-10 17:18
/*************时分秒换算****************************/
        timenum[0]=miao%10;
        timenum[ ...

把定义的四位数的年分开成两个十位数的后就行了。。。。。主要是显示问题。难受
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表