📄 main.c
字号:
#pragma small
#include "REGX52.H"
#include "stdio.h"
//#include "string.h"
void delay();
void display(void);
void key(void);
void init_t0_1(void);
void init_t2(void);
void second(void);
void music(void);
void init_board(void);
//void receive(char);
void ad_timer(void); //调整时间子程序
extern void send(char);
unsigned char code led[]={0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code ledd[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char data dis_buf[7],key_num=0;//dis_buf[0]为最高位数据,dis_buf[5]为最低位数据;dis_buf[6]为二极管的
unsigned char data operate,byte_bit,rx_byte=0;
unsigned char data mus_th0,mus_tl0,mus_th1,mus_tl1,mus_num;
unsigned char data dida=20,secl,sech,minl=5,minh=2,houl=9,houh=0,hour=9,ad_time;
bit flag_music,flag_t2,flag_serial,rx_bit;
//********************************************************
void int_t0(void) interrupt 1 using 1 //T0中断
{
static unsigned char data i=0xff;
TL0=0x15;
TH0=0xfd;
rx_bit=P3_3;
if(i==0xff)
{
if(rx_bit)
{
TR0=0; EX1=1;
return;
}
}
if(rx_bit) rx_byte=rx_byte+1<<i;
i++;
if(i==8)
{
i=0xff;
dis_buf[1]=rx_byte;
rx_byte=0;
TR0=0;
}
}
//********************************************************
void int_t1(void) interrupt 3 using 1 //T1中断,时钟程序,fosc按12MHz计算
{
TL1=0xb0;
TH1=0x3c;
dida--;
if(dida>0) return;
dida=20; secl++; if(operate==0x03||operate==0x08) dis_buf[5]=secl;
if(secl<10) return;
secl=0; sech++; if(operate==0x03||operate==0x08) {dis_buf[5]=secl; dis_buf[4]=sech; }
if(sech<6) return;
sech=0; minl++; if(operate==0x03||operate==0x08) {dis_buf[4]=sech; dis_buf[3]=minl; }
if(minl<10) return;
minl=0; minh++; if(operate==0x03||operate==0x08) {dis_buf[3]=minl; dis_buf[2]=minh; }
if(minh<6) return;
minh=0; hour++;
if(hour>12) hour=1;
houl=hour%10; houh=hour/10;
if(operate==0x03||operate==0x08) { dis_buf[2]=minh; dis_buf[1]=houl; dis_buf[0]=houh; }
}
//********************************************************
void int_serial(void) interrupt 4 using 1 //串行中断
{
if(RI==1)
{ dis_buf[6]=SBUF; RI=0; }
else if(TI==1) TI=0;
}
//********************************************************
void int_t2(void) interrupt 5 using 1 //T2中断
{
P2_7=~P2_7; //演奏
TF2=0;
}
//********************************************************
void key(void) //键盘程序
{
unsigned char dd;
P1=0xf8; //查询是否有键按下
dd=P1;
if(dd==0xf8) return;
display(); //去抖动
P1=0xf8;
dd=P1;
if(dd==0xf8) return;
P1=0xfb; //查是否有功能键F1---F4按下
dd=P1; dd&=0xf0;
if(dd==0xf0) goto keynt1; //为数字键转
// if(P1_3==0) { operate=0x00; goto keynt4;} //为功能键
if(P1_4==0) { operate=0x01; goto keynt4;}
if(P1_5==0) { operate=0x02; goto keynt4;}
if(P1_6==0) { operate=0x04; goto keynt4;}
if(P1_7==0) { operate=0x08; goto keynt4;}
keynt1:
if(key_num==0) //若是向最高位写数据,则对整个显示缓冲区清0
for(dd=0;dd<6;dd++) dis_buf[dd]=0;
P1=0xfe; //查是否有数字1---5键按下
dd=P1; dd&=0xf8;
if(dd==0xf8) goto keynt2;
if(P1_3==0)
{ dis_buf[key_num]=1; goto keynt3; }
if(P1_4==0)
{ dis_buf[key_num]=2; goto keynt3; }
if(P1_5==0)
{ dis_buf[key_num]=3; goto keynt3; }
if(P1_6==0)
{ dis_buf[key_num]=4; goto keynt3; }
if(P1_7==0)
{ dis_buf[key_num]=5; goto keynt3; }
keynt2:
P1=0xfd; //查是否有数字6---9、0键按下
dd=P1; dd&=0xf8;
if(dd==0xf8) goto keynt4;
if(P1_3==0)
{ dis_buf[key_num]=6; goto keynt3; }
if(P1_4==0)
{ dis_buf[key_num]=7; goto keynt3; }
if(P1_5==0)
{ dis_buf[key_num]=8; goto keynt3; }
if(P1_6==0)
{ dis_buf[key_num]=9; goto keynt3; }
if(P1_7==0)
{ dis_buf[key_num]=0; goto keynt3; }
goto keynt4;
keynt3: //按下的为数字键
key_num++; //调整存键盘值指针
if(key_num==6) key_num=0;
keynt4:
while(1) //等待按键释放
{
P1=0xf8;
dd=P1; dd&=0xf8;
if(dd==0xf8) break;
display();
}
}
//********************************************************
void display(void) //数码管、发光二极管显示函数
{
unsigned char data i,dd,kk;
kk=0xfe;
for(i=0;i<6;i++) //显示6位数码管,从最左边开始
{ //共阴极
dd=dis_buf[i];
P0=led[dd];
flag_music=P2_7; //保存P2.7的数值
P2=kk;
P2_7=flag_music; //恢复P2.7的数值,使其不影响发声
kk=kk*2+1;
if(ad_time-1==i) //调整时间时使对应位的小数点闪烁
if(dida%4==0) P0_7=1;
delay(); //调用汇编中的延时函数,延时2ms
}
P0=dis_buf[6]; //显示8个发光二极管
flag_music=P2_7; //保存P2.7的数值
P2=kk; P2_7=flag_music;
delay();
/*
kk=0x01;
for(i=0;i<6;i++) //显示6位数码管,从最左边开始
{ //共阳极
dd=dis_buf[i];
P0=ledd[dd];
flag_music=P2_7; //保存P2.7的数值
P2=kk+0x40;
P2_7=flag_music; //恢复P2.7的数值,使其不影响发声
kk=kk*2;
if(ad_time-1==i) //调整时间时使对应位的小数点闪烁
if(dida%4==0) P0_7=1;
delay(); //调用汇编中的延时函数,延时2ms
}
P0=dis_buf[6]; //显示8个发光二极管
flag_music=P2_7; //保存P2.7的数值
P2=0x80; P2_7=flag_music;
delay();
*/
}
//********************************************************
void ad_timer(void) //调整时间子程序
{
switch(ad_time)
{
case 1:{houh++; if(houh>1) houh=0; hour=houh*10+houl; dis_buf[0]=houh; break;}
case 2:{houl++; if(houl>9) houl=0; hour=(hour/10)*10+houl; dis_buf[1]=houl;break;}
case 3:{minh++; if(minh>5) minh=0; dis_buf[2]=minh; break;}
case 4:{minl++; if(minl>9) minl=0; dis_buf[3]=minl; break;}
case 5:{sech++; if(sech>5) sech=0; dis_buf[4]=sech; break;}
case 6:{secl++; if(secl>9) secl=0; dis_buf[5]=secl; break;}
}
}
//********************************************************
/*void receive(unsigned char data d)
{
unsigned char data i;
byte_bit=0;
TF0=0; EX0=1;
SBUF=d;
P3_2=1;
for(i=0;i<8;i++)
{
while(TF0==0);
flag_serial=P3_2;
if(flag_serial) byte_bit=byte_bit+2^i;
TF0=0;
}
while(TF0==0); TR0=0;
dis_buf[1]=byte_bit;
}*/
//********************************************************
void init_t0_1(void)
{
TMOD=0x12;
IE=0x88; //T0不做音乐定时器用
TL0=156;
TH0=156;
TL1=0xb0; //T1做时钟定时器用
TH1=0x3c;
TR1=1;
}
//********************************************************
void init_t2(void)
{
if(flag_t2==0)
{
T2MOD=0x00; //T2作为定时器
T2CON=0x00;
ET2=1;
}
else
{
T2MOD=0x0;
T2CON=0x34; //T2作为发送和接收的波特率发生器,并且开T2运行
RCAP2H=0xfe; //设置波特率为9600,fosc=12MHz,初值为FFD9H
RCAP2L=0xe0; //波特率为1200,fosc=11.0592MHz,初值为FEE0H
}
}
//********************************************************
main()
{
unsigned char data i,dd,secd=10;
init_t0_1();
flag_t2=1; init_t2(); //T2初始化为串行口的波特率发生器(定时器)
SCON=0x50; //初始化串行口,允许中断
IT0=1;
EA=1; ES=1; IT1=1; ET0=1;
// TI=1;
dd=0x31;
// printf("C=%c\n",dd);
dd++;
// printf("C=%c\n",dd);
operate=0x00;
for(i=0;i<7;i++) dis_buf[i]=i+1;
while(1)
{
display();
key();
switch(operate)
{
case 0x00: //执行F0功能
{
if(secd!=secl)
{
secd=secl;
for(i=0;i<7;i++)
{
dis_buf[i]++;
if(dis_buf[i]==10) dis_buf[i]=0;
}
}
break;
}
case 0x01: //执行F1功能,与计算机串行通信,将显示缓冲区的数据发送给PC机
{
if(secd!=secl) //每1秒发送1个字节
{
secd=secl;
SBUF=secd; //发送0---F
}
break;
}
case 0x02: //执行F2功能,显示时间
{ dis_buf[0]=houh; dis_buf[1]=houl; dis_buf[2]=minh;
dis_buf[3]=minl; dis_buf[4]=sech; dis_buf[5]=secl;
operate=0xff;
break;
}
case 0x04: //执行F3功能,调整时间
{ ad_time++;
if(ad_time==7) ad_time=0;
operate=0xff;
break;
}
case 0x08: //执行F4功能,播放音乐
{ if(ad_time==0)
{
flag_t2=0; init_t2();
music();
flag_t2=1; init_t2();
operate=0x00;
}
else
{ ad_timer();
operate=0xff;
}
break;
}
case 0xff: break;
default: break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -