我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 933|回复: 1

生日礼物

[复制链接]

该用户从未签到

28

主题

35

回帖

67

积分

二级逆天

积分
67

社区居民终身成就奖

QQ
发表于 2015-5-11 12:00:07 | 显示全部楼层 |阅读模式
#include<reg52.h>
#include<present.h>

sbit Buzz=P3^7;

uchar flag=16,sign=1;
uchar time=0;         //流水灯定时
uint *pf=Happy_Birthday;
uint *p=Happy_Birthday;

void init_devices(void)
{
    TMOD=0x11;
    TH1=0x71;
    TL1=0x48;    //40ms的定时
    TH0=0x00;
    TL0=0x00;    //初始化
    IT1=1;
    EA=1;
    EX1=1;
    ET0=1;
    ET1=1;
}

void int1() interrupt 2 using 0
{
    sign++;    //下一曲
    switch(sign)
    {    case 1:TR0=1;pf=Happy_Birthday;flag=16;break;
        case 2:pf=Legend;flag=8;break;
        case 3:pf=Childhood;flag=8;break;
        case 4:TR0=0;sign=0;Buzz=1;break;//停唱Buzz=1,三极管关断,防止大电流
        default :pf=Happy_Birthday;flag=16;break;
    }
    p=pf;
}

//定时器0产生频率
void timer0() interrupt 1 using 1
{
    uint temp=65536-*p;
    TH0=(uchar)(temp>>8);
    TL0=(uchar)temp;
    if(*p) Buzz^=1;
    else Buzz=1;    //Buzz=1,三极管关断,防止大电流

}

//定时器1产生40ms延时
void timer1() interrupt 3 using 2
{
    TH1=0x71;
    TL1=0x48;    //40ms的定时

    if(flag==0)
    {
        flag=*(p+1);
        if(flag==0)
        {
            p=pf;
            flag=*(p+1);
        }
        else
        {    p++;
            p++;
        }
    }
    else flag--;
    time++;        //流水灯定时
    if(time%5==0)
    {  switch(time)
       {case 50=0x01;break;
        case 100=0x02;break;
          case 150=0x04;break;
        case 200=0x08;break;
        case 250=0x10;break;
          case 300=0x20;break;
        case 350=0x40;break;
        case 400=0x80;time=0;break;
        default :time=0;break;
       }
    }
}

void delay(uint i)
{
    while(i--);
}
void word(uchar *ps)     //显示单个字符
{    uchar i,j;
    uchar _bit=0X80;
    for(i=0;i<200;i++)
    {
        for(j=0;j<8;j++)
        {  P1=0xff;
           P2=~_bit;
           P1=*(ps+j);
           delay(100);
           _bit>>=1;
        }
        _bit=0X80;
    }
}
void display(uchar *ps)     //显示移动字符
{    uchar i,j;
    uchar _bit=0X80;
    while(*(ps+8)!=0xaa)
    {
        for(i=0;i<20;i++)
        {
                for(j=0;j<8;j++)
                {  P1=0xff;
                   P2=~_bit;
                   P1=*(ps+j);
                   delay(100);
                   _bit>>=1;
                }
            _bit=0x80;
        }
        ps++;
    }
}

void main()
{    uchar i;
    init_devices();
    for(i=0;i<6;i++) word(figure);
    word(arrow);
    word(arrow);
    TR0=1;
    TR1=1;
    while(1)
    {
        display(str1);
        display(str1);
        display(str2);
    }
}
回复

使用道具 举报

该用户从未签到

10

主题

295

回帖

308

积分

二级逆天

积分
308

社区居民终身成就奖

QQ
发表于 2015-5-11 12:14:13 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

论坛开启做任务可以
额外奖励金币快速赚
积分升级了


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

平平安安
TOP
快速回复 返回顶部 返回列表