第一篇:?jiǎn)纹瑱C(jī)音樂(lè)盒,1602液晶顯示歌曲名、歌手名、播放時(shí)間,播放時(shí)跑馬燈亮
單片機(jī)音樂(lè)盒,1602液晶顯示歌曲名、歌手名、播放時(shí)間,播放時(shí)跑
馬燈亮
2010-07-16 19:05:08| 分類(lèi): 單片機(jī) | 標(biāo)簽: |字號(hào)大中小 訂閱
/**P2.0口到三極管基極之間的限流電阻接1K左右的,要使用無(wú)緣的蜂鳴器或者照片中的小喇叭,用有源的蜂鳴器失真太大,單片機(jī)使用AT89S52**/
#include
#define LCD1602_DATA P0 //1602液晶數(shù)據(jù)口
#define lamp_data P3 //跑馬燈數(shù)據(jù)口 sbit LCD1602_RS=P2^7;//1602液晶寫(xiě)命令/數(shù)據(jù) sbit LCD1602_RW=P2^6;//1602液晶讀/寫(xiě)控制 sbit LCD1602_EN=P2^5;//1602液晶使能控制
sbit BeepIO = P2^0;//蜂鳴器 sbit esc=P1^2;//取消播放音樂(lè)
sbit up=P1^0;sbit down=P1^3;sbit play=P1^1;char number;//歌曲編號(hào) bit flag;//播放標(biāo)志
char t;
uchar ms50;//跑馬燈用 char count,sec,min;//歌曲時(shí)間顯示
char code song[][17]={ “1.Fairy Tale ”,“2.Love Transfer ”,“3.Girl With Wing”, “4.The Same Song ”,“5.Two Butterfly ”,“6.Coral Sea ”};char code singer[][12]={ “Guang liang”,“Chen yixun ”,“Rong zuer ”, “Liu chang ”,“Pang long ”,“Zhou jielun”};uchar code lamp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//以下為播放音樂(lè)的設(shè)置 #define SYSTEM_OSC 12000000 #define SOUND_SPACE 4/5 uint code FreTab[12] = { 262,277,294,311,330,349,369,392,415,440,466,494 };//原始頻率表
uchar code SignTab[7] = { 0,2,4,5,7,9,11 };//1~7在頻率表中的位置
uchar code LengthTab[7]= { 1,2,4,8,16,32,64 };uchar Sound_Temp_TH0,Sound_Temp_TL0;//音符定時(shí)器初值暫存
uchar Sound_Temp_TH1,Sound_Temp_TL1;//音長(zhǎng)定時(shí)器初值暫存
bit stop;/***********************延時(shí)函數(shù)(單位ms)**************************/
void delay(uint z)
{ uint x;uchar y;for(x=z;x>0;x--)for(y=112;y>0;y--);
} /*********************************************************** ******************LCD1602驅(qū)動(dòng)程序****************** ************************************************************/ /***********************************************************
忙檢測(cè)
************************************************************/
void LCD1602_check_busy()
{
LCD1602_DATA = 0xff;LCD1602_RS = 0;LCD1602_RW = 1;LCD1602_EN = 1;while(LCD1602_DATA & 0x80);
LCD1602_EN = 0;
} /**********************************************************
寫(xiě)指令
************************************************************/
void LCD1602_write_cmd(uchar cmd)
{
LCD1602_check_busy();LCD1602_RS = 0;LCD1602_RW = 0;LCD1602_DATA = cmd;LCD1602_EN = 1;
_nop_();LCD1602_EN = 0;
} /***********************************************************
寫(xiě)數(shù)據(jù)
*************************************************************/
void LCD1602_write_data(uchar dat)
{
LCD1602_check_busy();LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_DATA = dat;LCD1602_EN = 1;
_nop_();LCD1602_EN = 0;
}
/***********************************************************
1602初始化
************************************************************/
void LCD1602_init()
{ LCD1602_write_cmd(0x38);//8位數(shù)據(jù),雙列顯示,5*7字形 LCD1602_write_cmd(0x0c);//開(kāi)顯示,關(guān)光標(biāo),光標(biāo)不閃爍
LCD1602_write_cmd(0x01);//清屏
} /************************************************************
設(shè)置顯示坐標(biāo)
************************************************************/
void LCD1602_set_postion(uchar x , uchar y)
{ if(!y)
LCD1602_write_cmd(0x80+x);
else if(y)
LCD1602_write_cmd(0xc0+x);
} /************************************************************
指定位置寫(xiě)字符
*************************************************************/ void LCD1602_write_char(uchar x , uchar y , uchar chardata)
{
LCD1602_set_postion(x,y);LCD1602_write_data(chardata);
} /************************************************************
指定位置寫(xiě)字符串
*************************************************************/ void LCD1602_write_string(uchar x , uchar y , uchar *string)
{
LCD1602_set_postion(x,y);
while((*string)!= '