51单片机C语言可调时钟
程序介绍:六位共阳数码管显示,时·分·秒均可用按键调节。短按时选位的时间按一次加一下,长按不放时时间按一定的频率增加!
本程序的是我参考别人的基础上移植、再加上自己的想法做出来的,程序的亮点就是完全用单片机定时中断写的,避免了用延时写程序时,调节时间时其它未选择的位的的闪烁,使用中断使CPU得到释放,另外还可以具有长安连续增加的功能!
程序的不足之处:不能实现这样的功能,既::系统有四个按键,功能分别是 调整,加,减,确定。在按下调整键时候,显示时的两位数码管以1 Hz 频率闪烁。如果再次按下调整键,则分开始闪烁,时恢复正常显示,依次循环,直到按下确定键,恢复正常的显示。在数码管闪烁的时候,按下加或者减键可以调整相应的显示内容;
如果有哪位高数路过看到,请不吝赐教782547273@
过客与10月12日
#include
#define uint unsigned int
#define uchar unsigned char
bit dao1S=0; //到1秒标志位
bit dao2MS=0;// 到2毫秒标志位
bit dao10MS;// 到10毫秒标志位
sbit dula=P2^6;// 定义段选
sbit wela=P2^7;//定义位选
#define LED P0 //定义数据口
sbit key1=P3^4; //定义按键
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
#define KEY_1 0x0e //定义各按键键值
#define KEY_2 0x0d
#define KEY_3 0x0b
#define KEY_4 0x07
#define KEY_NULL 0x0f
#define KEY_PRESS 0x80 //定义各按键状态
#define KEY_LONG 0x40
#define KEY_STATE_INIT 0 //定义按键状态
#define KEY_STATE_PRESS 1
#define KEY_STATE_LONG 2
#define KEY_STATE_UP 3
#define KEY_LONG_PERIOD 50 //定义长按键的TICK数,以及连发间隔的TICK数
#define KEY_CONTINUE_PERIOD 25
uchar tab[]={0,0,0,0,0,0};//时间缓冲区
uchar weitable[]={0x01,0x02,0x04,0x08,0x10,0x20};//显示位
uchar tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极数码管编码0-9
void nint() //中断初始化
{ TMOD=0X01;
TH0=0XF8;
TL0=0XCC;
TR0=1;
ET0=1;
}
uchar KeyScan() //按键扫描函数
{
if(key1==0) return KEY_1;
if(key2==0) return KEY_2;
if(key3==0) return KEY_3;
if(key4==0) return KEY_4;
return KEY_NULL;
}
uchar GetKey()
{
uchar keyRetu=0,keyTemp=KEY_NULL; //返回的按键值,按键情况
static uchar s_keyState=KEY_STATE_INIT,keyTime=0,keyLast=KEY_NULL; //按键状态,按键按下的时间计数器,上次按键值
keyTemp=KeyScan();
switch (s_keyState)
{
case KEY_STATE_INIT:
if(keyTemp!=KEY_NULL) //检测到有按键,转到状态1,相当于是消抖过程
{
s_keyState=KEY_STATE_PRESS;
}
break;
case KEY_STATE_PRESS:
if(keyTemp!=KEY_NULL) //再次检测到有按键,转到状态2
{
s_keyState=KEY_STATE_LONG;
keyTime=0; //清零按键时间计数器
keyLast=keyTemp; //保存键值,以便在释放按键状态返回键值