可以处理按键扫描,动态显示,时钟累加等。
外部中断,是与外接接触,哗圆槐当中断引脚为低电平时,进入中断。
如果单片机没有专门的键盘中断,可以使用外部中断来做键盘中断。
你这个提问还是不太清楚,中断时钟,有两种,一个是不利用DS1302,一个是利用它。还有,你到底用早亩什么显示呢?所以,紧密点,恩,我现在有两个,一个是不利用DS1302用数码管显示,一个是利用DS1302用1602显示,希望对你有帮助……如果你要,就联系我吧!
先给你一个数码管的显示的:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char table[]={0x3f,0x06,0x5b,
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,0x80}
sbit led1=P1^0sbit led2=P1^1
uchar num=0,num1=0,i=0,j=0,k=0
void dsande (long int t1,uchar t2)//显示t1和延时t2函数de:delay,an:and,ds:display
{
uchar t3
long int y=t1
for(t2>0t2--,y=t1)
for(t3=7y!=0t3--,y/=10)
{
P0=0
P2=(P2&0xf8)|t3//择位
P0=table[y%10]//这种从低位开始扫描,就只需求关茄睁丛于十的余数,前面的for自然的降位给它,丢最后颤樱一个数字
}
}
void main()
{ long int a
TMOD=0x11
TH0=(65536-50000)/256
TL0=(65536-50000)%256//为第一次做准备,赋值
TH1=(65536-50000)/256//这是为数码管显示做的准备
TL1=(65536-50000)%256
EA=1//开启总中断
ET0=1//开启定时器0
ET1=1
TR1=1
TR0=1//启动定时器0 //始终执行中断与主函数无关了
while(1)
{ if(i==60)//写在中断里面也行,但这个本身的误差来自程序执行的时间误差
{i=0
j++
if(j==60)
{j=0,k++
if(k==24)
k=0
}
}
a=k*10000+j*100+i
dsande(a,1)
}
}
void T1_time() interrupt 3
{
TH1=(65536-50000)/256
TL0=(65536-50000)%256
num1++
if(num1==20)
{
num1=0
i++
/*if(i==60)
{i=0
j++
if(j==60)
{j=0,k++
if(k==24)
k=0
}
}*/
}
}
void T0_time() interrupt 1 //隔50ms跑过来到中断程序里来,
{
TH0=(65536-50000)/256
TL0=(65536-50000)%256
num++
if(num==20)//50ms*20为1s
{
num=0
led1=~led1//实现灯的闪动
led2=~led2
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)