ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

实现时钟按键显示

2021-09-30 11:59:02  阅读:128  来源: 互联网

标签:case 10 P1 实现 break DelayXms KeyValue 按键 时钟


#include<AT89X51.h>

char display[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0XF7,0X7C,0X39,0X5E,0X79,0X71};
//char cache[6]={2,2,5,9,5,8};			//时钟的 十	分	秒
char hour=20,minute=20,second=20;
char year=21,month=12,day=20;

void DelayXms(unsigned int xms)			//延时函数
{
    unsigned int i,j;
    
    for(i=xms; i>0; i--)
    {
        for(j=240; j>0; j--)
        { }
    }
}


void DisplayCode(char value)
{
    P0=display[value];
}

void screen1(void)
{
    int x;
    P2=0xfe;
    DisplayCode(hour/10);
    DelayXms(1);
    P2=0xfd;
    x=display[hour%10];
    x|=0x80;
    P0=x;   
    DelayXms(1);

    P2=0xfb;
    DisplayCode(minute/10);
    DelayXms(1);
    P2=0xf7;
    x=display[minute%10];
    x|=0x80;
    P0=x;
    DelayXms(1);

    P2=0xef;
    DisplayCode(second/10);
    DelayXms(1);
    P2=0xdf;
    x=display[second%10];
	P0=x;
    DelayXms(1);

}
void screen2()
{
	int x;
    P2=0xfe;
    DisplayCode(year/10);
    DelayXms(1);
    P2=0xfd;
    x=display[year%10];
    x|=0x80;
    P0=x;
    DelayXms(1);
    P2=0xfb;
    DisplayCode(month/10);
    DelayXms(1);
    P2=0xf7;
    x=display[month%10];
    x|=0x80;
    P0=x;
    DelayXms(1);
    P2=0xef;
    DisplayCode(day/10);
    DelayXms(1);
    P2=0xdf;
    x=display[day%10];
    P0=x;
    DelayXms(1);
}
unsigned char KeyScan(void)
{
	char KeyValue;
	
	P1 = 0x0f;			//P1 == 00001111
	if(P1!=0x0f)		//P1 != 00001111
	{
		switch(P1)
		{
			case 0x0e:	//00001110	P1.0=0
						P1 = 0xf0;
						switch(P1)
						{
							case 0x70:	//01110000	P1.7=0
										KeyValue = 12;break;
							case 0xb0:	//10110000	P1.6=0
										KeyValue = 8;break;
							case 0xd0:	//11010000	P1.5=0
										KeyValue = 4;break;
							case 0xe0:	//11100000	P1.4=0
										KeyValue = 0;break;
						}
						break;
			case 0x0d:	//00001101	P1.1=0
						P1 = 0xf0;
						switch(P1)
						{
							case 0x70:	//01110000	P1.7=0
										KeyValue = 13;break;
							case 0xb0:	//10110000	P1.6=0
										KeyValue = 9;break;
							case 0xd0:	//11010000	P1.5=0
										KeyValue = 5;break;
							case 0xe0:	//11100000	P1.4=0
										KeyValue = 1;break;
						}
						break;
			case 0x0b:	//00001011	P1.2=0
						P1 = 0xf0;
						switch(P1)
						{
							case 0x70:	//01110000	P1.7=0
										KeyValue = 14;break;
							case 0xb0:	//10110000	P1.6=0
										KeyValue = 10;break;
							case 0xd0:	//11010000	P1.5=0
										KeyValue = 6;break;
							case 0xe0:	//11100000	P1.4=0
										KeyValue = 2;break;
						}
						break;
			case 0x07:	//00000111	P1.3=0
						P1 = 0xf0;
						switch(P1)
						{
							case 0x70:	//01110000	P1.7=0
										KeyValue = 15;break;
							case 0xb0:	//10110000	P1.6=0
										KeyValue = 11;break;
							case 0xd0:	//11010000	P1.5=0
										KeyValue = 7;break;
							case 0xe0:	//11100000	P1.4=0
										KeyValue = 3;break;
						}
						break;
		}
	}
	return KeyValue;
}

			 
char rn(int y)
{
    if( (y%400==0) || ( (y%4==0)&&(y%100!=0) ) )
        return 29;
    else
        return 28;
}

char judge(int year, char mon)
{
    switch(mon)
    {
        case 4:
        case 6:
        case 9:
        case 11:
                return 30;
        case 2:
                return rn(year);
        default:
                return 31;
    }
}

char i=1;
void timer0(void) interrupt 1
{
    if(++i == 20)
    {
        i = 0;
        if(++second == 60)
        {
            second=0;
            if(++minute == 60)
            {
                minute=0;
                if(++hour==24)
                {
                    hour=0;
                    if( ++day == (judge(2000+year,month)+1) )
                    {
                        day = 1;
                        if(++month==13)
                        {
                            month=1;
                            year++;
                        }
                    }   
                }
            }
        }
    }
}

void main()
{
	char key=0x55;
    TMOD = 0x01;//00000001,T0 mode 1,16bit
    TH0 = -50000/256;
    TL0 = -50000%256;
    ET0 = 1;			 //T0中断允许标志位
    EA = 1;				 //中断允许总标志位
    TR0 = 1;		   	 //T0启动允许标志位
    
    while(1)
    {
		key=KeyScan();
		if(key==1)
		screen1();
		else if(key==2)
		screen2();
    }            
}

标签:case,10,P1,实现,break,DelayXms,KeyValue,按键,时钟
来源: https://blog.csdn.net/qq_57918758/article/details/120563520

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有