找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2230|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

剛轉(zhuǎn)單片機,用hc6800esv2.0做了一個軟件時鐘

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:300170 發(fā)表于 2018-7-6 03:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  #include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit a1=P2^2;
sbit a2=P2^3;
sbit a3=P2^4;//38譯碼管接口
sbit beep=P1^5;//蜂鳴器口
uchar num1,num2,num4,num5,num7,num8,tt,temp;
uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
212,212,106,126,159,169,190,119,119,126,159,142,159,0};//SONG_TONE 延時表決定了每個音符的頻率
uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
9,3,12,12,12,12,12,9,3,12,12,12,24,0}; //播放各個音符,SONG_LONG 為拍子長度

uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};

void delay(uint z) //延時函數(shù)
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void DelayMStime(uint x)//蜂鳴器音樂延時函數(shù)
{
uchar t;
while(x--) for(t=0;t<120;t++);
}
void timer0() interrupt 1 //中斷函數(shù)
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
}
void PlayMusic()//蜂鳴器音樂生日快樂
{
uint i=0,j,k;
while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
{ //播放各個音符,SONG_LONG 為拍子長度
    for(j=0;j<SONG_LONG[i]*20;j++)
{
    beep=~beep;
//SONG_TONE 延時表決定了每個音符的頻率
    for(k=0;k<SONG_TONE[i]/3;k++);
}
    DelayMStime(10);
    i++;
}
}
void keyscan()//鍵盤掃描函數(shù)
     {  
     P1=0xfe;//掃描第一行列值
   temp=P1;
  temp=temp&0xf0;
  while(temp!=0xf0)
  {
    delay(10);
  temp=P1;
   switch(temp)
   {
   case 0xee : PlayMusic();
               break;
   case 0xde : num1++;//第一位數(shù)碼管時間+1,后面類推
      if(num1==3)
      {num1=0;}
               break;
   case 0xbe : num2++;
               if(num1==2)
      {if(num2==4)
      {num2=0;}
      else if(num2==10)
      {num2=0;}}
               break;
   case 0x7e : num2--;
               if(num1==2)
      {if(num2==0)
      {num2=3;}
      else if(num2==0)
      {num2=9;}}
               break;
   }
   while(temp!=0xf0)//檢測按鍵是否按下
   { temp=P1;temp=temp&0xf0;}
  }
  P1=0xfd;//掃描第二行列值
   temp=P1;
  temp=temp&0xf0;
  while(temp!=0xf0)
  {
    delay(10);
   temp=P1;
   switch(temp)
   {
   case 0xed : num4++;
               if(num4==6)
      {num4=0;}
               break;
   case 0xdd : num4--;
               if(num4==0)
       {num4=5;}
               break;
   case 0xbd : num5++;
               if(num5==10)
        {num5=0;}
               break;
   case 0x7d : num5--;
               if(num5==0)
         {num5=9;}
               break;
   }
   while(temp!=0xf0)//檢測按鍵是否按下
   { temp=P1;temp=temp&0xf0;}
  }
  P1=0xfb;//掃描第三行列值
   temp=P1;
  temp=temp&0xf0;
  while(temp!=0xf0)
  {
    delay(10);
   temp=P1;
   switch(temp)
   {
   case 0xeb : num7++;
               if(num7==6)
      {num7=0;}
               break;
   case 0xdb : num7--;
               if(num7==0)
      {num7=5;}
               break;
   case 0xbb : num8++;
               if(num8==10)
      {num8=0;}
               break;
   case 0x7b : num8--;
               if(num8==0)
      {num8=9;}
               break;
   }
    while(temp!=0xf0)//檢測按鍵是否按下
   { temp=P1;temp=temp&0xf0;}
  }
     P1=0xf7;//掃描第四行列值
   temp=P1;
  temp=temp&0xf0;
  while(temp!=0xf0)
  {
    delay(10);
   temp=P1;
   switch(temp)
   {
   case 0xe7 : num2=0;
               break;
   case 0xd7 : num4=0;
               break;
   case 0xb7 : num5=0;
               break;
   case 0x77 : num7=0;num8=0;
               break;
   }
   while(temp!=0xf0) //檢測按鍵是否按下
   { temp=P1;temp=temp&0xf0;}  
   }
   }
void buzzer()//蜂鳴器12點響一下
  {
  if(num1==1)
  {
  if(num2==2)
  {
  if(num8==0)
  {
   beep=~beep;
   delay(3);
   }
   }
   }
  }
void timer()  //時鐘,38譯碼管軟件定時一位一位操作顯示效果比較好
{
a1=1;
a2=1;
a3=1;//第1位數(shù)碼管
if(num1==3)
{
num1=0;
}
keyscan();
P0=table[num1];
delay(3);
a1=0;
a2=1;
a3=1;//2
if(num1==2)
{
if(num2==4)
{
num1++;
num2=0;
  }
}
else if(num2==10)
{
num1++;
num2=0;
}
P0=table[num2];
delay(3);
a1=1;
a2=0;
a3=1;//3
P0=0x40;
delay(3);
a1=0;
a2=0;
a3=1;//4
if(num4==6)
{
num2++;
num4=0;
}
P0=table[num4];
delay(3);
a1=1;
a2=1;
a3=0;//5
if(num5==10)
{
num4++;
num5=0;
}
P0=table[num5];
delay(3);
a1=0;
a2=1;
a3=0;
P0=0x40;
delay(3);
a1=1;
a2=0;
a3=0;
if(num7==6)
{
num5++;
num7=0;
}
P0=table[num7]; //7
delay(3);
if(tt==20) //間隔正1秒
{
a1=0;
a2=0;
a3=0; //第8個數(shù)碼管
tt=0;
num8++;
  if(num8==10)
{
num7++;
num8=0;
}
P0=table[num8];
}
delay(3); //延時數(shù)字3最為穩(wěn)定
}
void main()
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//開總中斷
ET0=1;//開定時器中斷
TR0=1;//啟動定時器0
P0=0x3f;
while(1)
{
timer();
buzzer();
}
}


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:366041 發(fā)表于 2018-7-6 08:57 | 只看該作者
很棒,加油,樓主
回復(fù)

使用道具 舉報

板凳
ID:300170 發(fā)表于 2018-7-6 17:00 | 只看該作者
修改按鍵下的 (          num數(shù)字--;  if(num數(shù)字==-1)           )數(shù)碼管數(shù)字減就不會出現(xiàn)亂碼了
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表