找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4344|回复: 9
收起左侧

使用stc15w408as单片机做频谱显示LCD1602 源程序

  [复制链接]
ID:95809 发表于 2021-1-9 19:21 | 显示全部楼层 |阅读模式
为了给自己做的功放加个频谱显示做的,LCD1602正好和原来的显示屏大小一样,就用1602做显示了,为了防止对音频信号的干扰,输入用4558做的缓冲放大。
2021-01-09_19-20-42.jpg
单片机主程序如下:
  1. #include "STC15.H"
  2. #include "1602.h"
  3. sbit busyFlag = P2^7;
  4. /***********************************************/
  5. //自定义的8个字符 分别为第1横格到8横格
  6. uchar code Pic[8][8]=
  7. {
  8.         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f},
  9.         {0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x1f},
  10.         {0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x1f},
  11.         {0x00,0x00,0x00,0x00,0x1f,0x00,0x1f,0x1f},
  12.         {0x00,0x00,0x00,0x1f,0x1f,0x00,0x1f,0x1f},
  13.         {0x00,0x00,0x00,0x1f,0x1f,0x00,0x1f,0x1f},
  14.         {0x00,0x1f,0x00,0x1f,0x1f,0x00,0x1f,0x1f},
  15.         {0x1f,0x1f,0x00,0x1f,0x1f,0x00,0x1f,0x1f},
  16. };
  17. /*********检查LCD忙****************************/
  18. void lcdCheckbusy()                                
  19. {
  20.         lcdDb=0xff;
  21.         lcdRs=0;                                                 //dc=1为数据,=0为命令.
  22.         lcdRw=1;                                                 //rw=1为读,=0为写.
  23.         lcdE=1;                                                 //cs=1选通.
  24.         delay40us(1);
  25.         while(busyFlag);
  26.         lcdE=0;
  27. }
  28. /*******初始化函数*****************************/
  29. void lcdInit(void)
  30. {
  31.         lcdWriteCommand(0x38);                        //设置8位格式,2行,5x7
  32.         lcdWriteCommand(0x0c);                        //整体显示,关光标,不闪烁
  33.         lcdWriteCommand(0x06);                        //设定输入方式,增量不移位
  34.         lcdWriteCommand(0x01);                        //清除屏幕显示
  35. }
  36. /********写指令函数*****************************/
  37. void lcdWriteCommand(uchar dat)
  38. {
  39.         lcdCheckbusy();
  40.         lcdDb=dat;
  41.         lcdRs=0;                                        //指令
  42.         lcdRw=0;                                        //写入
  43.         lcdE=1;                                                //允许
  44.         delay40us(1);
  45.         lcdE=0;
  46. }
  47. /********写数据函数*****************************/
  48. void lcdWriteData(uchar dat)
  49. {
  50.         lcdCheckbusy();
  51.         lcdDb=dat;
  52.         lcdRs=1;                                //数据
  53.         lcdRw=0;                                //写入
  54.         lcdE=1;                                        //允许
  55.         lcdE=0;
  56. }
  57. /********写入CGRAM "自定义" 字符***************/
  58. void lcdWritePic()
  59. {
  60.         uchar i,j;
  61.         for(i=0;i<8;i++)
  62.          {
  63.                 lcdWriteCommand(0x40+i*8); //指令地址为0100 0000 +(0000 0000~0011 1000)具体参考说明书CGRAM的使用
  64.                 for(j=0;j<8;j++)lcdWriteData(Pic[i][j]);//向CGRAM写入字型编码数据(CGRAM数据).
  65.          }
  66. }
  67. /*******************************************************
  68. 功能:显示一个字符
  69. 函数参数 : 显示坐标(x,y,dat)范围 (0~f,0~1,0~7)
  70. *******************************************************/
  71. void dispString(uchar x,uchar y,uchar dat)//dat范围是0~7,表示显示8个自定义字符的第几个
  72. {
  73.         uchar address;
  74.         switch (y)
  75.         {
  76.                 case 0:  address=0x80+x;  //00000000B(00H)+10000000B(80H)=10000000B(80H)
  77.                         break;
  78.                 case 1:         address=0xc0+x;  //01000000B(40H)+10000000B(80H)=11000000B(C0H)
  79.                         break;
  80.         }
  81.         lcdWriteCommand(address);          //地址显示
  82.         lcdWriteData(dat);                          //显示自定义的第几个字符
  83. }
  84. /********延时函数 1T 22.1148M***************/
  85. void delay40us(uint n)
  86. {
  87.         uchar a,b;
  88.         while(n--)
  89.         {   
  90.             for(b=185;b>0;b--)
  91.                 for(a=1;a>0;a--);
  92.         }
  93. }
复制代码
51hei.png

程序下载: 15W408版本.rar (88.56 KB, 下载次数: 114)

评分

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

查看全部评分

回复

使用道具 举报

ID:230742 发表于 2021-1-10 22:22 | 显示全部楼层
大师,给个电路图呗。谢谢了。
回复

使用道具 举报

ID:95809 发表于 2021-1-11 11:41 来自手机 | 显示全部楼层
啤酒瓶子老大 发表于 2021-1-10 22:22
大师,给个电路图呗。谢谢了。

D0-D7接P2口,RS.RW.EN接3.5/3.6/3.7。音频接1.1口,PCB上都画出来了,你也可以在程序里修改。
回复

使用道具 举报

ID:390416 发表于 2021-1-15 20:56 | 显示全部楼层
LCD1602显示频谱? 你也太会折腾了吧。好歹用LED点阵做啊
回复

使用道具 举报

ID:95809 发表于 2021-1-15 21:42 | 显示全部楼层
人人学会单片机 发表于 2021-1-15 20:56
LCD1602显示频谱? 你也太会折腾了吧。好歹用LED点阵做啊

有点阵做的,以前发的帖子里有,我的功放是用汽车收音机做外壳,1602正好和原来的显示屏一样大。
回复

使用道具 举报

ID:98767 发表于 2021-1-17 18:11 | 显示全部楼层
楼主用什么PCB软件画的,看上去不像AD啊。
回复

使用道具 举报

ID:95809 发表于 2021-2-8 12:03 来自手机 | 显示全部楼层
kkfy888 发表于 2021-1-17 18:11
楼主用什么PCB软件画的,看上去不像AD啊。

LAYOUT  6.0。
回复

使用道具 举报

ID:1063066 发表于 2023-2-15 20:35 | 显示全部楼层
弱弱请问一下版主,408的设置频率多少的
回复

使用道具 举报

ID:1063066 发表于 2023-2-15 20:42 | 显示全部楼层
请问一下版主这个408设置多少频率的,40.96K  180个周期,怎么算好像不对
回复

使用道具 举报

ID:95809 发表于 2023-6-12 17:23 来自手机 | 显示全部楼层
danny_003 发表于 2023-2-15 20:35
弱弱请问一下版主,408的设置频率多少的

12M以上,越高越好。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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