標題: 基于單片機的電子賀卡設計報告與仿真及源碼資料下載 [打印本頁]

作者: for張妍    時間: 2018-7-9 16:24
標題: 基于單片機的電子賀卡設計報告與仿真及源碼資料下載
題目:基于單片機的電子賀卡設計
內(nèi)容:
1、設計基于單片機的伴奏樂曲(30分)
2、設計基于單片機的彩屏圖片(30分)
3、通過矩陣鍵盤按鍵顯示不同彩屏圖片,并伴有不同樂曲(30分)
4、創(chuàng)新部分(自主設計)(10分)
要求:
1、根據(jù)設計內(nèi)容,設計系統(tǒng)硬件結(jié)構(gòu),畫出系統(tǒng)流程圖。
2、應用Keil、Proteus軟件開發(fā)應用系統(tǒng)并仿真調(diào)試。


文件包含程序代碼、proteus仿真以及報告

目錄
1.概論
2.需求分析
3.系統(tǒng)硬件設計
3.1 硬件仿真圖
3.2 鍵盤控制
3.3 發(fā)聲裝置
3.4 顯示裝置
4.主要程序設計
4.1 程序設計思想
4.1.1 音調(diào)脈沖的產(chǎn)生
4.1.2音樂節(jié)拍的產(chǎn)生
4.1.3 音符碼表的編制
4.1.4 主要程序
4.2 主程序框圖
5.心得體會

1. 概論

科技日新月異,許許多多的電子產(chǎn)品走進千家萬戶。而眾多電子產(chǎn)品絕大多數(shù)是基于單片機的,在單片機軟件驅(qū)動I/O上掛載設備,于是有各種各樣功能的電子產(chǎn)品。伴隨著科技的快速進步和社會的發(fā)展,單片機技術(shù)的應用已經(jīng)進入到我們的生活、工作等很多領(lǐng)域,這已經(jīng)成為了一種非常成熟的電子技術(shù)。本系統(tǒng)是以單片機為核心元件,實現(xiàn)了基于單片機的伴奏樂曲、基于單片機的彩屏圖片并通過矩陣鍵盤按鍵顯示不同彩屏圖片并伴有不同樂曲的諸多功能的電子賀卡。通過單片機、AMPIRE128*64圖形液晶顯示屏、蜂鳴器以及按鍵幾個元件的協(xié)調(diào)合作,完成了一個簡單音樂播放器的基本功能。

2.需求分析

目前市場上有很多種音樂芯片或音樂模塊,可以直接產(chǎn)生各種曲子。但是這種模塊價格比較貴,性價比不高。對于一些僅需要產(chǎn)生簡單的音符或簡短曲子的場合,例如智能玩具、電子賀卡等,可以使用單片機配合簡單的蜂鳴器就能產(chǎn)生需要的音樂效果,這種方法充分發(fā)揮了單片機的優(yōu)勢。單片機滲透到我們生活的各個領(lǐng)域,幾乎很難找到哪個領(lǐng)域沒有單片機的蹤跡。因此,單片機的學習、開發(fā)與應用將造就一批計算機應用與智能化控制的科學家、工程師。利用單片機實現(xiàn)音樂播放有很多要點,例如外部電路簡單,控制方便等,因而備受廣大單片機愛好者的喜愛。通過音樂發(fā)聲器的設計方案,掌握C語言的編程方法。并熟練的運用AT89C52單片機定時器產(chǎn)生固定頻率的方波信號,推動喇叭發(fā)出旋律,按下單鍵可以演奏預先設置的歌曲旋律,最重要的是自己還可以通過程序設計輸入自己喜歡的歌曲來演奏。

3.系統(tǒng)硬件設計3.1 硬件仿真圖
              單片機為核心元件,P1口低四位作為矩陣鍵盤的控制引腳,通過按鍵控制進行相應曲目切換與停止。單片機內(nèi)部的定時器/計數(shù)器使P2.7輸出一系列不同頻率的脈沖控制音調(diào)的變化,蜂鳴器連接P2.7實現(xiàn)發(fā)聲。P3口連接AMPIRE128*64的數(shù)據(jù)輸入輸出引腳。每當進行曲目切換時便執(zhí)行相應顯示函數(shù)使屏幕顯示圖片。如圖3.1,
圖3.1
3.2 鍵盤控制

本設計采用2*2矩陣鍵盤控制相應曲目播放,每個按鍵進行實時掃描以檢測是否有按鍵按下。三個按鍵控制曲目切換,一個按鍵控制停止曲目播放。如圖3.2,

圖3.2
3.3 發(fā)聲裝置

通過單片機定時器/計數(shù)器使P2.7輸出一系列不同頻率的脈沖控制音調(diào)高低與延時函數(shù)控制節(jié)拍,使用蜂鳴器放出樂曲。如圖3.3,

圖3.3
3.4 顯示裝置

通過AMPIRE128*64顯示對應曲目圖片,液晶模塊顯示漢字方法:使用圖形液晶模塊以點陣形式來顯示漢字和圖形,每8個點組成1個字節(jié),每個點用一個二進制位表示,存1的點顯示時在屏上顯示一個亮點,存0的點則在屏上不顯示,在液晶屏上豎向8個點為1個字節(jié)數(shù)據(jù),通過字模提取軟件按照先左后右,先上后下倒序的方式對漢字進行字模提取。如圖3.4,

圖3.4
4.主要程序設計4.1 程序設計思想4.1.1 音調(diào)脈沖的產(chǎn)生

