#include "reg52.h"
#include "matrix_key.h"
#define keynumber P1
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
extern unsigned char key_backvalue;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit led1=P2^0;
sbit led7=P2^6;
sbit out_break=P3^3;
unsigned char sec=45,min=59,hour=23;
unsigned char qq,ww;
char num=0;
u8 DisplayData[8];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
bit set=0,set_hour=0,set_min=0,hour_unit=0,min_unit=0,limit=0,min_flag1=0,min_flag2=0,hour_flag1=0,hour_flag2=0;
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
extern void delay(u16 i)
{
while(i--);
}
void backspace() //退格
{
if(min_flag1&&min_flag2)
{
min_unit=1;set_min=0;min_flag2=0;
}
if(min_flag1&&min_flag2==0)
{
min_unit=0;set_min=1;
}
//
if(hour_flag1&&hour_flag2)
{
hour_unit=1;set_hour=0;hour_flag2=0;
}
if(hour_flag1&&hour_flag2==0)
{
hour_unit=0;set_hour=1;
}
}
void Timer0Init()
{
TMOD|=0X11;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH1=0XFC; //给定时器赋初值,定时1ms
TL1=0X18;
ET1=1;//打开定时器1中断允许
EA=1;//打开总中断
TR1=1;//打开定时器
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
void datapros()
{
DisplayData[0] = smgduan[hour/10]; //时
DisplayData[1] = smgduan[hour%10];
DisplayData[2] = 0x40;
DisplayData[3] = smgduan[min/10]; //分
DisplayData[4] = smgduan[min%10];
DisplayData[5] = 0x40;
DisplayData[6] = smgduan[sec/10]; //秒
DisplayData[7] = smgduan[sec%10];
}
void main()
{
Timer0Init();
PT0=1;
PX1=0;
while(1)
{
scan();
if(key_backvalue==31)
{
qq=hour;
ww=min;
set=1;
TR1=0;
}
if(set) //设置
{
scan();
switch(key_backvalue)
{
case(11):led1=0;key_backvalue=0x00; set_hour=1;min_unit=0;break;
case(14):led1=0;key_backvalue=0x00; set_min=1;hour_unit=0; break;
case(23):TR1=1;led1=1;min_flag1=0;min_flag2=0;hour_unit=0;min_unit=0;set_hour=0;set_min=0;break;
case(17): hour=qq;min=ww;TR1=1;led1=1;min_flag1=1;min_flag2=0;hour_unit=0;min_unit=0;set_hour=0;set_min=0;break;
}
if(set_hour) //设置时
{
scan();
switch(key_backvalue)
{
case(1): key_backvalue=0x00;hour=(10+hour%10);hour_unit=1;set_hour=0;limit=1;hour_flag1=1;break;
case(2): key_backvalue=0x00;hour=(20+hour%10);hour_unit=1;set_hour=0;hour_flag1=1;break;
case(22):key_backvalue=0x00;hour=hour%10; hour_unit=1;set_hour=0;limit=1;hour_flag1=1;break;
}
}
if(hour_unit&&(limit==0))
{
scan();
switch(key_backvalue)
{
case(22):key_backvalue=0x00; hour=hour/10*10;hour_flag2=1;break;
case(1):key_backvalue=0x00; hour=(hour/10*10+1);hour_flag2=1;break;
case(2):key_backvalue=0x00; hour=(hour/10*10+2);hour_flag2=1;break;
case(3):key_backvalue=0x00; hour=(hour/10*10+3);hour_flag2=1;break;
case(4):key_backvalue=0x00; hour=(hour/10*10+4);hour_flag2=1;break;
}
scan();
if(key_backvalue==21)
{
backspace();
}
}
if(hour_unit&&limit)
{
scan();
switch(key_backvalue)
{
case(22):key_backvalue=0x00; hour=hour/10*10;hour_unit=0;limit=0;hour_flag2=1;break;
case(1):key_backvalue=0x00; hour=(hour/10*10+1);limit=0;hour_flag2=1;break;
case(2):key_backvalue=0x00; hour=(hour/10*10+2);limit=0;hour_flag2=1;break;
case(3):key_backvalue=0x00; hour=(hour/10*10+3);limit=0;hour_flag2=1;break;
case(4):key_backvalue=0x00; hour=(hour/10*10+4);limit=0;hour_flag2=1;break;
case(5):key_backvalue=0x00; hour=(hour/10*10+5);limit=0;hour_flag2=1;break;
case(6):key_backvalue=0x00; hour=(hour/10*10+6);limit=0;hour_flag2=1;break;
case(7):key_backvalue=0x00; hour=(hour/10*10+7);limit=0;hour_flag2=1;break;
case(8):key_backvalue=0x00; hour=(hour/10*10+8);limit=0;hour_flag2=1;break;
case(9):key_backvalue=0x00; hour=(hour/10*10+9);limit=0;hour_flag2=1;break;
}
scan();
if(key_backvalue==21)
{
backspace();
}
}
if(set_min==1) //设置分
{
scan();
switch(key_backvalue)
{
case(22):key_backvalue=0x00;min=min%10;min_unit=1;set_min=0;break;
case(1):key_backvalue=0x00; min=(min%10+10);min_unit=1;set_min=0;min_flag1=1;break;
case(2):key_backvalue=0x00; min=(min%10+20);min_unit=1;set_min=0;min_flag1=1;break;
case(3):key_backvalue=0x00; min=(min%10+30);min_unit=1;set_min=0;min_flag1=1;break;
case(4):key_backvalue=0x00; min=(min%10+40);min_unit=1;set_min=0;min_flag1=1;break;
case(5):key_backvalue=0x00; min=(min%10+50);min_unit=1;set_min=0;min_flag1=1;break;
}
scan();
if(key_backvalue==21)
{
backspace();
}
}
if(min_unit)
{
scan();
switch(key_backvalue)
{
case(22):key_backvalue=0x00; min=min/10*10;min_flag2=1;break;
case(1):key_backvalue=0x00; min=(min/10*10+1);min_flag2=1;break;
case(2):key_backvalue=0x00; min=(min/10*10+2);min_flag2=1;break;
case(3):key_backvalue=0x00; min=(min/10*10+3);min_flag2=1;break;
case(4):key_backvalue=0x00; min=(min/10*10+4);min_flag2=1;break;
case(5):key_backvalue=0x00; min=(min/10*10+5);min_flag2=1;break;
case(6):key_backvalue=0x00; min=(min/10*10+6);min_flag2=1;break;
case(7):key_backvalue=0x00; min=(min/10*10+7);min_flag2=1;break;
case(8):key_backvalue=0x00; min=(min/10*10+8);min_flag2=1;break;
case(9):key_backvalue=0x00; min=(min/10*10+9);min_flag2=1;break;
}
}
scan();
if(key_backvalue==21)
{
backspace();
}
}
}
}
void Timer0() interrupt 3
{
static u16 i;
unsigned char o=0;
TH1=0XFC; //给定时器赋初值,定时1ms
TL1=0X18;
i++;
if(i==1000)
{
i=0;
sec++;
if(sec>59)
{
sec=0;min++;
if(min>59)
{
min=0;hour++;
if(hour>23)
{
hour=0;
}
}
}
}
}
void DigDisplay()interrupt 1
{
u8 i;
static u16 o;
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
o++;
if(o==15)
{
datapros();
for(i=0;i<8;i++)
{
if(set_hour&&i==7)continue;
if(hour_unit&&i==6)continue;
if(set_min&&i==4)continue;
if(min_unit&&i==3)continue;
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
P0=DisplayData[7-i];//发送数据
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
if(o==30)
{
o=0;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
P0=DisplayData[7-i];//发送数据
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
}
#include"matrix_key.h"
unsigned char key_backvalue;
void scan()
{
unsigned int k=0;
keynumber=0x0f;
if(keynumber!=0x0f)
{
delay(1000);
keynumber=0x0f;
switch(keynumber)
{
case(0x07):key_backvalue=1;break;
case(0x0b):key_backvalue=2;break;
case(0x0d):key_backvalue=3;break;
case(0x0e):key_backvalue=11;break;
}
keynumber=0xf0;
switch(keynumber)
{
case(0x70):key_backvalue=key_backvalue;break;
case(0xb0):key_backvalue=key_backvalue+3;break;
case(0xd0):key_backvalue=key_backvalue+6;break;
case(0xe0):key_backvalue=key_backvalue+20;break;
}
}
while((k<50)&&(keynumber!=0xf0))
{
delay(200);
k++;
}
}
#ifndef __matrix_key_H_
#define __matrix_key_H_
#include<reg52.h>
#define keynumber P1
void delay(unsigned int i);
extern void scan();
#endif
纯手打,实现电子表的一般功能
|