久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: stc12c5a60s2單片機+pcf8574+lcd1602不顯示 [打印本頁]

作者: Capta1nY    時間: 2021-7-6 22:05
標題: stc12c5a60s2單片機+pcf8574+lcd1602不顯示
大佬們好,最近想用單片機+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. }
復制代碼




作者: sadv    時間: 2021-7-6 22:05
根據你的描述,I2C通訊貌似都是有問題的,就不著急先看代碼的問題,先把I2C處理好,確認沒問題了在看代碼的邏輯。可以先寫一個簡單的程序,就直接給I2C兩個IO口賦值,看看高低電平正不正常,如果有問題那就先找到問題是什么解決了再看代碼,根據你的描述來看I2C硬件估計是有問題的,LCD和單片機共地了嗎?I2C上拉電阻有沒有?
作者: 人人學會單片機    時間: 2021-7-7 09:26
LCD1602顯示℃ 這種自定義符號 http://www.zg4o1577.cn/bbs/dpj-200685-1.html
LCD1602液晶最新資料 說明了具體的時間要求 http://www.zg4o1577.cn/bbs/dpj-205768-1.html
作者: hhdsdy    時間: 2021-7-7 09:30
連個實際接線圖都沒有,誰知道你是怎么接線的
作者: 楊雪飛    時間: 2021-7-7 11:12
sadv 發表于 2021-7-7 09:21
根據你的描述,I2C通訊貌似都是有問題的,就不著急先看代碼的問題,先把I2C處理好,確認沒問題了在看代碼的 ...

估計是沒共地。
作者: man1234567    時間: 2021-7-7 17:45
軟件和硬件要相結合才知道毛病在哪里,話說這套東東很好整的,網上抄或找商家要都可以輕松解決。
作者: sadv    時間: 2021-7-7 18:23
楊雪飛 發表于 2021-7-7 11:12
估計是沒共地。

同感,只要共地了電壓不會是負數,但是不排除測量方法不正確的原因,奇葩的問題往往有奇葩的原因
作者: Capta1nY    時間: 2021-7-7 19:03
sadv 發表于 2021-7-7 09:21
根據你的描述,I2C通訊貌似都是有問題的,就不著急先看代碼的問題,先把I2C處理好,確認沒問題了在看代碼的 ...

C:\Users\SKD\Desktop\電路圖\實物.jpg確實是沒有共地,因為lcd的供電是外加的電源,測量的時候以單片機的地為準,我調整一下試試,謝謝

實物.jpg (177.21 KB, 下載次數: 147)

實物

實物

作者: hhdsdy    時間: 2021-7-7 19:16
Capta1nY 發表于 2021-7-7 19:03
確實是沒有共地,因為lcd的供電是外加的電源,測量的時候以單片機的地為準,我調整一下試試,謝謝

沒有共地信號怎么傳輸?你不會真以為兩線傳輸就只要兩條線吧?那是指信號線,地線是必不可少的,否則信號就形成不了回路了。
作者: Capta1nY    時間: 2021-7-7 20:07
sadv 發表于 2021-7-7 09:21
根據你的描述,I2C通訊貌似都是有問題的,就不著急先看代碼的問題,先把I2C處理好,確認沒問題了在看代碼的 ...

感謝您的指導,現在問題解決了,一個是您說的共地的問題,另一個不知道是不是10A的外接電源把lcd搞壞了,I2C接口置位依然不正常,把整個lcd+i2c驅動模塊換了另一塊,可以顯示了,感謝您的思路,受教了
作者: Capta1nY    時間: 2021-7-7 20:09
感謝各位的回復,菜鳥剛接觸單片機,向各位前輩學習
作者: sadv    時間: 2021-7-8 18:59
Capta1nY 發表于 2021-7-7 20:07
感謝您的指導,現在問題解決了,一個是您說的共地的問題,另一個不知道是不是10A的外接電源把lcd搞壞了, ...

都是這樣子過來的啦,我曾經調一個I2C四天都沒通,人都傻了哈哈哈哈哈,每次都吸取經驗就好了
作者: baihu1114    時間: 2023-3-3 23:17
真的絕殺,1602共地我給忘記了   哇   連續幾天鏖戰5 6 小時





歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 9999国产精品欧美久久久久久 | 国产成人精品久久久 | 美女黄色在线观看 | 久久精品视频9 | 国产成人精品一区二区三 | 久久精品综合 | 国产精品视频导航 | 精品一区精品二区 | 中文字幕在线观看第一页 | 亚洲三区在线播放 | 亚洲视频在线免费观看 | 在线观看日本高清二区 | 国产日韩精品一区二区三区 | 成人福利在线观看 | 亚洲一区二区在线 | 黄色在线网站 | 亚洲一区二区免费 | 欧美一区| 日韩在线中文 | 欧美成人a∨高清免费观看 色999日韩 | 中文字幕在线播放不卡 | 伦理二区| 精品久久久久久久久久久下田 | 激情av网站 | 99视频入口| 精品亚洲一区二区三区四区五区 | 毛片1| 麻豆视频在线免费看 | 在线精品一区二区三区 | 日韩精品一区二区三区在线观看 | 96av麻豆蜜桃一区二区 | 亚洲激情在线视频 | 羞羞视频在线观看 | 亚洲乱码国产乱码精品精98午夜 | 中文字幕一区二区三区乱码在线 | 久在线精品视频 | 亚洲精品乱 | 亚洲国产精品久久人人爱 | www.久 | 亚洲视频在线观看一区二区三区 | 欧美一区二区三区在线播放 |