原创 第二十四课 51音乐之四 电子琴显示

2009-6-3 10:47 3607 6 6 分类: MCU/ 嵌入式

第二十四课  51音乐之四 电子琴显示


程序讲解:
/*--------------------------------------------------------------*/
#include <AT89X52.H>
#include "74HC595.H"      // 在 第九课 有详细讲解
#include "MIDI_1.H"         // 在 第二十一课 有详细讲解
#include "Key_Board.H"    // 在 第十九课 有详细讲解



/*--------------------------------------------------------------*/
//全局变量定义
unsigned char LED_Pos;   //位扫描
unsigned char LED_Seg[8] = {16,16,16,16,16,16,16,16}; //用于缓存数码管显示数据



/*--------------------------------------------------------------*/
//定时器初始化
void T0_init(void)                    
{
    TMOD |= 0x01;     //使用或| ,效果是只让定时器0现在工作在方式1,而不管其他定时器的状态!
    TH0  = 0xf8;         //2000us
    TL0  = 0x36;
    IE  |= 0x82;
    TR0  = 1;
}



/*--------------------------------------------------------------*/
//LED显示函数2
volatile void LED_Display2(void)
{
 Ser_IN(0x01 << LED_Pos);              //位选
 Ser_IN(seg[LED_Seg[LED_Pos]]);   //段码
 Par_OUT();                                       //上升沿锁存输出


 LED_Pos++;                                     //循环扫描
 if(LED_Pos == 8) LED_Pos = 0;
}



/*--------------------------------------------------------------*/
//定时器中断服务 数码管显示
void T0_intservice(void) interrupt 1
{
    TH0 = 0xf8;
    TL0 = 0x36;
     LED_Display2();  //调用显示函数
}



/*--------------------------------------------------------------*/
void main(void)
{
 unsigned char tone;


 timer1_INT();   //定时器1初始化 用于产生音乐
 T0_init();          //定时器0初始化 用于数码管显示
 while(1)
 {
  tone = key_scan();                     //扫描键值
  LED_Seg[tone&0x07] = tone;   //送到数码管显示缓存,以供显示
  if(key_INT)                               //key_INT按键按下标志,判断是否有按键按下
  {
   key_INT = 0;                           //清除按键标志
   TR1 = 1;                                  //音乐响起
   STH1 = (unsigned char)(tab_fre[tone] >> 8);
   STL1 = (unsigned char)(tab_fre[tone] & 0xff);
   P1 = ~tone;                              //送到LED显示
  }
  else
  {
   TR1 = 0;              //音乐关闭
   bp  = 1;                //关闭蜂鸣器
   P1  = 0xff;            //关LED
  }
 }
}



本节重点:
1、TMOD |= 0x01 的应用,使用该语句对TMOD以前的状态无影响
2、头文件的灵活调用!


演示视屏:
http://v.youku.com/v_show/id_XOTIzNjQ5NzI=.html
相关程序:https://static.assets-stash.eet-china.com/album/old-resources/2009/6/3/4b49ec80-1655-49e7-9f7d-7dd29ed2c8d0.rar


相关文章:


第九课 一个比较重要的驱动函数的讲解(74HC595):


http://group.ednchina.com/2031/25012.aspx


第十九课 按键之五 矩阵按键之查表扫描:


http://blog.ednchina.com/lmjxf/234199/message.aspx


第二十一课  51音乐之一 音阶测试:


http://blog.ednchina.com/lmjxf/234239/message.aspx



 

PARTNER CONTENT

文章评论0条评论)

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