钰平电子 发表于 2023-7-10 09:54:19

STC89C52单片机控制8位共阳数码管扫码显示程序






/********************************************************

实现功能:八位数码管显示模块测试程序
使用芯片:STC89C52RC
晶振:11.0592MHZ
编译环境:Keil 5
【声明】此程序仅用于学习与参考!   

*********************************************************************/
#include<reg52.h>             //库文件
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int//宏定义无符号整型

#define DUAN P0          //P0口控制段
#define WEIP2          //P2口控制位
sbit k_shi=P1^0;// 更改小时按键
sbit k_fen=P1^1;// 更改分钟按键
sbit k_miao=P1^2;// 更改秒按键
/********************************************************************
                            初始定义
*********************************************************************/
code uchar seg7code={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF}; //显示段码 数码管字跟
uchar wei={0XFE,0XFD,0XFB,0XF7,0XEf,0XDf,0XBf,0X7f};                                 //位的控制端
uchar numb;       //定义字符串
uint miao=0,fen,shi;
/********************************************************************
                            延时函数
*********************************************************************/
void delay(uchar t)
{
uchar i,j;
   for(i=0;i<t;i++)
   {
          for(j=13;j>0;j--);
       { ;
       }
   }
}
/********************************************************************
                            求值函数
*********************************************************************/
void t_to_dis()
{
numb=shi/10;        //显示小时十位
numb=shi%10;        //显示小时个位
numb=10;                //显示横杠
numb=fen/10; //显示分十位
numb=fen%10;        //显示分个位
numb=10;                //显示横杠
numb=miao/10;//显示秒十位
numb=miao%10;//显示秒个位
}

/********************************************************************
                            显示函数
*********************************************************************/      
void display()//显示函数
{
/*****************数据转换*****************************/
      P2=0XFF;
          P0=seg7code];
          P2=wei;
          delay(80);
          P2=0XFF;
      P0=seg7code];
          P2=wei;
          delay(80);
          P2=0XFF;
             P0=seg7code];
          P2=wei;
          delay(80);
          P2=0XFF;
      P0=seg7code];
          P2=wei;
          delay(80);
          P2=0XFF;
          P0=seg7code];
          P2=wei;
          delay(80);
          P2=0XFF;
      P0=seg7code];
          P2=wei;
          delay(80);
          P2=0XFF;
             P0=seg7code];
          P2=wei;
          delay(80);
          P2=0XFF;
      P0=seg7code];
          P2=wei;
          delay(80);
          P2=0XFF;
}
/********************************************************************
                           按键函数
*********************************************************************/      
void key()//函数
{
if(k_shi==0){shi++;while(!k_shi);if(shi>=24)shi=0;}
if(k_fen==0){fen++;while(!k_fen);if(fen>=60)fen=0;}
if(k_miao==0){miao++;while(!k_miao);if(miao>=60)miao=0;}
}

/********************************************************************
                           定时器中断函数
*********************************************************************/
void timer1(void)interrupt 3
{
uchar i;
TH1=0X3c;//定时初值
TL1=0Xaf;//定时初值
i++;
if(i>=20)
   {i=0;
    miao++;//秒加1
   if(miao>=60)
       {miao=0;//秒清零
             fen++;//60秒后分加1
             if(fen>=60)
                {fen=0;//分清零
                   shi++;//60分后时加1
                   if(shi>=24)
                         shi=0;//时清零
                                                }
                                   }
                                  }
}
/********************************************************************
                           中断初始化
*********************************************************************/
void cshh()
{
TMOD=0X10;//定义定时器工作方式
TH1=0X3c;
TL1=0Xaf;
ET1=1;
TR1=1;//开定时器
EA=1;//开中断
}
/********************************************************************
                            延时函数
*********************************************************************/
void delay1()//延时程序
{
uchar m,n,s;
for(m=80;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
/********************************************************************
                            主函数
*********************************************************************/

main()
{
cshh();       //中断初始化
//0
P2=0X00;
P0=0xc0;
delay1();
//1
P2=0X00;
P0=0xf9;
delay1();
//2
P2=0X00;
P0=0xa4;
delay1();
//3
P2=0X00;
P0=0xb0;
delay1();
//4
P2=0X00;
P0=0x99;
delay1();
//5
P2=0X00;
P0=0x92;
delay1();
//6
P2=0X00;
P0=0x82;
delay1();
//7
P2=0X00;
P0=0xf8;
delay1();
//8
P2=0X00;
P0=0x80;
delay1();
//9
P2=0X00;
P0=0x90;
delay1();

P2=0XFE;
P0=0x00;
delay1();

P2=0XFD;
P0=0x00;
delay1();

P2=0XFB;
P0=0x00;
delay1();

P2=0XF7;
P0=0x00;
delay1();

P2=0XEF;
P0=0x00;
delay1();

P2=0XDF;
P0=0x00;
delay1();

P2=0XBF;
P0=0x00;
delay1();

P2=0X7F;
P0=0x00;
delay1();


while(1)
{
key();//按键函数
t_to_dis();//确定秒分时值
display();        //显示秒分时值
}
}
       
/********************************************************************
                              结束
*********************************************************************/


清风予我 发表于 2023-7-10 11:10:25

感谢分享{:4_225:}
页: [1]
查看完整版本: STC89C52单片机控制8位共阳数码管扫码显示程序