当前位置:首页 > 单片机 > 单片机
[导读]//中断的应用二//★★★★★★★★★数字钟★★★★★★★★★★★\\\\ //单征机型号:PIC16F877A //功能描述:数字钟功能,初始显示时间为12点,且带手动调整时间功能。 //端口定义:RA0~RA5数码管位控制口、RD0~R

//中断的应用二

//★★★★★★★★★数字钟★★★★★★★★★★★\
//单征机型号:PIC16F877A
//功能描述:数字钟功能,初始显示时间为12点,且带手动调整时间功能。
//端口定义:RA0~RA5数码管位控制口、RD0~RD7数码管段控制口、RB0秒增一、RB1分增一、RB2时增一。


#include
__CONFIG(0xf73A); //芯片配置字

const unsigned char dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段选0~9
unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位选,数码管1~8
unsigned char dispbuf[8]={0,0,16,0,0,16,0,0}; //时间数据寄存器
unsigned int tcnt; //百分之一秒计数器
unsigned char second; //秒计数器
unsigned char minite; //分计数器
unsigned char hour; //时计数器
unsigned char dispbitcnt; //显示子程序中段与位显示计数器
bit keyb0,keyb1,keyb2; //RB0,RB1,RB2按键作用标志位

//========================================================================
//功能描述:延时子程序
//函数名称:delay);
void delay()
{
int i;
for(i=80;i>0;i--);
}

//========================================================================
//功能描述:显示子程序
//函数名称:disp();
void disp()
{

PORTA=dispbitcode[dispbitcnt];
PORTD=dispcode[dispbuf[dispbitcnt]];
dispbitcnt++;
if(dispbitcnt==8)
{
dispbitcnt=0;
}
delay();
}

//========================================================================
//功能描述:端口初始化
//函数名称:portinit();
void portinit()
{
TRISA=0x00; //PA口设为输出
TRISB=0xff; //PB口设为输入
TRISC=0x00; //PC口设为输出
TRISD=0x00; //PC口设为输出
PORTA=0x00; //PA口设为输出为0
PORTB=0x00;
PORTC=0x00;
PORTD=0;
tcnt=0;
second=0;
minite=0;
hour=12;
dispbitcnt=0;
keyb0=0;
keyb1=0;
keyb2=0;
}

//=====================================================================
//功能描述:定时中断服务
//函数名称:TimeInt();
void interrupt TimeInt(void)
{
tcnt++;
if(tcnt==20)
{
tcnt=0;
second++;
if(second==60)
{
second=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
dispbuf[0]=hour/10;
dispbuf[1]=hour%10;
dispbuf[2]=minite/10;
dispbuf[3]=minite%10;
dispbuf[4]=second/10;
dispbuf[5]=second%10;
dispbuf[6]=tcnt/10;
dispbuf[7]=tcnt%10;


TMR0 = 0x3d; //定时初值
T0IF = 0; //清除标志
}


//========================================================================
//功能描述:中断设置
//函数名称:IdsInit();
void IdsInit(void)
{
OPTION = 0x87; //分频因子
TMR0 = 0x3d; //定时初值
T0IE = 1; //开启定时
GIE = 1; //准许中断
}

//========================================================================
//功能描述:手动调时子程序
//函数名称:key();
void key()
{
if(RB0==0)
{
delay();
if(RB0==0)
{
if(keyb0==0)
{
keyb0=1;
second++;
if(second==60)
{second=0;}

}
}
}
else keyb0=0;
if(RB1==0)
{
delay();
if(RB1==0)
{
if(keyb1==0)
{
keyb1=1;
minite++;
if(minite==60)
{minite=0;}
}
}
}
else keyb1=0;
if(RB2==0)
{
delay();
if(RB2==0)
{
if(keyb2==0)
{
keyb2=1;
hour++;
if(hour==24)
{hour=0;}

}
}
}
else keyb2=0;
}

//========================================================================
//功能描述:主程序
//函数名称:main();
main()
{
portinit(); //端口初始化
IdsInit(); //TMR0初始化
while(1)
{
disp();
key();
}
}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

中断机制在单片机及嵌入式系统中是重中之重,我们必须深入理解。首先我们要明白一点:CPU执行指令代码,并非一直顺序地逐条执行,而是可能突然跳到某段代码上去的。因为这段代码的优先级更高,或者说它更加紧迫,CPU必须暂时放下手...

关键字: 中断 单片机 嵌入式系统

PIC单片机是基于RISC系统结构的单片机,最初的设计是支持PDP(编程数据处理器)计算机。大量的操作可以用来控制外围设备。PIC单片机比微控制器具有更快的程序执行能力。它是由微芯片技术公司于1889年发明的,是一种8位...

关键字: PIC单片机 定时器 中断

STC单片机是一款增强型51单片机,完全兼容MCS-51,还增加了新的功能,比如新增两级中断优先级,多一个外中断,内置EEPROM,硬件看门狗,具有掉电模式,512B内存等。还支持ISP下载,不用编程器,只要一个MAX2...

关键字: 单片机 看门狗 中断

什么是PIC中断程序呢?形象的生活比喻就比如你现在这在看我的文章,突然你的朋友喊你一起去烤地瓜,这时候你就中断了看文章和朋友烤地瓜去了,烤完地瓜之后你又回来看文章。烤地瓜这件事就好比中断程序,他中断了你看文章这件事。在程...

关键字: PIC 中断 标志位

pic单片机应用很多,生活中到处都有pic单片机的身影。小编个人也是从事pic单片机开发的人员之一,对于pic单片机有一定的理解。今天,小编将带领大家一起看一下pic单片所具备的8大优势。

关键字: pic 单片机 寄存器

MCS—51系列单片机内部只需两个外部接中断连源输入端,当外部接连源多于两个时,就必须进行拓宽,下面介绍几种简略的拓宽办法:

关键字: 单片机 软件 中断

最近在浏览星球主题的时候,发现一位球友打卡中断了,就去关心了一下他(瞧我这该死的责任心❤️),结果被他反手就问了下面这个问题。

关键字: 中断 Spring Boot 实战项目

实质上是加一的计数器。外部脉冲让他不断加一,当计数器溢出时,计数器的溢出相应的中断标志位置1,并向CPU发出中断请求。如果定时器/计数器工作为定时模式,则表示时间以到;如果工作于计数模式,则表示计数器、则表示计数值已满。

关键字: 周期 中断

中断的分类和区别

关键字: 轮询 中断

在这篇文章中,小编将为大家带来微控制器的相关报道。

关键字: 微控制器 中断 控制器
关闭
关闭