📄 shuzhishizhong_3.c
字号:
/************************************************************
作者:邱星凌
版本:4.0
描述:采用两个中断来苗粟
*********************************************************/
#include <reg52.h>
#define OCS_FREQ (12000000UL) /*时钟周期*/
#define OCS_PER_INST (12) /*晶体频率*/
typedef unsigned int tWord; /*重定义INT*/
#define _TIMER0_COUNT (65536-(tWord)(OCS_FREQ/(OCS_PER_INST*200)))/*这是显示中断*/
#define _TIMER1_COUNT (65536-(tWord)(OCS_FREQ/(OCS_PER_INST*20)))/*这是最接近一秒的初值*/
#define _TEMES 250 /*去抖动*/
#define FO_VECTOR 1 /*timero的中断号*/
#define F1_VECTOR 3/*timer1的中段号*/
unsigned char n;/*保留p2的值**/
code v[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0~9
code scan[6]={0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};/*七段使能选择*/
typedef struct
{
char hour;
char minute;
char second;
}time; /*时间结果体*/
unsigned char i=0,keya=0,keyb=0,keyc=0,mode=0; /*计数变量 显示变量 按纽变量 模式变量*/
unsigned int timer0_tick;
sbit q3=P3^3; /*端口变量*/
sbit q7=P0^7;
time now; /*时间对象*/
/*中断服务函数*/
static void timer0_isr(void) interrupt FO_VECTOR
{
TR0=0;
TH0=(_TIMER0_COUNT/256);
TL0=(_TIMER0_COUNT%256);
TR0=1;
P1=0xFF;
P2=0xFF;
n= P2 & 0xFC;
q3=0;
if(keya!=0)
{
keya--; /*去抖动*/
if(keya==0 && n==0xF4 )
{
mode++;
if(mode==2)
{
mode=0;
}
}
}
else if(n==0xF4)
{
keya=_TEMES;
}
if(keyb!=0)
{
keyb--;
if(keyb==0 && n==0xDC && mode==1)
{
now.minute++;
if(now.minute==60)
{
now.minute=0;
}
}
}
else if(n==0xDC)
{
keyb=_TEMES;
}
if(keyc!=0)
{
keyc--;
if(keyc==0 && n==0x7C && mode==1)
{
now.hour++;
if(now.hour==24)
{
now.hour=0;
}
}
}
else if(n==0x7C)
{
keyc=_TEMES;
}
P2=0xFF;
P0=0xFF;
switch (mode)
{
case 0: /*显示模式下显示*/
switch(i)
{
case 0:
P0=v[now.second%10];
break;
case 1:
P0=v[now.second/10];
break;
case 2:
P0=v[now.minute%10];
q7=0;
break;
case 3:
P0=v[now.minute/10];
break;
case 4:
P0=v[now.hour%10];
q7=0;
break;
case 5:
P0=v[now.hour/10];
break;
default :
break;
}
break;
case 1: /*设置模式显示*/
switch (i)
{
case 0:
P0=v[0];
now.second=0;
timer0_tick=0;
break;
case 1:
P0=v[0];
break;
case 2:
P0=v[now.minute%10];
q7=0;
break;
case 3:
P2=0xFF;
P0=0xFF;
P0=v[now.minute/10];
break;
case 4:
P0=v[now.hour%10];
q7=0;
break;
case 5:
P0=v[now.hour/10];
break;
default :
break;
}
default :
break;
}
P2=scan[i];
i++;
if(i==6)
{
i=0;
}
}
static void timer1_isr(void) interrupt F1_VECTOR
{
TR1=0;
TH1=(_TIMER1_COUNT/256);
TL1=(_TIMER1_COUNT%256);
TR1=1;
timer0_tick++;
if(timer0_tick==170)
{
timer0_tick=0;
i=0;
now.second++;
if(now.second==60)
{
now.second=0;
now.minute++;
if(now.minute==60)
{
now.hour++;
now.minute=0;
if(now.hour==24)
{
now.hour=0;
}
}
}
}
}
static void timer0_initialize (void)
{
EA=0;
TR0=0;
TMOD &=0xF0;
TMOD &=0x01;
TH0=(_TIMER0_COUNT/256);
TL0=(_TIMER0_COUNT%256);
ET0=1;
PT0=0;
TF0=0;
TR0=1;
EA=1;
}
static void timer1_initialize (void)
{
EA=0;
timer0_tick=0;
TR1=0;
TMOD &=0xF0;
TMOD &=0x01;
TH1=(_TIMER0_COUNT/256);
TL1=(_TIMER0_COUNT%256);
ET1=1;
PT1=1;
TF1=0;
TR1=1;
EA=1;
}
void main (void)
{
timer0_initialize();
timer1_initialize();
while(1)
{
PCON |=0x01;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -