原创 LED 时钟

2009-4-16 21:13 1310 4 4 分类: MCU/ 嵌入式

#include <reg51.h>
#include <display6_s.h>


sbit k1 = P3^2;
sbit k2 = P3^3;
sbit k3 = P3^4;


unsigned char count;  //50ms计数
unsigned char second;  //1s计数
unsigned char minute;  //1m计数
unsigned char hour;   //1h计数
unsigned char time[6];  //时分秒


void delay1(unsigned int k)
 { unsigned int i,j;
  for(i=0;i<k;i++)
  for(j=0;j<100;j++);
 }


void Timer_init()                    
{
    TH0=(65536-50000)/256; //装初值
 TL0=(65536-50000)%256;
    TL0=0xb7;
 EA=1;     //开总中断
 ET0=1;     //开定时器0中断
    TR0=1;    //启动定时器0
}



/*--------------------------------------------------------------*/
//按键处理程序
void Keyscan()
{
 if(k1==0)
 {
  delay1(10);    //延时
  if(k1==0) 
   second=0; 
  while(k1==0);   //松手检测
  }
 if(k2==0)
  {
    delay1(10);   
    if(k2==0) 
    {
      minute++;  
   if(minute==60)
    minute=0; 
   while(k2==0);
  }
   }
 if(k3==0)
  { 
    delay1(10); 
    if(k3==0) 
    {
      hour++;
   if(hour==24) 
    hour=0; 
   while(k3==0);
  }
   }
}


void timer0() interrupt 1  //T0定时器中断服务
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
  count++;
  if(count==20)
  {
    count=0;
    second++;
    if(second==60)
    {
      second=0;
      minute++;
      if(minute==60)
      {
       minute=0;
       hour++;
       if(hour==24)
     hour=0;
      }
    }
 time[5]=second%10;
 time[4]=second/10+10;
 time[3]=minute%10+10;
 time[2]=minute/10+10;
 time[1]=hour%10+10;
 time[0]=hour/10;
   }
 }
?
void main()
{
  Timer_init();
  while(1)
  {
  Keyscan();
  display(time); 
  }
}


用的是CD4094,动态扫描方式


#ifndef _display_
#define _display_
#include <intrins.h>
sbit DATA="P3"^0;
sbit CLK="P3"^1;
unsigned char data display_bit;
unsigned char code
led[]={
0xbb,0x88,0x3d,0xad,0x8e,
0xa7,0xb7,0x89,0xbf,0xaf,//不带点
0xFB,0xC8,0x7D,0xED,0xCE,
0xE7,0xF7,0xC9,0xFF,0xEF};//带点


//延时程序
void delay(unsigned int k)
 { unsigned int i,j;
  for(i=0;i<k;i++)
  for(j=0;j<100;j++);
 }
//数据传输
void send(unsigned char a)
{
 unsigned char i;
 for(i=0;i<8;i++)
 {
  if(_crol_(a,i)&0x80)
  DATA=1;
  else
  DATA=0;
  CLK=0;
  CLK=1;
 }
}
//显示程序 6位LED数码管扫描
void display(unsigned char display_buffer[6])
{
 unsigned char i,k;
 display_bit=0x01;
 for(i=0;i<6;i++)
 {
  k=led[display_buffer];
  send(k);
  P1=display_bit;
  delay(0x01);
  P1=0;
  display_bit=_crol_(display_bit,1);
 }
 display_bit=0x01;

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /4 下一条