×
单片机 > 单片机程序设计 > 详情

8位LED动态扫描时钟演示程序

发布时间:2020-06-19 发布时间:
|

//使用12MHz晶振,P0口输出段码,P2口作列扫描,用共阳LED数码管 
// 
#include "reg51.h" 
code char dis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff}; 
/* 共阳LED段码表     "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9" "不亮"     */                 
code char sCAN_con[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};   // 列扫描控制字 
data char disdata[6]={0x00,0x00,0x00,0x00,0x00,0x00};//计时单元数据初值,共6个 
data char dis[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00};//显示单元数据,共6个数据 
data char con1s=0x00,con04s=0x00,con=0X00; //1秒定时用 
sbit key0=0x90; 
sbit key1=0x91; 
sbit key2=0x92; 
// 
/****************/ 
//1毫秒延时程序// 
/***************/ 
delay1ms(int t) 

int i,j; 
for(i=0;i   for(j=0;j<120;j++) 
   ; 

/****************/ 
// 键扫描子程序 // 
/****************/ 
keyscan() 

 EA=0; 
if(key0==0) 
  { 
   delay1ms(10); 
   while(key0==0); 
    if(dis[con]==10) 
    {dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];} 
    con++;TR0=0;ET0=0;TR1=1;ET1=1; 
    if(con>=6) 
      {con=0;TR1=0;ET1=0;TR0=1;ET0=1;} 
  } 
// 
if(con!=0) 

 if(key1==0) 
   { 
    delay1ms(10); 
    while(key1==0); 
    disdata[con]++; 
     if(disdata[con]>=10) 
       {disdata[con]=0;} 
    dis[con]=disdata[con];dis[6]=0x0a; 
    } 

// 
if(con!=0) 

 if(key2==0) 
  { 
    delay1ms(10); 
    while(key2==0); 
       if(disdata[con]==0) 
          {disdata[con]=0x09;} 
        else {disdata[con]--;} 
    dis[con]=disdata[con];dis[6]=0x0a; 
  } 

EA=1; 

// 
/***********/ 
//扫描程序// 
/**********/ 
scan() 

char k; 
for(k=0;k<6;k++) 
 { 
  P0=dis_7[dis[k]];P2=scan_con[k];delay1ms(1);P2=0xff; 
  } 

/*************/ 
//初始化程序// 
/*************/ 
clearmen() 

int i; 
for(i=0;i<6;i++) 
  { 
   dis[i]=disdata[i];} 
TH0=0x3C;TL0=0xB0;//     ;50MS定时初值(T0计时用) 
TH1=0x3C;TL1=0xB0;//     ;50MS定时初值(T1计时用) 
TMOD=0X11;ET0=1;ET1=1;TR1=0;TR0=1;EA=1;// 

/**********/ 
//主程序// 
/*********/ 
main() 

clearmen(); 
while(1) 
 { 
   scan(); 
   keyscan(); 
  } 

/********************/ 
//1秒中断处理程序  // 
/*******************/ 
void time_intt0(void) interrupt 1  

ET0=0;TR0=0;TH0=0x3C;TL0=0xB0;TR0=1; 
con1s++; 
if(con1s==20) 
  { 
   con1s=0x00; 
   disdata[0]++; 
   if(disdata[0]>=10) 
    { 
    disdata[0]=0;disdata[1]++; 
      if(disdata[1]>=6) 
        { 
          disdata[1]=0;disdata[2]++; 
            if(disdata[2]>=10) 
              { 
                disdata[2]=0;disdata[3]++; 
                  if(disdata[3]>=6) 
                    { 
                     disdata[3]=0;disdata[4]++; 
                       if(disdata[4]>=10) 
                         { 
                          disdata[4]=0;disdata[5]++; 
                          }  
                           if(disdata[5]==2 ) 
                              { 
                             if(disdata[4]==4) 
                               { 
                                disdata[4]=0;disdata[5]=0; 
                               } 
                            } 
                    } 
              } 
         } 
    } 
dis[0]=disdata[0];dis[1]=disdata[1];dis[2]=disdata[2]; 
dis[3]=disdata[3];dis[4]=disdata[4];dis[5]=disdata[5]; 
  } 
 ET0=1; 

/********************/ 
//0.4秒闪烁中断程序  // 
/*******************/ 
void time_intt1(void) interrupt 3  

 EA=0;TR1=0;TH1=0x3C;TL1=0xB0;TR1=1; 
 con04s++; 
if(con04s==8) 
  { 
    con04s=0x00; 
    dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7]; 
   } 
 EA=1; 


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

关键字:8位LED  动态扫描  时钟 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计