矩阵键盘可调时钟

#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();
}


16*32点阵数字钟及汉字显示 附:点阵时间显示源程序 //===================================================================================// //*标题:16*32点阵数字钟显示程序 //*说明:时钟信号产生采用DS1302,列采用74HC595驱动(共4个),行驱动采用4-16线译码器74LS154 //*功能:通过动态扫描显示时钟,可显示时,分,秒,日期中的月和日 //*作者:HEY //*日期:2006-05-29 //*邮箱:billy3416@163.com //*备注:此是我刚接触单片机时的一个小制作 程序和电路设计上难免有不足之处 请谅解 //===================================================================================// #include #include #define uchar unsigned char //===================================================================================// //用到的引脚及端口定义 //===================================================================================// sbit SERIALIN_0=P2^0; //定义P2.0为列向第1个74HC595的DATA输入 sbit SERIALIN_1=P2^1; //定义P2.1为列向第2个74HC595的DATA输入 sbit SERIALIN_2=P2^2; //定义P2.2为列向第2个74HC595的DATA输入 sbit SERIALIN_3=P2^3; //定义P2.3为列向第2个74HC595的DATA输入 sbit CLOCK_DATA=P1^0; //定义P1.0为DS1302的DATA端口 sbit CLOCK_RST=P1^1; //定义P1.1为DS1302的复位输出端口 sbit CLOCK_SCLK=P1^2; //定义P1.2为DS1302的时钟信号状态控制 sbit K0=P1^3; //K0为按键1,用来选择要调整时间的选项(时和分) sbit K1=P1^4; //K1为按键2,执行加1 sbit CLOCK=P2^4; //74HC595的移位时钟控制 sbit LATCH=P2^5; //74HC595的锁存输出时钟控制 void control(); //调整时间控制函数 void time(); uchar CLOCK_TIME[3]={0,0,0}; //定义时钟时间数据存储区,分别为(时,分,秒) uchar BUFFER[8]={0,0,0,0,0,0,0,0}; //显示缓冲区 uchar YEAR[3]={0,0,0}; //定义时钟年月日数据存储区 uchar temp[4]={0,0,0,0}; //定义74HC595的移位缓冲区 uchar FLASH_STOP; //显示小时和分钟之间的两点控制位 uchar sec_flash; //用单片机定时器模拟的一秒(用来控制小时和分中之间的两点) //==============================================
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值