找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9244|回复: 10
收起左侧

基于单片机的电子贺卡设计报告与仿真及源码资料下载

  [复制链接]
ID:216765 发表于 2018-7-9 16:24 | 显示全部楼层 |阅读模式
题目:基于单片机的电子贺卡设计
内容:
1、设计基于单片机的伴奏乐曲(30分)
2、设计基于单片机的彩屏图片(30分)
3、通过矩阵键盘按键显示不同彩屏图片,并伴有不同乐曲(30分)
4、创新部分(自主设计)(10分)
要求:
1、根据设计内容,设计系统硬件结构,画出系统流程图。
2、应用Keil、Proteus软件开发应用系统并仿真调试。


文件包含程序代码、proteus仿真以及报告

目录
1.概论
2.需求分析
3.系统硬件设计
3.1 硬件仿真图
3.2 键盘控制
3.3 发声装置
3.4 显示装置
4.主要程序设计
4.1 程序设计思想
4.1.1 音调脉冲的产生
4.1.2音乐节拍的产生
4.1.3 音符码表的编制
4.1.4 主要程序
4.2 主程序框图
5.心得体会

1. 概论

科技日新月异,许许多多的电子产品走进千家万户。而众多电子产品绝大多数是基于单片机的,在单片机软件驱动I/O上挂载设备,于是有各种各样功能的电子产品。伴随着科技的快速进步和社会的发展,单片机技术的应用已经进入到我们的生活、工作等很多领域,这已经成为了一种非常成熟的电子技术。本系统是以单片机为核心元件,实现了基于单片机的伴奏乐曲、基于单片机的彩屏图片并通过矩阵键盘按键显示不同彩屏图片并伴有不同乐曲的诸多功能的电子贺卡。通过单片机、AMPIRE128*64图形液晶显示屏、蜂鸣器以及按键几个元件的协调合作,完成了一个简单音乐播放器的基本功能。

2.需求分析

目前市场上有很多种音乐芯片或音乐模块,可以直接产生各种曲子。但是这种模块价格比较贵,性价比不高。对于一些仅需要产生简单的音符或简短曲子的场合,例如智能玩具、电子贺卡等,可以使用单片机配合简单的蜂鸣器就能产生需要的音乐效果,这种方法充分发挥了单片机的优势。单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。利用单片机实现音乐播放有很多要点,例如外部电路简单,控制方便等,因而备受广大单片机爱好者的喜爱。通过音乐发声器的设计方案,掌握C语言的编程方法。并熟练的运用AT89C52单片机定时器产生固定频率的方波信号,推动喇叭发出旋律,按下单键可以演奏预先设置的歌曲旋律,最重要的是自己还可以通过程序设计输入自己喜欢的歌曲来演奏。

3.系统硬件设计3.1 硬件仿真图
              单片机为核心元件,P1口低四位作为矩阵键盘的控制引脚,通过按键控制进行相应曲目切换与停止。单片机内部的定时器/计数器使P2.7输出一系列不同频率的脉冲控制音调的变化,蜂鸣器连接P2.7实现发声。P3口连接AMPIRE128*64的数据输入输出引脚。每当进行曲目切换时便执行相应显示函数使屏幕显示图片。如图3.1,
图3.1
3.2 键盘控制

本设计采用2*2矩阵键盘控制相应曲目播放,每个按键进行实时扫描以检测是否有按键按下。三个按键控制曲目切换,一个按键控制停止曲目播放。如图3.2,

图3.2
3.3 发声装置

通过单片机定时器/计数器使P2.7输出一系列不同频率的脉冲控制音调高低与延时函数控制节拍,使用蜂鸣器放出乐曲。如图3.3,

图3.3
3.4 显示装置

通过AMPIRE128*64显示对应曲目图片,液晶模块显示汉字方法:使用图形液晶模块以点阵形式来显示汉字和图形,每8个点组成1个字节,每个点用一个二进制位表示,存1的点显示时在屏上显示一个亮点,存0的点则在屏上不显示,在液晶屏上竖向8个点为1个字节数据,通过字模提取软件按照先左后右,先上后下倒序的方式对汉字进行字模提取。如图3.4,

图3.4
4.主要程序设计4.1 程序设计思想4.1.1 音调脉冲的产生

要让单片机产生音频脉冲,只要计算出某一音频的周期,将此周期除以2得到半周期,利用定时器对此半周期进行定时,每当定时时间到时,就将P2.7引脚上的电平取反,从而得到所需要的音频脉冲。

4.1.2音乐节拍的产生

可以通过延时程序来产生不同的节拍。如果1拍为0.4秒,则1/4为0.1秒,只要设定延时时间就可以求得节拍时间。例如一段延时程序Delay为1/4拍,则一拍只要调用4次Delay程序,依此类推。

4.1.3 音符码表的编制

编写一段音乐音符码表时,先把乐谱的音符找出,建立对应的音调码及定时器初值表,建立节拍码表。每个音符使用1个字节,字节的高4位存放音符的音调码,低4位存放音符的节拍码。音符对应的音调码表和定时器初值表(fosc=12MHz)。

C语言将音调码表和定时器初值表表示出来即为: 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 主要程序
  • 本程序使用2*2矩阵键盘,通过P1.0,P1.1控制键盘列,P1.2,P1.3控制键盘列。相关程序如下:
  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.                                }  
复制代码


  • 利用全局变量key来获取按下的键号,并使用key值充当switch-case循环语句参数执行相应的播放程序。每次调用相应的音调码后便执行键盘扫描函数,如有按键按下,则进行曲目切换。播放整首曲目部分程序如下:

while(*(p[key]+k)!=0) //判断取得的音符码是否为结束码  

              {   

                            beat=*(p[key]+k)&0x0f; //取节拍码   

                            m=_crol_(*(p[key]+k),4)&0x0f; //取音调码   

                            if(beat!=0)

                               {   //判断取得的音调码是否为0, 若不是,根据取得的音调码计算T0初值     

                                          m1=--m*2+1;   

                                          m=m*2;   

                                          tl=TL0=TABLE[m1];   

                                          th=TH0=TABLE[m];   

                                                                                                               

                            }   

                            else

                            {       //取得的节拍码为0,则停止T0     

                                          TR0=0;

                            }   

                            Delay(beat);   

                            k++;

                            Key_Scan();

                            delay_10ms();

                            if(temp!=key)break;                                                      

              }

                            TR0=0;

                            k=0;

                break;

  • 利用循环语句while(1)实现曲目单曲循环。
  • 通过AMPIRE128*64显示相应的图片,利用取字模软件获取相应图片的编码,每个编码数组为1024字节。取字模时纵向倒序格式。AMPIRE128*64的部分程序代码如下:

//忙检查

void check_busy()

{

uchar a=0;

for(a=0;a<200;a++);                  //此处为延时,一段时间后确保处于空闲状态

                                     //此处为状态查询,查询忙状态,没有使用成功,以后再调试

RW=1;

RS=0;                                

E=1;

while(1)

{

     E=1;

     if(!(P0&0x80))

        break;

                  a++;

     if(a>10)

                              break;

               

}

E=1;}

//写命令函数

void write_cmd(uchar inst)

{

check_busy();

RS=0;

RW=0;

E=1;

P3=inst;

E=0;

_nop_();}

//写数据函数

void write_data(uchar dat)

{check_busy();

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

E=0;_nop_();}

//初始化函数

void LCD_Init()

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

delayus(4);

write_cmd(0x0c);//开显示,关光标,不闪烁。

delayus(10);

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

delayus(10);

write_cmd(0x06);//光标的移动方向左,DDRAM的地址计数器(AC)加1。

delayus(10);

}

//设置显示坐标

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

{

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

{CS2=0;                          //低电平选择              CS1=1;                            //写右屏是左屏关闭,不然两边会同时显示            

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

{CS1=0;CS2=1

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

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

//显示函数

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.心得体会

此次设计的不足之处在于键盘按键个数较少,可控制的功能比较简单;显示图片由于需要自己设计、绘画,加之本人绘画能力水品低,致使显示图片并不美观;由于时间原因,并不能设置更多曲目,所以只编制了三首曲目。希望在以后的学习中不断改进此设计。具体实施计划:将每个按键控制单独曲目改为“上一曲”或者“下一曲”以便解决多曲目存取与播放;设置“快进”与“减慢”对于曲目的播放速度进行控制;将彩屏上的图片设置为动态;设置相应按键控制播放声音的大小。

本次课设可以说是我经历过最有意义的一次。由于整学期对于《单片机与接口技术》的学习只是停留在了课本上,当拿到课设题目时,可以说一点思路都没有。通过上网查询,我了解到了有关播放曲目的一些知识。但对于整个课设来说,这只是小部分。我花了不到两天的时间终于构思出了通过矩阵键盘控制曲目播放。我对于AMPIRE128*64的了解一片空白。通过网上查询与看相关源程序。我了解了它显示的基本原理。通过思考设计了满足要求的程序。调试加修改的过程中我又完成了AMPIRE128*64图片的显示。经过最后的整合,两者合二为一。我完成了本次课设,成就感与喜悦并存。

学习知识就是为了运用,我学了这么多年的知识,但却很少真正能够凭借自己力量做出一件属于自己的东西。这次课设为我的理论与实践相结合打下了坚实的基础,为自己树立了信心以及以后的实践积攒了经验。


单片机源程序如下:

  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++);                  //此处为延时,一段时间后确保处于空闲状态
  223.                                       //此处为状态查询,查询忙状态,没有使用成功,以后再调试
  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);//开显示,关光标,不闪烁。
  264. delayus(10);
  265. write_cmd(0x01);//清除显示
  266. delayus(10);
  267. write_cmd(0x06);//光标的移动方向左,DDRAM的地址计数器(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;                            //写右屏是左屏关闭,不然两边会同时显示
  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. //显示函数
  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; //定义节拍和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) //判断取得的音符码是否为结束码   
  381.                                                         {   
  382.                                                                 beat=*(p[key]+k)&0x0f; //取节拍码   
  383.                                                                 m=_crol_(*(p[key]+k),4)&0x0f; //取音调码   
  384.                                                                 if(beat!=0)
  385.                                                                 {   //判断取得的音调码是否为0     {        //不是,根据取得的音调码计算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.                                                                 {       //取得的节拍码为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) //判断取得的音符码是否为结束码   
  411.                                                         {   
  412.                                                                 beat=*(p[key]+k)&0x0f; //取节拍码   
  413.                                                                 m=_crol_(*(p[key]+k),4)&0x0f; //取音调码   
  414.                                                                 if(beat!=0)
  415.                                                                 {   //判断取得的音调码是否为0     {        //不是,根据取得的音调码计算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.                                                                 {       //取得的节拍码为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) //判断取得的音符码是否为结束码   
  441.                                                         {   
  442.                                                                 beat=*(p[key]+k)&0x0f; //取节拍码   
  443.                                                                 m=_crol_(*(p[key]+k),4)&0x0f; //取音调码   
  444.                                                                 if(beat!=0)
  445.                                                                 {   //判断取得的音调码是否为0     {        //不是,根据取得的音调码计算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.                                                                 {       //取得的节拍码为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.                   }           //蜂鸣器控制端口电平取反 }  /************************ 四分之一拍延时函数 ************************/
  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.                    }   
复制代码

0.png


所有资料51hei提供下载:

基于单片机的电子贺卡设计.rar (139.38 KB, 下载次数: 209)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:367621 发表于 2018-11-21 15:53 | 显示全部楼层
楼主的实际效果如图:
51hei.png
回复

使用道具 举报

ID:511382 发表于 2019-4-13 21:38 | 显示全部楼层
设计基于单片机的图片显示 (需用12864液晶并有不同的显示效果,包括水平移动、竖直移动以及闪烁)
楼主这个的程序怎么写?
回复

使用道具 举报

ID:669138 发表于 2019-12-22 14:33 | 显示全部楼层
复制了keil老是有BUG,不知道为啥没复制对
回复

使用道具 举报

ID:772386 发表于 2020-6-8 08:41 | 显示全部楼层
没啥用啊
回复

使用道具 举报

ID:799792 发表于 2020-7-8 20:53 | 显示全部楼层
这个不显示啊
回复

使用道具 举报

ID:799792 发表于 2020-7-8 21:14 | 显示全部楼层
Blankhands 发表于 2019-12-22 14:33
复制了keil老是有BUG,不知道为啥没复制对

这个是代码的问题,
回复

使用道具 举报

ID:799792 发表于 2020-7-9 14:38 | 显示全部楼层
337930050 发表于 2018-11-21 15:53
楼主的实际效果如图:

这个要怎样整出来
回复

使用道具 举报

ID:947946 发表于 2021-7-3 20:38 | 显示全部楼层
请问能发几个其他歌曲吗
回复

使用道具 举报

ID:1057995 发表于 2022-12-23 14:14 | 显示全部楼层
我爱你5211111 发表于 2021-7-3 20:38
请问能发几个其他歌曲吗

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}
回复

使用道具 举报

ID:1042619 发表于 2022-12-23 16:58 | 显示全部楼层
新年要到了,楼主的电子贺卡又派上用场啦!试试硬件USB、RTC、DMA、TFT等资源的STC8H8K64U系列,其中实验箱范例程序包里面有矩阵按键模拟小键盘范例程序看能不能用上。 jpg....png

jpg...png

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表