要讓單片機產(chǎn)生音頻脈沖,只要計算出某一音頻的周期,將此周期除以2得到半周期,利用定時器對此半周期進行定時,每當定時時間到時,就將P2.7引腳上的電平取反,從而得到所需要的音頻脈沖。

4.1.2音樂節(jié)拍的產(chǎn)生

可以通過延時程序來產(chǎn)生不同的節(jié)拍。如果1拍為0.4秒,則1/4為0.1秒,只要設定延時時間就可以求得節(jié)拍時間。例如一段延時程序Delay為1/4拍,則一拍只要調(diào)用4次Delay程序,依此類推。

4.1.3 音符碼表的編制

編寫一段音樂音符碼表時,先把樂譜的音符找出,建立對應的音調(diào)碼及定時器初值表,建立節(jié)拍碼表。每個音符使用1個字節(jié),字節(jié)的高4位存放音符的音調(diào)碼,低4位存放音符的節(jié)拍碼。音符對應的音調(diào)碼表和定時器初值表(fosc=12MHz)。

C語言將音調(diào)碼表和定時器初值表表示出來即為: uchar code TABLE[ ]={   //音符對應的定時器初值表  

0xfb,0x04,0xfb,0x90,0xfc,0x09,0xfc,0x44,0xfc,0xac,0xfd,0x09,0xfd,0x34,0xfd,0x82,0xfd,0xc8,0xfe,0x06,0xfe,0x22,0xfe,0x56,0xfe,0x85,0xfe,0x9a,0xfe,0xc1};

音符碼表為: uchar code GRACE[ ]={   //《奇異恩典》音符碼表

0x14,0x48,0x62,0x42,0x68,0x54,0x48,0x24,0x18,0x14,0x48,0x62,0x42,0x68,0x54,0x8c,0x64,0x86,0x62,0x82,0x62,0x48,0x14,0x26,0x42,0x42,0x22,0x18,0x14,0x48,0x62,0x42,0x68,0x54,0x4c,0x48,0x00};

