📄 3.c
字号:
#include <AT89X51.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint fen=0;
uint miao=0;
uint shi=0;
uchar count,num,k,temp=0xfe;
keyvar();
xianshi();
//165引脚定义********************
sbit pl=P3^6; //锁位
sbit clk2=P3^7; //165时钟
sbit chu=P3^5; //输出
sbit dat=P1^0; //定义驱动74595的数据脚为p1.0
sbit clk=P1^1; //74595的时钟
sbit lat=P1^2; //栓锁
sbit gw=P1^3; //个位显示控制脚
sbit sw=P1^4; //十位
sbit bw=P3^3; //百位
sbit qw=P3^4; //千位
uchar table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };//数据表
uchar table2[]={ 0xbF,0x86,0xdB,0xcF,0xe6,0xeD,0xfD,0x87,0xfF,0xeF};
void delay(uchar t) //延时1MS程序
{
uchar i;
for(i=0;i<100;i++)
for(;t>0;t--);
}
//**************************74HC595显示程序*****************************
dsout(unsigned char j)
{
unsigned char i;
for(i=0;i<8;i++)
{
dat=j&0x80; //高位在前
clk=1;
clk=0;
j<<=1;
}
lat=1;
lat=0; //锁存
}
//*************分调时加1程序****************
keyon()
{
if(num==0xfe)//判断S1是否按下
{
TR0=0;
ET0=0;
fen++;
/*dsout(table2[fen%10]); //位处理
gw=0;
delay(10);
gw=1;
dsout(table1[fen/10]);
sw=0;
delay(10);
sw=1;*/
if(fen>59) fen=0,shi++;
keyvar();
while(num==0xfe){keyvar();xianshi();}//再次判断按键是否按下
}
/*}
//***********************分调时减1程序*****************************
/*keyjian()
{*/
if(num==0xfd)//判断S2是否按下
{
TR0=0;
ET0=0;
fen--;
/*dsout(table2[fen%10]);
gw=0;
delay(10);
gw=1;
dsout(table1[fen/10]);
sw=0;
delay(10);
sw=1;*/
if(fen>59||fen<0) fen=59;
keyvar();
while(num==0xfd){keyvar();xianshi();}//再次判断按键是否按下
}
/*}
//*************时调时加1程序****************
keyjian()
{*/
if(num==0xfb)//判断S3是否按下
{
TR0=0;
ET0=0;
shi++;
/* dsout(table2[shi%10]); //位处理
bw=0;
delay(10);
bw=1;
dsout(table1[shi/10]);
qw=0;
delay(10);
qw=1;*/
if(shi>24) shi=0;
keyvar();
while(num==0xfb){keyvar();xianshi();}//再次判断按键是否按下
}
/*}
//*************时调时减1程序****************
/*keyjian()
{*/
if(num==0xf7)//判断S4是否按下
{
TR0=0;
ET0=0;
shi--;
/*dsout(table2[shi%10]); //位处理
bw=0;
delay(10);
bw=1;
dsout(table1[shi/10]);
qw=0;
delay(10);
qw=1;*/
if(shi>23||shi<0) shi=23;
keyvar();
while(num==0xf7){keyvar();xianshi();}//再次判断按键是否按下
}
}
//************74HC165数据处理程序****************************************
keyvar(void)
{
uchar ee;
pl=0;
pl=1;
for(ee=0;ee<8;ee++)//165在PL有一个脉冲后就输出0位数据
{
k=k<<1;
if(chu)k++;
clk2=0;
clk2=1;
}
num=k;
}
//来回显示*****************************
xianshi(void)
{
dsout(table1[fen%10]);//个位显示0~9
gw=0;
delay(10);//延时处理
gw=1;
dsout(table1[fen/10]);//十位显示0~6
sw=0;
delay(10);
sw=1;
dsout(table2[shi%10]);//百位显示0~9
bw=0;
delay(10);
bw=1;
dsout(table1[shi/10]);//千位显示0~6
qw=0;
delay(10);
qw=1;
}
timer0() interrupt 1 //中断入口
{
TH0=0x4c;
TL0=0x00;
count++;
P0=temp;
if(count==20)//中断20次,实现1秒脉冲,即50MS*20=1S
{
count=0;
temp=_crol_(temp,1);
miao++;
if(miao>59)
{
miao=0;
fen++;
if(fen>59)
{
fen=0;
shi++;
if(shi>24)
{
shi=0;
}
}
}
}
}
void main()
{
TMOD=0x01;//确定定时器工作方式1
EA=1;/////允许中断
ET0=1;
TR0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
while(1)
{
keyvar(); //按键处理
keyon();//调分加1
/* keyjian(); *///调分减1
xianshi();
TR0=1;//设定时器与调时同步
ET0=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -