找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2735|回复: 12
打印 上一主题 下一主题
收起左侧

stc12c5a60s2单片机+pcf8574+lcd1602不显示

[复制链接]
跳转到指定楼层
楼主
100黑币
大佬们好,最近想用单片机+lcd做个显示的功能,某一个宝买的pcf8574+lcd1602的模块,单片机用的STC16C5A60S2,外接20MHz的晶振,看了论坛里面各位大佬的帖子,受益匪浅,试着移植过来用,但是一直没有显示,给pcf8574外接的5V10A的电源,不知道有没有影响,下面是我的程序,还请各位大佬给看看程序有什么问题。如果解决的话,可以有报酬(rmb)。另外发现一个奇怪的问题,单独给IIC俩引脚赋值时,SDA置1,SCL置0的时候,SDA引脚测电压是负的0.5;都置1的时候,SDA电压是2.2V,菜鸡新手确实不知道什么问题了,希望各位大佬不吝赐教。
主程序的:
程序里的延时是用STC-ISP的工具生成的,我用示波器看是比较准确的。
  1. #include <STC12C5A60S2.H>
  2. #include <PCF8574.h>
  3. #include "intrins.h"
  4. /************IO口工作模式初始化函数***********/
  5. void IO_Init()
  6. {
  7.         P0M0=0x00;
  8.         P0M1=0x00;
  9.         
  10.         P1M0=0x00;
  11.         P1M1=0x00;
  12.         
  13.         P2M0=0x00;
  14.         P2M1=0x00;
  15.         
  16.         P3M0=0x00;
  17.         P3M1=0x00;
  18.         
  19.         P4M0=0x00;
  20.         P4M1=0x00;
  21.         
  22.         P5M0=0x00;
  23.         P5M1=0x00;
  24.         
  25. }
  26. /**************延时函数ms**************/

  27. /*
  28. void delayms(uchar x)
  29. {
  30.         uchar a,b;
  31.         for(a=0;a<x;a++)
  32.                 for(b=0;b<200;b++)
  33.                         delayus();
  34. }*/

  35. void Delay6ms()                //@20.000MHz
  36. {
  37.         unsigned char i, j;

  38.         _nop_();
  39.         _nop_();
  40.         i = 117;
  41.         j = 183;
  42.         do
  43.         {
  44.                 while (--j);
  45.         } while (--i);
  46. }


  47. void write_com(uchar com)                //写命令函数
  48. {        uchar com1,com2;
  49.         com1=com|0x0f;
  50.         write_add(com1&0xfc);
  51.         delayus();
  52.   write_add(com1&0xf8);
  53.         com2=com<<4;
  54.         com2=com2|0x0f;
  55.         write_add(com2&0xfc);
  56.         delayus();
  57.   write_add(com2&0xf8);
  58.         
  59. }

  60. void write_date(uchar date)                //写数据函数
  61. {
  62.         uchar date1,date2;
  63.         date1=date|0x0f;
  64.         write_add(date1&0xfd);
  65.         delayus();
  66.         write_add(date1&0xf9);
  67.         date2=date<<4;
  68.         date2=date2|0x0f;
  69.         write_add(date2&0xfd);
  70.         delayus();
  71.         write_add(date2&0xf9);
  72.                
  73. }

  74. void init_lcd()                                        //初始化函数
  75. {                                                                                                  
  76.         write_com(0x33); //显示模式设置
  77.         Delay6ms();
  78.         write_com(0x32); //显示模式设置
  79.         Delay6ms();
  80.         write_com(0x28); //4位总线,双行显示,显示5×7的点阵字符
  81.         Delay6ms();
  82.         write_com(0x01); //清屏
  83.         Delay6ms();
  84.         write_com(0x06); //字符进入模式:屏幕不动,字符后移
  85.         Delay6ms();
  86.         write_com(0x0c); //显示开,关光标
  87.         //write_LCD_Command(0x0f); //显示开,开光标,光标闪烁
  88.         Delay6ms();
  89. }

  90. //显示字符串:第x行第y列显示什么内容
  91. void ShowString(unsigned char x,unsigned char y,unsigned char *str)
  92. {
  93.         
  94.         if(x == 1)
  95.         {
  96.                 write_com(0x80 | y-1);
  97.         }
  98.         if(x == 2)
  99.         {
  100.                 write_com(0xc0 | y-1);
  101.         }
  102.         //输出字符串
  103.         
  104.         while(*str!='\0')
  105.         {
  106.                 write_date(*str);
  107.                 str++;
  108.         }

  109. }
  110. void main()
  111. {        
  112.         IO_Init();
  113.         init();
  114.         init_lcd();
  115.         ShowString(1,1,"0123456789123456");
  116.         ShowString(2,1,"1234567891234560");
  117.         delayus();
  118.         while(1)
  119.         {

  120.         }
  121.         
  122. }
复制代码

PCF8574.h


  1. sbit scl=P2^3;
  2. sbit sda=P2^4;
  3. #define  uchar unsigned char
  4. #define  uint        unsigned int


  5. void delayus()        //@20.000MHz   5um
  6. {
  7.         unsigned char i;

  8.         i = 22;
  9.         while (--i);
  10. }

  11. void init()//IIC初始化
  12. {
  13.         sda=1;
  14.         delayus();
  15.         scl=1;
  16.         delayus();
  17. }
  18. void start()  //IIC开始信号
  19. {        
  20.         sda=1;
  21.         delayus();
  22.         scl=1;
  23.         delayus();
  24.         sda=0;
  25.         delayus();
  26. }

  27. void stop()   //IIC停止
  28. {
  29.         sda=0;
  30.         delayus();
  31.         scl=1;
  32.         delayus();
  33.         sda=1;
  34.         delayus();
  35. }

  36. void respons()  //IIC应答
  37. {
  38.         uchar i;
  39.         scl=1;
  40.         delayus();
  41.         while((sda==1)&&(i<250))i++;
  42.         scl=0;
  43.         delayus();
  44. }

  45. void write_byte(uchar date)//IIC写入数据
  46. {
  47.         uchar i,temp;
  48.         temp=date;


  49.         for(i=0;i<8;i++)
  50.         {
  51.                 temp=temp<<1;
  52.                 scl=0;
  53.           delayus();
  54.                 sda=CY;
  55.                 delayus();
  56.                 scl=1;
  57.                 delayus();
  58.         }
  59.         scl=0;
  60.         delayus();
  61.         sda=1;
  62.         delayus();
  63. }





  64. void write_add(uchar date1)//写入数据到IO
  65. {
  66.         start();
  67.         //write_byte(0x7e);
  68.         write_byte(0x4e);
  69.         respons();
  70.         write_byte(date1);
  71.         respons();
  72.         stop();
  73. }
复制代码



最佳答案

查看完整内容

根据你的描述,I2C通讯貌似都是有问题的,就不着急先看代码的问题,先把I2C处理好,确认没问题了在看代码的逻辑。可以先写一个简单的程序,就直接给I2C两个IO口赋值,看看高低电平正不正常,如果有问题那就先找到问题是什么解决了再看代码,根据你的描述来看I2C硬件估计是有问题的,LCD和单片机共地了吗?I2C上拉电阻有没有?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:887202 发表于 2021-7-6 22:05 | 只看该作者
根据你的描述,I2C通讯貌似都是有问题的,就不着急先看代码的问题,先把I2C处理好,确认没问题了在看代码的逻辑。可以先写一个简单的程序,就直接给I2C两个IO口赋值,看看高低电平正不正常,如果有问题那就先找到问题是什么解决了再看代码,根据你的描述来看I2C硬件估计是有问题的,LCD和单片机共地了吗?I2C上拉电阻有没有?
回复

使用道具 举报

板凳
ID:390416 发表于 2021-7-7 09:26 | 只看该作者
LCD1602显示℃ 这种自定义符号 http://www.51hei.com/bbs/dpj-200685-1.html
LCD1602液晶最新资料 说明了具体的时间要求 http://www.51hei.com/bbs/dpj-205768-1.html
回复

使用道具 举报

地板
ID:88256 发表于 2021-7-7 09:30 | 只看该作者
连个实际接线图都没有,谁知道你是怎么接线的
回复

使用道具 举报

5#
ID:97554 发表于 2021-7-7 11:12 | 只看该作者
sadv 发表于 2021-7-7 09:21
根据你的描述,I2C通讯貌似都是有问题的,就不着急先看代码的问题,先把I2C处理好,确认没问题了在看代码的 ...

估计是没共地。
回复

使用道具 举报

6#
ID:584814 发表于 2021-7-7 17:45 | 只看该作者
软件和硬件要相结合才知道毛病在哪里,话说这套东东很好整的,网上抄或找商家要都可以轻松解决。
回复

使用道具 举报

7#
ID:887202 发表于 2021-7-7 18:23 | 只看该作者

同感,只要共地了电压不会是负数,但是不排除测量方法不正确的原因,奇葩的问题往往有奇葩的原因
回复

使用道具 举报

8#
ID:947166 发表于 2021-7-7 19:03 | 只看该作者
sadv 发表于 2021-7-7 09:21
根据你的描述,I2C通讯貌似都是有问题的,就不着急先看代码的问题,先把I2C处理好,确认没问题了在看代码的 ...

C:\Users\SKD\Desktop\电路图\实物.jpg确实是没有共地,因为lcd的供电是外加的电源,测量的时候以单片机的地为准,我调整一下试试,谢谢

实物.jpg (177.21 KB, 下载次数: 100)

实物

实物
回复

使用道具 举报

9#
ID:88256 发表于 2021-7-7 19:16 | 只看该作者
Capta1nY 发表于 2021-7-7 19:03
确实是没有共地,因为lcd的供电是外加的电源,测量的时候以单片机的地为准,我调整一下试试,谢谢

没有共地信号怎么传输?你不会真以为两线传输就只要两条线吧?那是指信号线,地线是必不可少的,否则信号就形成不了回路了。
回复

使用道具 举报

10#
ID:947166 发表于 2021-7-7 20:07 | 只看该作者
sadv 发表于 2021-7-7 09:21
根据你的描述,I2C通讯貌似都是有问题的,就不着急先看代码的问题,先把I2C处理好,确认没问题了在看代码的 ...

感谢您的指导,现在问题解决了,一个是您说的共地的问题,另一个不知道是不是10A的外接电源把lcd搞坏了,I2C接口置位依然不正常,把整个lcd+i2c驱动模块换了另一块,可以显示了,感谢您的思路,受教了
回复

使用道具 举报

11#
ID:947166 发表于 2021-7-7 20:09 | 只看该作者
感谢各位的回复,菜鸟刚接触单片机,向各位前辈学习
回复

使用道具 举报

12#
ID:887202 发表于 2021-7-8 18:59 | 只看该作者
Capta1nY 发表于 2021-7-7 20:07
感谢您的指导,现在问题解决了,一个是您说的共地的问题,另一个不知道是不是10A的外接电源把lcd搞坏了, ...

都是这样子过来的啦,我曾经调一个I2C四天都没通,人都傻了哈哈哈哈哈,每次都吸取经验就好了
回复

使用道具 举报

13#
ID:1060557 发表于 2023-3-3 23:17 | 只看该作者
真的绝杀,1602共地我给忘记了   哇   连续几天鏖战5 6 小时
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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