/*********************************/
/*采用STC15F204EA 此单片机注意版本,
有A版与B版本之分,它引脚定义不一样的,
请大家注意!
在12864上显示万年历:可以精确显示
年月日星期时间,然后可以进行时间任
意调整!长按S1功能键后,进行入调整
模式,此时显示屏上光标在闪动,再按
功能键可以跳到另一个需要调整的位置,
S2可以任意加值,按S3可以任意减值,
按8次功能键S1,可以回到走时状态*/
以下是实物图片展示!
单片机源程序如下:
/*********************************/
#include <reg52.h>//头文件
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义
sfr P0M0 = 0x94;
sfr P0M1 = 0x93;
sfr P1M0 = 0x92;
sfr P1M1 = 0x91;
sfr P2M0 = 0x96;
sfr P2M1 = 0x95;
sfr P3M0 = 0xb2;
sfr P3M1 = 0xb1;
sfr P4M0 = 0xb4;
sfr P4M1 = 0xb3;
sfr P5M0 = 0xca;
sfr P5M1 = 0xc9;
sfr P6M0 = 0xcc;
sfr P6M1 = 0xcb;
sfr P7M0 = 0xe2;
sfr P7M1 = 0xe1;
sfr P5=0xC8;//xxxx,1111 端口5
sbit SCLK=P0^1;//时钟信号线
sbit DATA=P3^1;//数据线
sbit RST=P3^0;//复位端
sbit rs=P2^0;//液晶1602控制端
sbit rw=P2^1;//液晶1602控制端
sbit e=P2^2; //液晶1602使能端
sbit s1=P3^2;//功能键
sbit s2=P2^7;//-键
sbit s3=P2^6;//+键
/******************************************************/
/*变量分别为:miao秒,fen分,shi时,ri日,yue月,nian年,
xin星期,dii定计数变量,num5按键计数,readvalue转换后数*/
/*******************************************************/
uchar miao,fen,shi,ri,yue,nian,xin,dii,num5, readvalue;
/******************************************************/
/*变量分别为:flash秒--年调整标志位,flag显示标志位,
flag1进入功能模式标志位,flag2星期调整标志位*/
/*******************************************************/
bit flash,flag,flag1,flag2;
uchar code table[]={"0123456789"};//液晶1602数据表
/**********************************/
//延时函数1//
//入口参数:z
/*********************************/
void delaya(uchar z)//延时1
{
uchar x;
for(x=z;x>0;x--);
}
/**********************************/
//延时函数2//
//入口参数:z
/*********************************/
void delayb(uchar z)
{
uchar x,y;
for(y=z;y>0;y--)
for(x=100;x>0;x--);
}
/**********************************/
//向1302写一个字节数据//
//入口参数:dat
/*********************************/
void write1302xei(uchar dat)
{
uchar x;
delaya(2);//等待一会儿
for(x=0;x<8;x++)//循环8次将一个字数发送完毕
{
DATA=dat&0x01;//取出最低位,从而实现一位位传送
delaya(2);//等待一会儿
SCLK=1;//置高形成上升沿
delaya(2);//延时
SCLK=0;//置低
dat>>=1;//等待传送第二个字节
}
}
/**************************************/
//根据控制字向1302写一个字节数据//
//入口参数:控制参数kong,实际参数can
/*************************************/
void write1302(uchar kong,uchar can)
{
SCLK=0;//置低
RST=0;//置低
RST=1;//高电平时送数据
delaya(2);//延时
write1302xei(kong);//写控制命令
write1302xei(can);//写数据
SCLK=1;//置高形成上升沿
RST=0;//置低
}
/**************************************/
//向1302读一个字节数据//
//入口参数:dat,x
/*************************************/
uchar read1302du()
{
uchar dat,x;
for(x=0;x<8;x++)//循环8次,读完一个字节
{
dat>>=1;//右位一位为下一个字节发送作好准备
//DATA=dat;
if(DATA==1)//如果数据端为1,则执行下面语句
dat|=0x80;//将最高位给它
SCLK=1;//置高
delaya(2);//延时
SCLK=0;//置低
delaya(2);//延时
}
return dat;//将值返回
}
/**************************************/
//根据控制字向1302读一个字节数据//
//入口参数:控制参数kong 实际参:dat
/*************************************/
uchar read1302(uchar kong)
{
uchar dat;//定义变量
RST=0;//先置0
SCLK=0;//置0
RST=1;//准备传数据
write1302xei(kong);//写控制字
dat=read1302du();//读数
SCLK=1;//形成上升沿
RST=0;//置0
return dat;//将值返回
}
void init1302()
{
/*以下是掉电保护函数通过判断标志位是否为1来判断*/
uchar flag;
flag=read1302(0x81);//读秒数据
if(flag&0x80==1)//判断最高位是否为1,若为1则说明芯片停止工作了,若为0则说明没有停止
{
write1302(0x8e,0x00);//去掉保护
write1302(0x80,((12/10)<<4)|(12%10));/*显示54秒/*先将BCD码求模得到高位,然后左移四位,
//得到了高四位,然后将BCD码求余这样就得到了低四位,然后相或就转换成了二进制代码了*/
write1302(0x82,((59/10)<<4)|(59%10));//显示59分
write1302(0x84,((23/10)<<4)|(23%10));//显示23点
write1302(0x86,((7/10)<<4)|(7%10));//显示07日
write1302(0x88,((3/10)<<4)|(3%10));//显示03月
write1302(0x8c,((10/10)<<4)|(10%10));//显示10年
write1302(0x8a,((7/10)<<4)|(7%10));//显示星期天
write1302(0x90,0xa5);//打开充电方式,选择一个二极管2K电阻
write1302(0x8e,0x80);//打开保护
}
/*以下是开机复位函数*/
/*
write1302(0x8e,0x00);//去掉保护
write1302(0x80,((12/10)<<4)|(12%10));
write1302(0x82,((59/10)<<4)|(59%10));//显示59分
write1302(0x84,((23/10)<<4)|(23%10));//显示23点
write1302(0x86,((7/10)<<4)|(7%10));//显示07日
write1302(0x88,((3/10)<<4)|(3%10));//显示03月
write1302(0x8c,((10/10)<<4)|(10%10));//显示10年
write1302(0x8a,((7/10)<<4)|(7%10));//显示星期天
write1302(0x90,0xa5);//打开充电方式,选择一个二极管2K电阻
write1302(0x8e,0x80);//打开保护
*/
}
/**************************************/
//以下是液晶模块1602操纵
/*************************************/
/**************************************/
//写指令到液晶
//入口参数:dat
/*************************************/
/************************************************************************/
/**********************延时50微秒子程序**********************************/
/************************************************************************/
void delay50us(uint z) //延时子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=19;y>0;y--);
}/***********写命令**********************/
void write1602(uchar dat)
{
rs=0;//控制端置低
rw=0;//控制端置低
e=0;//使能端置低
delay50us(50);
P1=dat;//送数
e=1;//使能端置1
delay50us(50);
e=0;//置0
delay50us(50);
}
/*void write1602(uchar dat)
{
write1602a(dat|0x80);//与0x80相或后得到的数
}*/
/**************************************/
//写数据(ASCII码)到液晶
//入口参数:dat
/*************************************/
void read1602(uchar dat)
{
rs=1;//控制端置高
rw=0;//控制端置低
e=0;//使能端置0
delay50us(50);
P1=dat;//送数据
e=1;//形成上升沿
delay50us(50);
e=0;//清0
delay50us(50);
}
void delayms(uint z) //延时子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
/************************************************************************/
/************************汉字指针的显示方法**********************************/
/************************************************************************/
void hanzi(uchar *ch)
{
while(*ch!=0)
read1602(*ch++);
delayms(200);
}
/**************************************/
//1602液晶初始化
/*************************************/
void init1602()
{
write1602(0x30);//
/************************************/
/*打开所有显示,0x08关显示,关闭光标,关闭反白
0x0c开显示,关闭光标,关闭反白,0x0e开显示,开光标,关闭反白,
0x0f开显示,开光标,开反白*/
/************************************/
write1602(0x01);//清屏
write1602(0x0c);//开显示,不显示光标
write1602(0x06);//光标右移,AC自动加1
write1602(0x89);//在第一行第2个位置显示即相当于0x81处显示
hanzi("【牛电子钟】");
write1602(0x98);//在第一行第2个位置显示即相当于0x81处显示
hanzi("SL1302IC15W204EA");
write1602(0x80);//在第一行第2个位置显示即相当于0x81处显示
read1602('D');//在第一行第3个位置显示D
read1602('a');//在第一行第4个位置显示a
read1602('t');//在第一行第5个位置显示t
//read1602('e');//在第一行第6个位置显示e
read1602(':');//在第一行第7个位置显示:
read1602('2');//在第一行第8个位置显示2
read1602('0');//在第一行第9个位置显示0
write1602(0x84);//在第一行显示
read1602('-'); //显示-
read1602('-'); //显示-
write1602(0x86);//在第一行显示
read1602('-');//显示-
read1602('-'); //显示-
write1602(0x90);//在第二行第1个位置显示a
read1602('T');//显示T
read1602(':');//显示:
write1602(0x92);//在第二行显示
read1602(':');//显示:
write1602(0x94);//在第二行显示
read1602(':');//显示:
write1602(0x96);//在第二行显示
read1602('W');//显示W
read1602(':');//显示:
}
/**************************************/
//1302数据显示程序
/*************************************/
/**************************************/
//秒显示程序
//入口参数:dat
/*************************************/
void Displaymiao(uchar dat)
{
write1602(0x95);//秒钟显示位置
read1602(table[(dat/10)]);//显示秒钟十位
read1602(table[(dat%10)]);//显示秒钟个位
}
/**************************************/
//分显示程序
//入口参数:dat
/*************************************/
void Displayfen(uchar dat)
{
write1602(0x93);//分钟显示位置
read1602(table[(dat/10)]);//显示分钟十位
read1602(table[(dat%10)]);//显示分钟个位
}
/**************************************/
//时显示程序
//入口参数:dat
/*************************************/
void Displayshi(uchar dat)
{
write1602(0x91);//时钟显示位置
read1602(table[(dat/10)]);//显示时钟十位
read1602(table[(dat%10)]);//显示时钟个位
}
/**************************************/
//日显示程序
//入口参数:dat
/*************************************/
void Displayri(uchar dat)
{
write1602(0x87);//日显示位置
read1602(table[(dat/10)]);//显示日十位
read1602(table[(dat%10)]);//显示日个位
}
/**************************************/
//月显示程序
//入口参数:dat
/*************************************/
void Displayyue(uchar dat)
{
write1602(0x85);//月显示位置
read1602(table[(dat/10)]);//显示月十位
read1602(table[(dat%10)]);//显示月个位
}
/**************************************/
//年显示程序
//入口参数:dat
/*************************************/
void Displaynian(uchar dat)
{
write1602(0x83);//年显示位置
read1602(table[(dat/10)]);//显示年十位
read1602(table[(dat%10)]);//显示年个位
}
/**************************************/
//星期几显示程序
//入口参数:dat
/*************************************/
void Displayxin(uchar dat)
{
write1602(0x97);//星期显示位置
read1602(table[(dat%10)]);//显示星期个位
}
/**************************************/
//从1302里读出数据并送往1602液晶显示
/*************************************/
void value()
{
readvalue=read1302(0x81);//读出秒值给变量readvalue
miao=((readvalue&0x70)>>4)*10+(readvalue&0x0f);/*先将秒数最高位与低四位去掉,
然后右位四位*10得到高四位,然后将秒值保留低四位与高四位相加,这样将二进制码转换成了BCD码*/
Displaymiao(miao);//将BCB码送到液晶显示
readvalue=read1302(0x83);//读出分值给变量readvalue
fen=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//将分二进制码转换成BCD码
Displayfen(fen);//将分送液晶1602显示
readvalue=read1302(0x85);//读出时值给变量readvalue
shi=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//将时二进制码转换成BCD码
Displayshi(shi);//将时送液晶1602显示
readvalue=read1302(0x87);//读出日值给变量readvalue
ri=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//将日二进制码转换成BCD码
Displayri(ri);//将日送液晶1602显示
readvalue=read1302(0x89);//读出月值给变量readvalue
yue=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//将月二进制码转换成BCD码
Displayyue(yue);//将月送液晶1602显示
readvalue=read1302(0x8d);//读出年值给变量readvalue
nian=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//将月二进制码转换成BCD码
Displaynian(nian);//将年送液晶1602显示
readvalue=read1302(0x8b);//读出星期值给变量readvalue
xin=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//将星期二进制码转换成BCD码
Displayxin(xin);//将星期送液晶1602显示
}
/**************************************/
/*************按键处理子函数**********/
/*************************************/
void sky()
{
if(flag1==1)//如果进入功能模式标志位为1,则执行以下程序
{
write1302(0x8e,0x00);//让时间停下来
write1302(0x80,0x80);
write1302(0x8e,0x80);//让时间停下来
flag=1;//让显示子程序停下来
write1602(0x0f);//将液晶光标闪动打开,以便我们看清楚具体调哪个位置
write1602(0x97);//将光标闪烁的位置选定
flash=1;//将秒---年标志位打开
flag2=1;//将星期调整加+与减-标志位打开
}
if(flag2==1)//如果星期调整加+与减-标志位为1就执行以下程序
{
if(s2==0)//如果+键按下就执行以下程序
{
delayb(5);//去下抖
if(s2==0)//再次确认是否按下了
{
while(!s2)//按键释放
Displayxin(xin);//调用显示星期子程序
xin++;//将星期+1
if(xin==8)//如果星期到了8就清它清1
xin=1;//清1
write1302(0x8e,0x00);//去掉保护
write1302(0x8a,((xin/10)<<4)|(xin%10));//显示星期天
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x8b);//读星期
xin=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//将星期值还原
Displayxin(xin);//送显示
write1602(0x97);//光标停留位置
}
}
if(s3==0)//如果-按键按下了
{
delayb(5);//去抖
if(s3==0)//如果-按下了,就执行以下程序
{
while(!s3)//按键释放
Displayxin(xin);//星期显示子程序
xin--;//减1
if(xin==(1-1))//如果到了(1-1)就给它7,因为星期只1---7
xin=7;//将它给7
write1302(0x8e,0x00);//去掉保护
write1302(0x8a,((xin/10)<<4)|(xin%10));//显示星期天
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x8b);
xin=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//读星期值
Displayxin(xin);//星期显示子程序
write1602(0x97);//光标位置
}
}
}
if(flash==1)//如果秒---年标志位打开,执行以下程序
{
if(s1==0)//加+按键按下了吗?
{
delayb(5);//去抖
if(s1==0)//再次判断是否按下
{
while(!s1);//按键释放
flag2=0;//将星期调整加+与减-标志位关闭,防止星期调整部分动作
num5++;//将按键记数器加1
switch(num5)//判断按键记数器
{
case 1://如果等1调整秒
flag1=0;//将进入功能模式标志位清0,即不要它动作
write1602(0x95);//光标位置
break;//返回
case 2://调整分
write1602(0x93);//光标位置
break;//返回
case 3://调整时
write1602(0x91);//光标位置
break;//返回
case 4://调整日
write1602(0x87);//光标位置
break;//返回
case 5://调整月
write1602(0x85);//光标位置
break;//返回
case 6://调整年
write1602(0x83);//光标位置
break;//返回
case 7://归0
num5=0;//将记数器清0
if(num5==0)//如果记数器为0,则执下以下程序
{
write1302(0x8e,0x00);//让时间停下来
write1302(0x80,0x00);
write1302(0x8e,0x80);//让时间停下来
flag=0;//让时钟开始走
flash=0;//秒--年调整标志位复位
flag1=0;//星期调整加+与减-标志位复位
TR0=1;//定时器打开,以准备下次调整
write1602(0x0c);//关闭光标闪动
break;
}
}
}
}
}
if(num5!=0)//如果将按键记数器不为0则执行以下程序
{
switch(num5)//判断它num5情况
{
/**************************************/
/*************秒处理子函数**********/
/*************************************/
case 1://miao秒调整
if(s2==0)//加按键有按下吗?
{
delayb(5);
if(s2==0)
{
while(!s2)//按键释放
Displaymiao(miao);//调用显示
miao++;//秒加1
if(miao==60)//到了60?
miao=0;//清0
write1302(0x8e,0x00);//去掉保护
write1302(0x80,((miao/10)<<4)|(miao%10));//秒数据写入
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x81);//调用读秒子程序
miao=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//还原秒
Displaymiao(miao);//显示
write1602(0x95);//光标位置
}
}
if(s3==0)//减按键是否有按下?
{
delayb(5);
if(s3==0)
{
while(!s3)//按键释放
Displaymiao(miao);//调用秒显示
miao--;//减1
if(miao==(0-1))//如果秒等于(0-1)
miao=59;//将秒寄存器给59
write1302(0x8e,0x00);//去掉保护
write1302(0x80,((miao/10)<<4)|(miao%10));//秒数据写入
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x81);//读秒数据
miao=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//转换秒数据
Displaymiao(miao);//送显示
write1602(0x95);//光标位置
}
}
break;//返回
/**************************************/
/*************分处理子函数**********/
/*************************************/
case 2://fen分钟调整
if(s2==0)
{
delayb(5);
if(s2==0)
{
while(!s2)
Displayfen(fen);
fen++;
if(fen==60)
fen=0;
write1302(0x8e,0x00);//去掉保护
write1302(0x82,((fen/10)<<4)|(fen%10));//分数据写入
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x83);
fen=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
Displayfen(fen);
write1602(0x93);
}
}
if(s3==0)
{
delayb(5);
if(s3==0)
{
while(!s3)
Displayfen(fen);
fen--;
if(fen==(0-1))
fen=59;
write1302(0x8e,0x00);//去掉保护
write1302(0x82,((fen/10)<<4)|(fen%10));//分数据写入
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x83);
fen=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
Displayfen(fen);
write1602(0x93);
}
}
break;
/**************************************/
/*************小时处理子函数**********/
/*************************************/
case 3://shi小时调整
if(s2==0)
{
delayb(5);
if(s2==0)
{
while(!s2)
Displayshi(shi);
shi++;
if(shi==24)
shi=0;
write1302(0x8e,0x00);//去掉保护
write1302(0x84,((shi/10)<<4)|(shi%10));//时数据写入
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x85);
shi=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
Displayshi(shi);
write1602(0x91);
}
}
if(s3==0)
{
delayb(5);
if(s3==0)
{
while(!s3)
Displayshi(shi);
shi--;
if(shi==(0-1))
shi=23;
write1302(0x8e,0x00);//去掉保护
write1302(0x84,((shi/10)<<4)|(shi%10));//时数据写入
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x85);
shi=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
Displayshi(shi);
write1602(0x91);
}
}
break;
/**************************************/
/*************日处理子函数**********/
/*************************************/
case 4://ri日调整
if(s2==0)
{
delayb(5);
if(s2==0)
{
while(!s2)
Displayri(ri);
ri++;
if(ri==32)
ri=1;
write1302(0x8e,0x00);//去掉保护
write1302(0x86,((ri/10)<<4)|(ri%10));//日数据写入
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x87);
ri=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
Displayri(ri);
write1602(0x87);
}
}
if(s3==0)
{
delayb(5);
if(s3==0)
{
while(!s3)
Displayri(ri);
ri--;
if(ri==(1-1))
ri=31;
Displayri(ri);
write1302(0x8e,0x00);//去掉保护
write1302(0x86,((ri/10)<<4)|(ri%10));//日数据写入
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x87);
ri=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
Displayri(ri);
write1602(0x87);
}
}
break;
/**************************************/
/*************月处理子函数**********/
/*************************************/
case 5://yue月调整
if(s2==0)
{
delayb(5);
if(s2==0)
{
while(!s2)
Displayyue(yue);
yue++;
if(yue==13)
yue=1;
write1302(0x8e,0x00);//去掉保护
write1302(0x88,((yue/10)<<4)|(yue%10));//月数据写入
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x89);
yue=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
Displayyue(yue);
write1602(0x85);
}
}
if(s3==0)
{
delayb(5);
if(s3==0)
{
while(!s3)
Displayyue(yue);
yue--;
if(yue==(1-1))
yue=12;
write1302(0x8e,0x00);//去掉保护
write1302(0x88,((yue/10)<<4)|(yue%10));//月数据写入
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x89);
yue=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//月转换
Displayyue(yue);
write1602(0x85);
}
}
break;
/**************************************/
/*************年处理子函数**********/
/*************************************/
case 6://nian年调整
if(s2==0)
{
delayb(5);
if(s2==0)
{
while(!s2)
Displaynian(nian);
nian++;
if(nian==99)
nian=0;
write1302(0x8e,0x00);//去掉保护
write1302(0x8c,((nian/10)<<4)|(nian%10));//年数据写入
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x8d);
nian=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//年数据转换
Displaynian(nian);
write1602(0x83);
}
}
if(s3==0)
{
delayb(5);
if(s3==0)
{
while(!s3)
Displaynian(nian);
nian--;
if(nian==(0-1))
nian=99;
write1302(0x8e,0x00);//去掉保护
write1302(0x8c,((nian/10)<<4)|(nian%10));//年数据写入
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x8d);
nian=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
Displaynian(nian);
write1602(0x83);
}
}
break;
}
}
}
/**************************************/
/************主程序处理部分***********/
/*************************************/
void main()
{
P0M0=0x00;
P0M1=0x00;
P1M0=0x00;
P1M1=0x00;
P2M0=0x00;
P2M1=0x00;
P3M0=0x00;
P3M1=0x00;
P5M0=0x00;
P5M1=0x00;
P4M0=0x00;
P4M1=0x00;
TMOD=0x01;//选择定时器工作方式
TH0=(65536-20000)/256;//赋值给高位
TL0=(65536-20000)%256;//赋值给低位
EA=1;//开总中断
ET0=1;//开定时器中断
TR0=1;//开定时器
init1302();//初始化1302子程序
init1602();//初始化1602子程序
while(1)
{
if(flag==0)//如果标志位flag等于0,则执行显示程序,即调整时间时不执行显示程序
value();//调用显示子程序
sky();//调用按键子程序
}
}
/**************************************/
/*****长按功能键进行调整处理部分*****/
/*************************************/
void led() interrupt 1 //中断服务子程序
{
TH0=(65536-20000)/256;//赋值高位
TL0=(65536-20000)%256;//赋值低位
dii++;//将中断次数加1
if(dii==120)//到了120次中断吗?
{
dii=0;//清0准备下一次中断
if(s1==0)//功能键按下了吗?
{
delayb(5);//消抖
if(s1==0)//再次确认
{
while(!s1);//按键释放
flag1=1;//将进入功能键标置位置1
TR0=0;//关闭定时器,防止操纵其它功能时误动作
}
}
}
}
下载地址:
实测视频.rar
(2.31 MB, 下载次数: 40)
|