矩阵键盘可调时钟

#include <reg52.h>
#include "./delay/delay.h"
#define SEGPORT P0
#define KEYPORT P1
unsigned char num[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char bitdata[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char segdata[8] = {0x3f,0x3f,0x40,0x3f,0x3f,0x40,0x3f,0x3f};
unsigned char s = 0;
unsigned char min = 0;
unsigned char h = 0;

sbit bit_select = P2^0;
sbit seg_select = P2^1;
sbit beep =P3^7;

void timer0_init(void) 
{
	EA = 1;
	TMOD |= 0x01;
  TH0 = (65536 - 1000) / 256;
  TL0 = (65536 - 1000) % 256;
  ET0 = 1;
  TR0 = 0;	//计时控制
	}

void timer1_init(void)
{
	EA = 1;
	TMOD |= 0x10;
	TH1 = (65536 - 1000) / 256;
	TL1 = (65536 - 1000) % 256;
	ET1 = 1;
	TR1 = 1;
}

unsigned char key_scan(void)  //键盘扫描
{
	unsigned char keyvalue;
	KEYPORT = 0xf0;
	if(0xf0 != KEYPORT)
	{
		delay_ms(10);
		if(0xf0 != KEYPORT)
		{
			KEYPORT = 0xfe;
			if(0xfe != KEYPORT)
			{
				keyvalue = KEYPORT;
				keyvalue &= 0xf0;
				keyvalue += 0x0e;
				while(0xfe != KEYPORT);
				delay_ms(10);
				while(0xfe != KEYPORT);
				return keyvalue;
			}
		  KEYPORT = 0xfd;
			if(0xfd != KEYPORT)
			{
				keyvalue = KEYPORT;
				keyvalue &= 0xf0;
				keyvalue += 0x0d;
				while(0xfd != KEYPORT);
				delay_ms(10);
				while(0xfd != KEYPORT);
				return keyvalue;
			}
			KEYPORT = 0xfb;
			if(0xfb != KEYPORT)
			{
				keyvalue = KEYPORT;
				keyvalue &= 0xf0;
				keyvalue += 0x0b;
				while(0xfb != KEYPORT);
				delay_ms(10);
				while(0xfb != KEYPORT);
				return keyvalue;
			}
			KEYPORT = 0xf7;
				if(0xf7 != KEYPORT)
			{
				keyvalue = KEYPORT;
				keyvalue &= 0xf0;
				keyvalue += 0x07;
				while(0xf7 != KEYPORT);
				delay_ms(10);
				while(0xf7 != KEYPORT);
				return keyvalue;
			}
		}
	}
	return 0xff;
}

void main()
{
   unsigned char key;
	 delay_s(0);
	timer0_init();
	timer1_init();
	while(1)
	{
		key = key_scan();
		if(0xff != key)
		{
			if(0x7e == key)  //时钟停止运行
			{
				TR0 = ~TR0;
			}
			if(0xbe == key) //调小时高位 
			{
				if(h <= 13)
				{
						h += 10;
						segdata[0] = num[h / 10];
						
				}
				else
				{
					h = 0;
					segdata[0] = num[h / 10];
				}
				
						
      }
			if(0xde == key) //调小时低位
			{
				if(h <= 23)
				{
						h += 1;
						segdata[1] = num[h %10];
						
				}
				else
				{
					h = 0;
					segdata[1] = num[h % 10];
				}
			}
			if(0xbd == key) //调分钟高位
			{
					if(min <= 49)
				{
						min += 10;
						segdata[3] = num[min /10];
						
				}
				else
				{
					min = 0;
					segdata[3] = num[min / 10];
				}
			}
			if(0xdd == key) //调分钟低位
			{
					if(min <= 59)
				{
						min += 1;
						segdata[4] = num[min %10];
						
				}
				else
				{
					min = 0;
					segdata[4] = num[min % 10];
				}
			}
			if(0xbb == key) //调秒位高位
			{
					if(s <= 49)
				{
						s += 10;
						segdata[6] = num[s /10];
						
				}
				else
				{
					s = 0;
					segdata[6] = num[s / 10];
				}
			}
			if(0xdb == key) //调秒位低位
			{
					if(s <= 59)
				{
						s += 1;
						segdata[7] = num[s %10];
						
				}
				else
				{
					s = 0;
					segdata[7] = num[s % 10];
				}
			}		
		}
	}
}

void display() //显示时钟
{
	static unsigned char i = 0;
	
	SEGPORT = 0x0;
	seg_select = 1;
	seg_select = 0;
	
	SEGPORT = 0xff;
	bit_select = 1;
	bit_select = 0;
	SEGPORT = segdata[i];
	seg_select = 1;
	seg_select = 0;
	
	SEGPORT = bitdata[i];
	bit_select = 1;
	bit_select = 0;
	
	i++;
	
	if(8 == i)
	{
		i = 0;
	}
}
	
void timer0_isr(void) interrupt 1
{
	
  static unsigned char i = 0;
	
	TH0 = (65536 - 20000) / 256;
	TL0 = (65536 - 20000) % 256;
	
	i++;
	if(50 == i)
	{
		i = 0;
		s++;
		if(60 == s)
		{
			s = 0;
			min++;
			if(60 == min)
			{
				min = 0;
				h++;
				if(24 == h)
				{ 
					h = 0;
				}
			}
		}
	}
	segdata[0] = num[h / 10];
	segdata[1] = num[h % 10];
	segdata[2] = 0x40;
	segdata[3] = num[min / 10];	
	segdata[4] = num[min % 10];
	segdata[5] = 0x40;
	segdata[6] = num[s / 10];
	segdata[7] = num[s % 10];
}

void timer1_isr(void) interrupt 3
{
	TH1 =(65536 - 1000) / 256;
	TL1 =(65536 - 1000) % 256;
	display();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值