uchar code JOY[]={     //《歡樂頌》音符碼表0x64,0x64,0x74,0x84,0x84,0x74,0x64,0x54,0x44,0x44,0x54,0x64,0x66,0x52,0x58,0x64,0x64,0x74,0x84,0x84,0x74,0x64,0x54,0x44,0x44,0x54,0x64,0x56,0x42,0x48,0x54,0x54,0x64,0x44,0x54,0x62,0x72,0x64,0x44,0x54,0x62,0x72,0x64,0x54,0x44,0x54,0x18,0x64,0x64,0x74,0x84,0x84,0x74,0x64,0x54,0x44,0x44,0x54,0x64,0x56, 0x42,0x48,0x00};

uchar code HAPPY[]={   //《生日快樂》音符碼表

0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04,0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94,0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04,0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94,0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,0x00};

4.1.4 主要程序
  1. void Key_Scan()
  2.                                {   
  3.                                                            uchar i,temp1;            
  4.                                                                       P1=0xfb;
  5.                                                                       for(i=0;i<=1;i++)
  6.                                                                       {
  7.                                                                                     if(L1==0)
  8.                                                                                     {
  9.                                                                                                   if(i==0)
  10.                                                                                                                 key=a[ i];
  11.                                                                                                   else
  12.                                                                                                                 key=a[i+1];
  13.                                                                                                                
  14.                                                                                     }
  15.                                                                                     if(L2==0)
  16.                                                                                     {  
  17.                                                                                                   if(i==0)
  18.                                                                                                                 key=a[i+1];
  19.                                                                                                   else
  20.                                                                                                                 key=a[i+2];
  21.                                                                                     }
  22.                                                       
  23.                                                                                     delay_10ms();
  24.                                                                                     temp1=P1;
  25.                                                                                     temp1=temp1|0x03;
  26.                                                                                     temp1=temp1<<1;
  27.                                                                                     temp1=temp1|0x03;
  28.                                                                                     P1=temp1;
  29.                                                         }
  30.                                }  
復制代碼


while(*(p[key]+k)!=0) //判斷取得的音符碼是否為結(jié)束碼  

              {   

                            beat=*(p[key]+k)&0x0f; //取節(jié)拍碼   

                            m=_crol_(*(p[key]+k),4)&0x0f; //取音調(diào)碼   

                            if(beat!=0)

                               {   //判斷取得的音調(diào)碼是否為0, 若不是,根據(jù)取得的音調(diào)碼計算T0初值     

                                          m1=--m*2+1;   

                                          m=m*2;   

                                          tl=TL0=TABLE[m1];   

                                          th=TH0=TABLE[m];   

                                                                                                               

                            }   

                            else

                            {       //取得的節(jié)拍碼為0,則停止T0     

                                          TR0=0;

                            }   

                            Delay(beat);   

                            k++;

                            Key_Scan();

                            delay_10ms();

                            if(temp!=key)break;                                                      

              }

                            TR0=0;

                            k=0;

                break;

//忙檢查

void check_busy()

{

uchar a=0;

for(a=0;a<200;a++);                  //此處為延時,一段時間后確保處于空閑狀態(tài)

                                     //此處為狀態(tài)查詢,查詢忙狀態(tài),沒有使用成功,以后再調(diào)試

RW=1;

RS=0;                                

E=1;

while(1)

{

     E=1;

     if(!(P0&0x80))

        break;

                  a++;

     if(a>10)

                              break;

               

}

E=1;}

//寫命令函數(shù)

void write_cmd(uchar inst)

{

check_busy();

RS=0;

RW=0;

E=1;

P3=inst;

E=0;

_nop_();}

//寫數(shù)據(jù)函數(shù)

void write_data(uchar dat)

{check_busy();

RS=1;RW=0;E=1;P3=dat;

E=0;_nop_();}

//初始化函數(shù)

void LCD_Init()

{write_cmd(0x30);//30H--基本指令操作?

delayus(4);

write_cmd(0x0c);//開顯示,關(guān)光標,不閃爍。

delayus(10);

write_cmd(0x01);//清除顯示

delayus(10);

write_cmd(0x06);//光標的移動方向左,DDRAM的地址計數(shù)器(AC)加1。

delayus(10);

}

//設置顯示坐標

void set_xy(uchar x,uchar y)           //x為行,y為列

{

if(y>=64)                            //列地址大于等于64時右屏顯示?

{CS2=0;                          //低電平選擇              CS1=1;                            //寫右屏是左屏關(guān)閉,不然兩邊會同時顯示            

y=y-64;}else                                 //列地址小于64時左屏顯示

{CS1=0;CS2=1

}write_cmd(0x40|y);                      //寫列地址

_nop_();write_cmd(0xb8|x); }

//顯示函數(shù)

void disp_hz(uchar *p)

{uchar i;

for(i=0;i<128;i++)

{set_xy(0,i);write_data(p[ i]);         

[ i]set_xy(1,i);write_data(p[i+128]);

set_xy(2,i);write_data(p[i+256]);

set_xy(3,i);write_data(p[i+384]);

set_xy(4,i);write_data(p[i+512]);

set_xy(5,i);write_data(p[i+640]);

set_xy(6,i);write_data(p[i+768]);

set_xy(7,i);write_data(p[i+896]);

set_xy(8,i);write_data(p[i+1024]);

}}



5.心得體會

此次設計的不足之處在于鍵盤按鍵個數(shù)較少,可控制的功能比較簡單;顯示圖片由于需要自己設計、繪畫,加之本人繪畫能力水品低,致使顯示圖片并不美觀;由于時間原因,并不能設置更多曲目,所以只編制了三首曲目。希望在以后的學習中不斷改進此設計。具體實施計劃:將每個按鍵控制單獨曲目改為“上一曲”或者“下一曲”以便解決多曲目存取與播放;設置“快進”與“減慢”對于曲目的播放速度進行控制;將彩屏上的圖片設置為動態(tài);設置相應按鍵控制播放聲音的大小。

本次課設可以說是我經(jīng)歷過最有意義的一次。由于整學期對于《單片機與接口技術(shù)》的學習只是停留在了課本上,當拿到課設題目時,可以說一點思路都沒有。通過上網(wǎng)查詢,我了解到了有關(guān)播放曲目的一些知識。但對于整個課設來說,這只是小部分。我花了不到兩天的時間終于構(gòu)思出了通過矩陣鍵盤控制曲目播放。我對于AMPIRE128*64的了解一片空白。通過網(wǎng)上查詢與看相關(guān)源程序。我了解了它顯示的基本原理。通過思考設計了滿足要求的程序。調(diào)試加修改的過程中我又完成了AMPIRE128*64圖片的顯示。經(jīng)過最后的整合,兩者合二為一。我完成了本次課設,成就感與喜悅并存。

學習知識就是為了運用,我學了這么多年的知識,但卻很少真正能夠憑借自己力量做出一件屬于自己的東西。這次課設為我的理論與實踐相結(jié)合打下了堅實的基礎,為自己樹立了信心以及以后的實踐積攢了經(jīng)驗。


單片機源程序如下:

  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int  
  5. sbit SPEAK=P2^7;  //定義蜂鳴器輸出端口
  6. sbit CS1=P2^4;            
  7. sbit CS2=P2^3;            
  8. sbit RS=P2^2;            
  9. sbit RW=P2^1;            
  10. sbit E=P2^0;
  11. sbit L1=P1^0;
  12. sbit L2=P1^1;

  13. uchar code HZ0[]={

  14. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  15. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,
  16. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  17. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  18. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x60,0xE0,
  19. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  20. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  21. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  22. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  23. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xFF,0x00,0x00,0x00,0x00,0x00,
  24. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
  25. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  26. 0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x30,0x18,0x0C,0x06,0x03,0x01,0x00,0x00,0xFF,
  27. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  28. 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,
  29. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  30. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  31. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0D,0x0C,0x07,0x00,0x00,0x00,0x00,0x00,
  32. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x21,0x62,0x9C,0x00,0x00,0x00,
  33. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  34. 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x60,0xF0,0xF0,0xFF,
  35. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  36. 0x00,0x00,0x00,0x00,0x00,0x3F,0x63,0xC1,0x81,0x00,0x00,0x00,0x00,0x01,0x0B,0x1E,
  37. 0x1C,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  38. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  39. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  40. 0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xE0,0xFF,0x00,0x08,0x04,0x02,0x01,0x00,0x00,
  41. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  42. 0x00,0x00,0x00,0x30,0x78,0x78,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  43. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  44. 0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x01,0x03,0x02,0x06,0x0C,0x38,0xF0,0x00,
  45. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  46. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
  47. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x40,0x40,
  48. 0x40,0x40,0x40,0x40,0x40,0x40,0x41,0x41,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  49. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  50. 0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xE0,
  51. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  52. 0x00,0x00,0x00,0x03,0x07,0x07,0xE7,0x04,0x04,0x04,0x04,0x04,0x06,0x07,0xE3,0x00,
  53. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  54. 0x00,0x00,0x00,0x00,0x00,0x04,0x84,0x44,0x24,0x1F,0x24,0x44,0x84,0x04,0x04,0x00,
  55. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x08,0x08,
  56. 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  57. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  58. 0x7F,0x44,0x64,0x64,0x64,0x54,0x4C,0x47,0x4C,0x54,0x64,0x64,0x64,0x64,0x64,0x7F,
  59. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  60. 0x00,0x00,0xFE,0x42,0x42,0x42,0xFF,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFF,0x42,
  61. 0x42,0x42,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  62. 0x00,0x00,0x00,0x04,0x02,0xF3,0x92,0x92,0xF2,0x02,0xFE,0x02,0x02,0x03,0x02,0x04,
  63. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x41,0x41,0xFF,
  64. 0x41,0x41,0x41,0x41,0xFF,0x41,0x41,0x41,0x41,0x40,0x40,0x40,0x00,0x00,0x00,0x00,
  65. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x10,0x0C,
  66. 0x70,0xC0,0x80,0x00,0x00,0x00,0x30,0x40,0x40,0x00,0x00,0x10,0x20,0x40,0x80,0x80,
  67. 0x00,0x00,0x08,0x10,0x20,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,
  68. 0x04,0x04,0x87,0x44,0x24,0x04,0x07,0x04,0x04,0x04,0x04,0x04,0x04,0x24,0x47,0x84,
  69. 0x04,0x04,0x07,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  70. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x08,0x0F,0x00,0x00,0x00,0x00,0x00,
  71. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x20,0x10,0x0F,
  72. 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  73. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  74. 0x00,0x00,0x01,0x01,0x01,0x02,0x02,0x02,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
  75. 0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
  76. 0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  77. 0x01,0x02,0x04,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  78. };


  79. uchar code HZ1[]=
  80. {
  81. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  82. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  83. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x80,
  84. 0x00,0x04,0x88,0xD0,0xE0,0x60,0x30,0x31,0x12,0x1C,0x18,0x08,0x08,0x0F,0x18,0x18,
  85. 0x18,0x30,0x34,0x22,0xE0,0xC0,0xA0,0x10,0x00,0x80,0x40,0x00,0x00,0x00,0x00,0x00,
  86. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  87. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  88. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  89. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  90. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  91. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x10,0x20,0x40,0x40,0xE0,
  92. 0x79,0x0F,0x03,0x01,0x30,0x08,0x0C,0x02,0x02,0x02,0x0C,0x10,0x00,0x00,0x1C,0x02,
  93. 0x01,0x01,0x02,0x8C,0x10,0x01,0x03,0x1F,0xFD,0xF0,0x48,0x44,0x42,0x41,0x81,0x00,
  94. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  95. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  96. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  97. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  98. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  99. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x04,0x08,0x08,0x08,0x08,0x8B,
  100. 0x5F,0x38,0xF0,0xC0,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x20,0x20,0x20,0x20,0x10,
  101. 0x08,0x04,0x03,0x00,0x00,0x80,0xC0,0x70,0x3F,0x6D,0x82,0x04,0x08,0x10,0x20,0x01,
  102. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  103. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  104. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  105. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  106. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  107. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x41,0x00,
  108. 0x40,0x20,0x10,0x0B,0x07,0x06,0x0E,0x0C,0x88,0x5C,0x38,0x18,0x08,0x08,0x0C,0x8C,
  109. 0x4C,0x24,0x1E,0x06,0x03,0x01,0x03,0x04,0x18,0x20,0x00,0x01,0x02,0x00,0x00,0x00,
  110. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  111. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  112. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  113. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  114. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  115. 0x00,0x80,0xC0,0xF0,0xF8,0x3E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  116. 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x81,0x80,0xC0,0xE0,0xE0,0xE0,0xE0,0x70,0x70,
  117. 0x70,0x38,0x38,0x38,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  118. 0xC0,0xE0,0xF8,0xF8,0xF0,0xF0,0xE0,0xC0,0x80,0x00,0x20,0xC0,0xE0,0xE0,0xE0,0x60,
  119. 0xE0,0xE0,0x60,0x60,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  120. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  121. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  122. 0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xE0,0xF0,0xF8,0x7C,0x7C,0x3E,0xDF,0xFF,0xFD,
  123. 0x20,0x1F,0x1F,0x1F,0xEF,0xEE,0x0E,0x0E,0xCF,0xFF,0x7F,0x3F,0x1F,0x0F,0x00,0x00,
  124. 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0xFF,0xFF,0xFF,0x00,0x00,0x80,0xF8,0xF8,
  125. 0xFC,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xF0,0xFC,0xFF,
  126. 0x0F,0x83,0xC1,0xE0,0xE0,0xE3,0x07,0x0F,0x0F,0x1F,0x1E,0xF0,0xF0,0x78,0x3C,0x3F,
  127. 0x3F,0x31,0x70,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  128. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  129. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  130. 0x00,0x00,0x00,0x00,0x00,0xE0,0xF0,0xF0,0x7E,0x3F,0x1F,0x0F,0x1F,0x3F,0xB9,0xF9,
  131. 0xF0,0xC0,0xF0,0x7C,0x3F,0x07,0x12,0x11,0x30,0x70,0xE0,0xE0,0xC0,0xC0,0x00,0x00,
  132. 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xC8,0xEF,0x03,0x0F,0x0E,0x0E,0x0F,0xFF,0xFF,
  133. 0xFF,0x0F,0x0E,0xCE,0xCE,0x8E,0x8F,0x0E,0x0C,0x00,0x00,0x00,0x03,0xC3,0xF0,0xFC,
  134. 0xDF,0xDF,0xCB,0xE1,0xF0,0xFE,0x7E,0xFE,0xFC,0xE0,0x00,0x7F,0x7F,0xE2,0xFC,0x3E,
  135. 0xCE,0xC0,0x80,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  136. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  137. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  138. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,
  139. 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x00,
  140. 0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x03,0x01,0x00,0x00,0x01,0x03,0x07,0x0F,0x0F,
  141. 0x07,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x0E,0x06,0x00,0x00,0x00,0x03,0x07,0x07,
  142. 0x07,0x03,0x03,0x01,0x01,0x00,0x00,0x01,0x09,0x0C,0x06,0x07,0x03,0x03,0x00,0x00,
  143. 0x00,0x01,0x03,0x0F,0x0F,0x0E,0x0E,0x0C,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  144. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  145. };


  146. uchar code HZ2[]=
  147. {
  148. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  149. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  150. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
  151. 0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x60,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  152. 0x00,0x00,0x00,0x80,0x40,0x20,0x50,0xE8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  153. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  154. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  155. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  156. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  157. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  158. 0x00,0x00,0x00,0x00,0x00,0xFC,0x02,0x01,0x01,0x0A,0x34,0x30,0x80,0x00,0x00,0x00,
  159. 0x00,0x00,0x00,0x00,0x3E,0xE3,0x00,0x03,0x07,0x18,0x28,0xB0,0xA0,0xC0,0x00,0x00,
  160. 0x00,0x00,0x3F,0x40,0x80,0x80,0x81,0x82,0x83,0x7C,0x78,0x00,0x00,0x00,0x00,0x00,
  161. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  162. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  163. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  164. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  165. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  166. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0x01,0x01,0x81,0x80,0x80,0x40,
  167. 0x40,0x00,0x40,0xC0,0x80,0x80,0x80,0x81,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,
  168. 0x80,0x80,0x80,0x80,0x80,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  169. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  170. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  171. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  172. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  173. 0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0xC0,0xC0,0x00,0xE0,0xE0,0xE0,0xF0,0xF0,
  174. 0xF0,0xF0,0xF0,0xF0,0xF0,0xF8,0xF8,0xFC,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFF,0xFE,
  175. 0xFF,0xFE,0xFE,0xFF,0xFE,0xFF,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  176. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFC,0xFA,0xFC,0xFC,0xF8,0xFC,
  177. 0xF8,0xF8,0xF0,0x70,0x60,0xE0,0xF0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  178. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  179. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  180. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xF0,0xF8,0xFC,
  181. 0xFC,0xFC,0x7C,0x3E,0x3F,0x1F,0x3F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,
  182. 0x03,0x03,0x03,0x0F,0x1F,0x1F,0x3F,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x2F,
  183. 0x03,0x01,0x00,0x00,0x00,0x01,0x03,0x0F,0x1F,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,
  184. 0x07,0x07,0x03,0x01,0x00,0x00,0x07,0x07,0x07,0x0F,0x3F,0x3F,0x7F,0xFF,0x7F,0x3F,
  185. 0x0F,0x07,0x00,0x00,0x00,0x01,0x01,0x03,0x07,0x0F,0x0E,0x1C,0x38,0x38,0xF0,0xF0,
  186. 0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  187. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  188. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF8,0xFC,0xFF,0xFF,0x7F,0x0F,0x07,0x01,
  189. 0x00,0x00,0x00,0xC0,0x00,0x00,0xF0,0x00,0x01,0x01,0x03,0x03,0x03,0x01,0x00,0x00,
  190. 0x00,0x00,0x00,0x00,0xC0,0x40,0x40,0x40,0x40,0x40,0xC1,0x01,0x01,0x00,0x00,0x00,
  191. 0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x40,0x41,0xF9,0x41,0xC0,0x00,
  192. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x40,0x20,0x10,0xD0,
  193. 0x10,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  194. 0x03,0xFF,0xFF,0xFE,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  195. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  196. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xE1,0x00,0x00,0x00,0x00,0x00,
  197. 0x04,0x02,0x01,0x09,0x09,0x09,0xFF,0x09,0x09,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
  198. 0x00,0x00,0x00,0x00,0x7F,0x44,0x44,0x44,0x44,0x40,0x7F,0x00,0x00,0x00,0x00,0x00,
  199. 0x00,0x00,0x00,0x01,0x01,0x01,0xFF,0x01,0x02,0x0C,0x84,0x64,0x1F,0x14,0x67,0x84,
  200. 0x84,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x47,0x24,0x94,0x04,0xFF,
  201. 0x04,0x14,0x24,0x44,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,
  202. 0xF0,0xFF,0x5F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  203. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  204. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x0F,0x1F,0x3C,0x78,0x78,0xF0,
  205. 0x90,0x11,0x21,0x21,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,
  206. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  207. 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
  208. 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,
  209. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x50,0x10,0x5C,0x1E,0x5F,0x1F,0x1F,
  210. 0x1F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  211. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  212. };



  213. void delayus(uchar delay)
  214. {
  215. uchar i;
  216. for(i=0;i<=delay;i++)
  217. _nop_();
  218. }

  219. void check_busy()
  220. {
  221. uchar a=0;
  222. for(a=0;a<200;a++);                  //此處為延時,一段時間后確保處于空閑狀態(tài)
  223.                                       //此處為狀態(tài)查詢,查詢忙狀態(tài),沒有使用成功,以后再調(diào)試
  224. /*RW=1;
  225. RS=0;                                 
  226. E=1;
  227. while(1)
  228. {
  229.      E=1;
  230.      if(!(P0&0x80))
  231.         break;
  232.             a++;
  233.      if(a>10)
  234.                   break;
  235.             
  236. }        
  237. E=1;*/

  238. }      


  239. void write_cmd(uchar inst)
  240. {
  241. check_busy();
  242. RS=0;
  243. RW=0;
  244. E=1;
  245. P3=inst;
  246. E=0;
  247. _nop_();
  248. }



  249. void write_data(uchar dat)
  250. {
  251. check_busy();
  252. RS=1;
  253. RW=0;
  254. E=1;
  255. P3=dat;
  256. E=0;
  257. _nop_();
  258. }



  259. void LCD_Init()
  260. {
  261. write_cmd(0x30);//30H--基本指令操作?
  262. delayus(4);
  263. write_cmd(0x0c);//開顯示,關(guān)光標,不閃爍。
  264. delayus(10);
  265. write_cmd(0x01);//清除顯示
  266. delayus(10);
  267. write_cmd(0x06);//光標的移動方向左,DDRAM的地址計數(shù)器(AC)加1。
  268. delayus(10);
  269. }



  270. void set_xy(uchar x,uchar y)           //x為行,y為列
  271. {
  272. if(y>=64)                            //列地址大于等于64時右屏顯示?
  273. {
  274.    CS2=0;                          //低電平選擇
  275.         CS1=1;                            //寫右屏是左屏關(guān)閉,不然兩邊會同時顯示
  276.         y=y-64;
  277. }
  278. else                                 //列地址小于64時左屏顯示
  279. {
  280.    CS1=0;                             //同上
  281.         CS2=1;
  282. }
  283. write_cmd(0x40|y);                      //寫列地址
  284. _nop_();
  285. write_cmd(0xb8|x);                         //寫行地址?
  286. }

  287. //顯示函數(shù)
  288. void disp_hz(uchar *p)
  289. {
  290. uchar i;
  291. for(i=0;i<128;i++)
  292. {
  293. set_xy(0,i);           
  294. write_data(p[i]);         
  295. set_xy(1,i);        
  296. write_data(p[i+128]);
  297. set_xy(2,i);      
  298. write_data(p[i+256]);

  299. set_xy(3,i);      
  300. write_data(p[i+384]);

  301. set_xy(4,i);        
  302. write_data(p[i+512]);

  303. set_xy(5,i);        
  304. write_data(p[i+640]);

  305. set_xy(6,i);      
  306. write_data(p[i+768]);

  307. set_xy(7,i);        
  308. write_data(p[i+896]);

  309. set_xy(8,i);      
  310. write_data(p[i+1024]);
  311. }
  312. }
  313. void disp_zf(uchar R,uchar L,uchar *p)
  314. {
  315. uchar i;
  316. for(i=0;i<8;i++)
  317. {
  318. set_xy(2*R,8*L+i);               
  319. write_data(p[i]);
  320. set_xy(2*R+1,8*L+i);               
  321. write_data(p[i+8]);
  322. }
  323. }


  324. uchar beat,tl,th,key=0,k=0,temp; //定義節(jié)拍和T0初值變量
  325. uchar code TABLE[]={   //音符對應的定時器初值表  
  326. 0xfb,0x04,0xfb,0x90,0xfc,0x09,0xfc,0x44,  
  327. 0xfc,0xac,0xfd,0x09,0xfd,0x34,0xfd,0x82,  
  328. 0xfd,0xc8,0xfe,0x06,0xfe,0x22,0xfe,0x56,   
  329. 0xfe,0x85,0xfe,0x9a,0xfe,0xc1};  
  330. uchar code GRACE[]={   //《奇異恩典》音符碼表           
  331. 0x14,0x48,0x62,0x42,0x68,0x54,0x48,0x24,0x18,  
  332. 0x14,0x48,0x62,0x42,0x68,0x54,0x8c,0x88,   
  333. 0x64,0x86,0x62,0x82,0x62,0x48,0x14,0x26,0x42,0x42,0x22,0x18,   
  334. 0x14,0x48,0x62,0x42,0x68,0x54,0x4c,0x48,0x00};  
  335. uchar code JOY[]={     //《歡樂頌》音符碼表   
  336. 0x64,0x64,0x74,0x84,0x84,0x74,0x64,0x54,
  337. 0x44,0x44,0x54,0x64,0x66,0x52,0x58,0x64,
  338. 0x64,0x74,0x84,0x84,0x74,0x64,0x54,0x44,
  339. 0x44,0x54,0x64,0x56,0x42,0x48,0x54,0x54,
  340. 0x64,0x44,0x54,0x62,0x72,0x64,0x44,0x54,
  341. 0x62,0x72,0x64,0x54,0x44,0x54,0x18,0x64,
  342. 0x64,0x74,0x84,0x84,0x74,0x64,0x54,0x44,
  343. 0x44,0x54,0x64,0x56, 0x42,0x48,0x00};
  344. uchar code HAPPY[]={   //《生日快樂》音符碼表  
  345. 0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,  
  346. 0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04,   
  347. 0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94,
  348. 0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,  
  349. 0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,  
  350. 0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04,  
  351. 0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94,  
  352. 0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,   
  353. 0x00};   
  354. void Timer0_Initialize();
  355. void delay_10ms();
  356. void Delay(uchar);  
  357. void Key_Scan();
  358. uint a[4]={0,1,2,3};
  359.   void main()
  360.   {  
  361.           uchar m,m1; //定義臨時變量      
  362.           uchar *p[3];  
  363.           uchar beat=0;     
  364.           p[0]=GRACE;
  365.           p[1]=JOY;
  366.           p[2]=HAPPY;     
  367.           Timer0_Initialize();         
  368.       while(1)  
  369.       {         
  370.                           Key_Scan();
  371.                         if(key!=3)
  372.                                 TR0=1;
  373.                           switch(key)
  374.                                   {        
  375.                                         P1=0xff;
  376.                                         case 0:
  377.                                                         disp_hz(HZ0 );
  378.                                                         temp=key;
  379.                                                         TR0=1;
  380.                                                         while(*(p[key]+k)!=0) //判斷取得的音符碼是否為結(jié)束碼   
  381.                                                         {   
  382.                                                                 beat=*(p[key]+k)&0x0f; //取節(jié)拍碼   
  383.                                                                 m=_crol_(*(p[key]+k),4)&0x0f; //取音調(diào)碼   
  384.                                                                 if(beat!=0)
  385.                                                                 {   //判斷取得的音調(diào)碼是否為0     {        //不是,根據(jù)取得的音調(diào)碼計算T0初值      
  386.                                                                         m1=--m*2+1;     
  387.                                                                         m=m*2;     
  388.                                                                         tl=TL0=TABLE[m1];     
  389.                                                                         th=TH0=TABLE[m];     
  390.                                                                
  391.                                                                 }   
  392.                                                                 else
  393.                                                                 {       //取得的節(jié)拍碼為0,則停止T0      
  394.                                                                         TR0=0;
  395.                                                                 }     
  396.                                                                   Delay(beat);   
  397.                                                                   k++;
  398.                                                                  Key_Scan();
  399.                                                                  delay_10ms();
  400.                                                                  if(temp!=key)break;                                      
  401.                                                         }
  402.                                                         TR0=0;
  403.                                                         k=0;
  404.                                                         break;
  405.                                                 
  406.                                         case 1:
  407.                                                         disp_hz(HZ1 );
  408.                                                             temp=key;
  409.                                                         TR0=1;
  410.                                                         while(*(p[key]+k)!=0) //判斷取得的音符碼是否為結(jié)束碼   
  411.                                                         {   
  412.                                                                 beat=*(p[key]+k)&0x0f; //取節(jié)拍碼   
  413.                                                                 m=_crol_(*(p[key]+k),4)&0x0f; //取音調(diào)碼   
  414.                                                                 if(beat!=0)
  415.                                                                 {   //判斷取得的音調(diào)碼是否為0     {        //不是,根據(jù)取得的音調(diào)碼計算T0初值      
  416.                                                                         m1=--m*2+1;     
  417.                                                                         m=m*2;     
  418.                                                                         tl=TL0=TABLE[m1];     
  419.                                                                         th=TH0=TABLE[m];     
  420.                                                                
  421.                                                                 }   
  422.                                                                 else
  423.                                                                 {       //取得的節(jié)拍碼為0,則停止T0      
  424.                                                                         TR0=0;
  425.                                                                 }     
  426.                                                                   Delay(beat);   
  427.                                                                   k++;
  428.                                                                  Key_Scan();
  429.                                                                  delay_10ms();
  430.                                                                  if(temp!=key)break;                                      
  431.                                                         }
  432.                                                         TR0=0;
  433.                                                         k=0;
  434.                                                         break;
  435.                                                 
  436.                                         case 2:
  437.                                                         disp_hz(HZ2 );
  438.                                                         temp=key;
  439.                                                         TR0=1;
  440.                                                         while(*(p[key]+k)!=0) //判斷取得的音符碼是否為結(jié)束碼   
  441.                                                         {   
  442.                                                                 beat=*(p[key]+k)&0x0f; //取節(jié)拍碼   
  443.                                                                 m=_crol_(*(p[key]+k),4)&0x0f; //取音調(diào)碼   
  444.                                                                 if(beat!=0)
  445.                                                                 {   //判斷取得的音調(diào)碼是否為0     {        //不是,根據(jù)取得的音調(diào)碼計算T0初值      
  446.                                                                         m1=--m*2+1;     
  447.                                                                         m=m*2;     
  448.                                                                         tl=TL0=TABLE[m1];     
  449.                                                                         th=TH0=TABLE[m];     
  450.                                                                
  451.                                                                 }   
  452.                                                                 else
  453.                                                                 {       //取得的節(jié)拍碼為0,則停止T0      
  454.                                                                         TR0=0;
  455.                                                                 }     
  456.                                                                   Delay(beat);   
  457.                                                                   k++;
  458.                                                                  Key_Scan();
  459.                                                                  delay_10ms();
  460.                                                                  if(temp!=key)break;                                      
  461.                                                         }
  462.                                                         TR0=0;
  463.                                                         k=0;
  464.                                                         break;
  465.                                         case 3:
  466.                                                 TR0=0;break;

  467.                                  }
  468.                         }
  469.                 }
  470.                        
  471.          
  472.          
  473.                   void Timer0_Initialize()
  474.                   {  
  475.                           EA=1;
  476.                           ET0=1;
  477.                           TMOD=0x01;  
  478.                           TR0=1;
  479.                   }  
  480.                   void timer0() interrupt 1 using 1
  481.                   {      
  482.                           TL0=tl;
  483.                           TH0=th;        //重裝定時初值      
  484.                           SPEAK=~SPEAK;
  485.                   }           //蜂鳴器控制端口電平取反 }  /************************ 四分之一拍延時函數(shù) ************************/
  486.                   void Delay_Beat()
  487.                   {  
  488.                           uint i;  
  489.                           for(i=0;i<20000;i++);
  490.                   }   
  491.                   void Delay(uchar tt)
  492.                   {  
  493.                            uchar i;  
  494.                            for(i=0;i<tt;i++)     
  495.                            Delay_Beat();  
  496.                    }
  497.                    void delay_10ms()
  498.                    {  
  499.                            int i;  
  500.                            for(i=0;i<200;i++);
  501.                    }  
  502.                    void Key_Scan()
  503.                    {   
  504.                                    uchar i,temp1;        
  505.                                         P1=0xfb;
  506.                                         for(i=0;i<=1;i++)
  507.                                         {
  508.                                                 if(L1==0)
  509.                                                 {
  510.                                                         if(i==0)
  511.                                                                 key=a[i];
  512.                                                         else
  513.                                                                 key=a[i+1];
  514.                                                                
  515.                                                 }
  516.                                                 if(L2==0)
  517.                                                 {   
  518.                                                         if(i==0)
  519.                                                                 key=a[i+1];
  520.                                                         else
  521.                                                                 key=a[i+2];
  522.                                                 }
  523.                                 
  524.                                                 delay_10ms();
  525.                                                 temp1=P1;
  526.                                                 temp1=temp1|0x03;
  527.                                                 temp1=temp1<<1;
  528.                                                 temp1=temp1|0x03;
  529.                                                 P1=temp1;
  530.                                  }
  531.                    }   
復制代碼



所有資料51hei提供下載:

基于單片機的電子賀卡設計.rar (139.38 KB, 下載次數(shù): 211)





作者: 337930050    時間: 2018-11-21 15:53
樓主的實際效果如圖:


作者: 1823705288    時間: 2019-4-13 21:38
設計基于單片機的圖片顯示 (需用12864液晶并有不同的顯示效果,包括水平移動、豎直移動以及閃爍)
樓主這個的程序怎么寫?
作者: Blankhands    時間: 2019-12-22 14:33
復制了keil老是有BUG,不知道為啥沒復制對
作者: YZXLOVEZLM    時間: 2020-6-8 08:41
沒啥用啊
作者: djl000    時間: 2020-7-8 20:53
這個不顯示啊
作者: djl000    時間: 2020-7-8 21:14
Blankhands 發(fā)表于 2019-12-22 14:33
復制了keil老是有BUG,不知道為啥沒復制對

這個是代碼的問題,
作者: djl000    時間: 2020-7-9 14:38
337930050 發(fā)表于 2018-11-21 15:53
樓主的實際效果如圖:

這個要怎樣整出來
作者: 我愛你5211111    時間: 2021-7-3 20:38
請問能發(fā)幾個其他歌曲嗎

作者: ming@c    時間: 2022-12-23 14:14
我愛你5211111 發(fā)表于 2021-7-3 20:38
請問能發(fā)幾個其他歌曲嗎

unsigned char code Music_Girl[]={ 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x03,
0x16,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03,
0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03,
0x17,0x03, 0x15,0x02, 0x18,0x03, 0x17,0x03, 0x18,0x02,
0x10,0x03, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03,
0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x1A,0x03,
0x1B,0x03, 0x1F,0x03, 0x1F,0x03, 0x17,0x03, 0x18,0x03,
0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03,
0x18,0x03, 0x1F,0x03, 0x1F,0x02, 0x16,0x03, 0x17,0x03,
0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02,
0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,
0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,
0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,
0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03,
0x16,0x66, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03,
0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,
0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,
0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,
0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,
0x1F,0x00, 0x1A,0x03, 0x1A,0x03, 0x1A,0x03, 0x1B,0x03,
0x1B,0x03, 0x1A,0x03, 0x19,0x03, 0x19,0x02, 0x17,0x03,
0x15,0x17, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x18,0x03,
0x17,0x04, 0x18,0x0E, 0x18,0x03, 0x17,0x04, 0x18,0x0E,
0x18,0x66, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03,
0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66,
0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03,
0x1F,0x66, 0x1F,0x04, 0x1B,0x0E, 0x1B,0x03, 0x19,0x03,
0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,
0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04,
0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,
0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03,
0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03,
0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,
0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00, 0x18,0x02,
0x18,0x03, 0x1A,0x03, 0x19,0x0D, 0x15,0x03, 0x15,0x02,
0x18,0x66, 0x16,0x02, 0x17,0x02, 0x15,0x00, 0x00,0x00}
作者: 大漠孤煙001    時間: 2022-12-23 16:58
新年要到了,樓主的電子賀卡又派上用場啦!試試硬件USB、RTC、DMA、TFT等資源的STC8H8K64U系列,其中實驗箱范例程序包里面有矩陣按鍵模擬小鍵盤范例程序看能不能用上。








歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1