📄 dingshi.c
字号:
/*********************************************************************/
//
// 定时
// ancleyan 2007.04.23
/*********************************************************************/
//使用AT89C51单片机,3MHZ晶振,P1口输入,P2口作列扫描,P1数据输出,用共阳LED数码管
#include"reg51.h"
#define char unsigned char
char data time[6]={0x0b,0x0b,0x0b,0x0b,0x0b,0x0b}; //当开启之后显示最下面一行
char code dis_7[14]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xf7,0xbf,0xfe};
char code scan_con[7]={0x01,0x02,0x04,0x08,0x10, 0x20, 0x00}; // 列扫描控制字
//*********************第1个 2个 3个 4个 5个 6个 全不亮
char data t=0; //供键盘输入的数存储进数组时使用
char data count=13;
sbit clean=P3^2;
sbit aa=P3^0;
sbit bb=P3^1;
char data lock=0;
char data lockfun14=0;
//*********外部中断0 完成清零功能 *********
void reset(void) interrupt 0 using 1 // 利用中断清零
{
char i;
//if(){bb=0;}
aa=1;
//else{
for(i=0;i<6;i++) {time[i]=0x0c;}
////gg=0;//delay1ms(200);//P2=0;
clean=1;//记得将P3还原 对产生中断的信号还原
t=0; //还原供键盘输入的数存储进数组时使用 如果不还原 下次存储是从上次中断的地方接着存储
lock=0;
TR0=0;//关闭定时器0
EA=0;
}
//*******定时器0 50MS定时中断
void delay50ms() interrupt 1 using 0
{ void fun15(void);
//while(1)
//{ //0000
count--;
EA=1;ET0=1;TMOD=0x01;
TH0=(65536-15526)/256;
TL0=(65536-15536)%256;
//*****原来使用的确定键功能函数 void okset(void)*********//
if(time[5]==0xff) //&&count==0
{ //1111
if(time[4]==00)
{ //2222
if(time[3]==0x00)
{ //3333
if(time[2]==0x00)
{ //4444
if(time[1]==0x00)
{ //5555
if(time[0]==0x00)
{aa=0;TR0=0;}// 一定要关计时器0 如果不关 7段显示码上无显示 实际上还在继续倒计时
else
{time[0]--;time[1]=9;time[2]=5;time[3]=9;time[4]=5;time[5]=9;}
} //5555
else
{time[1]--;time[2]=5;time[3]=9;time[4]=5;time[5]=9;}
} //4444
else
{time[2]--;time[3]=9;time[4]=5;time[5]=9;}
} //3333
else
{time[3]--;time[4]=5;time[5]=9;}
} //2222
else
{time[4]--;time[5]=9;}
} //1111
else
{
if(count==0)
{ count=13;TR0=1;time[5]--;}//
}
//} //0000
}
//*********设置键的功能**********
void settime(void)
{
if(t==0) //防止输入数据、计时过程中按下设置键
{
char i;
for(i=0;i<6;i++)
{time[i]=0x0d;}
lock=1;lockfun14=1;
}
}
//*******1毫秒延时程序********
delay1ms(int t1)
{
char i,j;
for(i=0;i<t1;i++)
for(j=0;j<120;j++)
{;}
}
//*******10毫秒延时程序********
//delay10ms(int t2)
//{
// int i,j;
//for(i=0;i<t2;i++)
//for(j=0;j<1200;j++)
//{;}
//}
//**********功能函数15 发出INT0中断请求脉冲清零***********************************
void fun15(void)
{
clean=0;//delay1ms(1);clean=1;
}
//**********功能函数14 发出T0中断请求脉冲计时***********************************
void fun14(void)
{
if(t==6)
{TR0=1;}
//ff=0;
}
//**********功能函数13***********************************
void fun13(void)
{
//delay1ms(200);
// okset();
//ee=0;
}
//**********功能函数12***********************************
void fun12(void)
{
//delay1ms(200);
//dd=0;
}
//**********功能函数11***********************************
void fun11(void)
{
//delay1ms(200);
//cc=0;
}
//**********功能函数10***********************************
void fun10(void)
{
settime();
//password();
// okset();
}
//**********功能函数9***********************************
char fun9(void)
{ if(lock==1&&t<6)//平时数字键无效 只有按下设置键才有效
{if(t!=2&&t!=4){
void scan_7(void);//对被调用函数的说明
while(P1!=0xfe){scan_7();} //while(P3!=0xfe);
//delay1ms(200); //防止由于按键未放开 输入一串数字 可以加入一个while(P3!=0xfe)语句 直到放开键才动作
time[t]=9; //用delay1ms(100)语句可以按住键之后重复输入
//aa=0;
return t++;}
}
}
//**********功能函数8***********************************
char fun8(void)
{if(lock==1&&t<6) //加入t<6 防止输入的定时时间多于6位数字
{if(t!=2&&t!=4){
void scan_7(void); //对被掉函数的说明
while(P1!=0xfe){scan_7();} //加入这两条语句的目的是防止闪烁
//while(P3!=0xfe);
//delay1ms(200);
time[t]=8;
// bb=0; //函数功能测试灯
return t++;}}
}
//**********功能函数7***********************************
char fun7(void)
{ if(lock==1&&t<6)
{
if(t!=2&&t!=4) //防止出现类似66分钟的数据
{
void scan_7(void);//对被掉函数的说明
while(P1!=0xfe){scan_7();} //注意 不是所有的语句都使用while(P1!=0xfe),不同的行使用不同的语句
//while(P3!=0xfe); //与密码程序的区别密码程序中使用的不是while(P1!=0xfe),用的是delay();
//delay1ms(200);
time[t]=7;
//cc=0;
return t++;}}
}
//**********功能函数6***********************************
char fun6(void)
{if(lock==1&&t<6)
//void scan_7(void);//对被掉函数的说明
{if(t!=2&&t!=4){
while(P1!=0xfd){scan_7();}
time[t]=6;
//dd=0;
return t++;}}
}
//**********功能函数5***********************************
char fun5(void)
{ if(lock==1&&t<6)
// void scan_7(void);//对被掉函数的说明
{while(P1!=0xfd){scan_7();}
time[t]=5;
//ee=0;
return t++;}
}
//**********功能函数4***********************************
char fun4(void)
{if(lock==1&&t<6)
// void scan_7(void);//对被掉函数的说明
{while(P1!=0xfd){scan_7();}
time[t]=4;
//ff=0;
return t++;}
}
//**********功能函数3***********************************
char fun3(void)
{if(lock==1&&t<6)
//void scan_7(void);//对被掉函数的说明
{while(P1!=0xfb){scan_7();}
time[t]=3;
//gg=0;
return t++;}
}
//**********功能函数2***********************************
char fun2(void)
{ //delay1ms(200);
if(lock==1&&t<6)
//void scan_7(void);//对被掉函数的说明
{while(P1!=0xfb){scan_7();}
time[t]=2;
return t++;}
}
//**********功能函数1***********************************
char fun1(void)
{if(lock==1&&t<6)
//void scan_7(void);//对被掉函数的说明
{ while(P1!=0xfb){scan_7();}
time[t]=0x01;
//hh=0;
return t++;}
}
//**********功能函数0***********************************
char fun0(void)
{
if(lock==1&&t<6)
{while(P1!=0xf7){scan_7();}
time[t]=0;
return t++;}
}
//**************************
//对型如7 8 9 a 的键盘的驱动
// 4 5 6 b
// 1 2 3 c
// d 0 e f
/**********按键驱动函数***********/
void keyscan(void)
{
P1=0xfe; //将第一行置零
if(P1!=0xfe)
{ if(P1==0x7e) fun10(); //一行四列
else if(P1==0xbe) fun9(); //一行三列
else if(P1==0xde) fun8(); //一行二列
else if(P1==0xee) fun7(); //一行一列
}
else
{
P1=0xfd; //将第二行置零
if(P1!=0xfd)
{ if(P1==0x7d) fun11(); //二行四列
else if(P1==0xbd) fun6(); //二行三列
else if(P1==0xdd) fun5(); //二行二列
else if(P1==0xed) fun4(); //二行一列
}
else
{
P1=0xfb; //将第三行置零
if(P1!=0xfb)
{ if(P1==0x7b) fun12();//三行四列
else if(P1==0xbb) fun3();//三行三列
else if(P1==0xdb) fun2();//三行二列
else if(P1==0xeb) fun1();//三行一列
}
else
{
P1=0xf7;
{ if(P1!=0xf7)
{
if(P1==0x77) fun13();//四行四列
else if(P1==0xb7) fun14();//四行三列
else if(P1==0xd7) fun0();//四行二列
else if(P1==0xe7) fun15();//四行一列
}
}
}
}
}
}
//*****数码管显示函数 将数据及显示控制码输出*********//
void scan_7(void)
{
char j;
for(j=0;j<6;j++)
{
P2=scan_con[j];//scan_con[7]={0x01,0x02,0x04,0x08,0x10,0x200x00,}; // 列扫描控制字
P0=dis_7[time[j]];//dis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
delay1ms(1);
}
}
//*******主程序*******//
void main()
{
EA=1;ET0=1;TMOD=0x01;
TH0=(65536-15526)/256;
TL0=(65536-15536)%256;
while(1)
{
EA=1; //CPU开中断
EX0=1; //int0允许中断 //TR0=1;
scan_7();
keyscan();
//delay1ms(1);
//okset();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -