第二十四课 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
文章评论(0条评论)
登录后参与讨论