📄 ex5-1.c
字号:
/*
标题:范例 5-1
版本:1.0
Target:89S51
程序描述:这个范例说明如何使用8051 的Port 1连接到四颗七段显示器,PORT 0的低4位分别控制这四颗共阳七段显示器,让四颗共阳七段显示器使用扫描的方式轮流显示数字。这四颗七段显示器将显示出自数字时钟PORT 2的P2.0和P2.1分别连接到2个弹跳按钮。*/
/* ***************************************************** */
#include <REGX51.H>
#define TIMER0_COUNT 0xEE18
/*10000h-(12,000,000/(12*200)) */
#define TRUE 1
#define FALSE 0
#define TIMES 25
#define DISPLAY 0
#define SET 1
const seven_seg[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,
0X80,0X90};const scan[4]={0X0E,0X0D,0X0B,0X07};
typedef struct {
char hour;
char minute;
char second;
} time;
unsigned char timer0_tick,i=0,keyA=0,keyB=0,mode=0;
time now;
static void timer0_isr(void) interrupt TF0_VECTOR using 1
{
TR0=0;
TL0=(TIMER0_COUNT & 0x00FF);
TH0=(TIMER0_COUNT >> 8);
TR0=1;
if (keyA !=0) {
keyA--;
if (keyA==0 && P2_0==0) {
mode++;
if(mode==2) mode=0;
}
} else if (P2_0==0) keyA=TIMES;
if (keyB !=0) {
keyB--;
if (keyB==0 && P2_1==0) {
now.minute++;
if(now.minute==60) {
now.hour++;
now.minute=0;
if(now.hour==24) now.hour=0;
}
}
} else if (P2_1==0) keyB=TIMES;
timer0_tick++;
if (timer0_tick==200) {
timer0_tick=0;
now.second++;
if(now.second==60){
now.minute++;
now.second=0;
if(now.minute==60) {
now.hour++;
now.minute=0;
if(now.hour==24) now.hour=0;
}
}
}
switch (mode) {
case DISPLAY :
switch(i) {
case 0 : P1=seven_seg[now.minute%10];
P1_7=(now.second%2);
break;
case 1 : P1=seven_seg[now.minute/10];
break;
case 2 : P1=seven_seg[now.hour%10];
P1_7=0;
break;
case 3 : P1=seven_seg[now.hour/10];
break;
}
break;
case SET :
switch(i) {
case 0 : if (now.second%2) P1=seven_seg[now.minute%10];
else P1=0XFF;
break;
case 1 : if (now.second%2) P1=seven_seg[now.minute/10];
else P1=0XFF;
break;
case 2 : if (now.second%2) P1=seven_seg[now.hour%10];
else P1=0XFF;
break;
case 3 : if (now.second%2) P1=seven_seg[now.hour/10];
else P1=0XFF;
break;
}
break;
}
P0=scan[i];
i++;
if(i==4) i=0;
}
static void timer0_initialize(void)
{
EA=0;
timer0_tick=0;
TR0=0;
TMOD &= 0XF0;
TMOD |=0x01;
TL0=(TIMER0_COUNT & 0x00FF);
TH0=(TIMER0_COUNT >> 8);
PT0=0;
ET0=1;
TR0=1;
EA=1;
}
void main (void) {
timer0_initialize();
while (1); /*无穷循环 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -