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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3691|回復: 5
打印 上一主題 下一主題
收起左側

LCD1602使用PCF8574ATLLC的單片機驅動 求指導

[復制鏈接]
跳轉到指定樓層
樓主
ID:202803 發表于 2018-5-23 16:56 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
          已經寫了兩天了,也借鑒了網上的例子,但是還是沒成功,以前用16根線的時候還是蠻好弄的!,請教各位大佬,幫忙看一下我的程序是哪里有問題,也麻煩知道一下,謝謝了!
  1. #include <STC12C5A60S2.H>
  2. #include "sys.h"
  3. #define         LCD_ADD                0x3F


  4. void IIC_Start(void);
  5. void IIC_Stop(void);
  6. void IIC_Ask(void);
  7. void IIC_NAsk(void);
  8. bit IIC_Wait_Ack(void);        
  9. void IIC_Send_Byte(uint8_t dat);
  10. uint8_t IIC_Read_Byte(bit ack);
  11. void Enable_LCD_write(void);
  12. bit LCD_Write_CMD(uint8_t cmd);
  13. bit LCD_Write_Data(uint8_t value);
  14. void Show_string(unsigned char x,unsigned char y,unsigned char *s);



  15. sbit SCL = P1^0;
  16. sbit SDA = P1^1;
  17. sbit LED = P1^2;


  18. //開始
  19. void IIC_Start(void)
  20. {
  21.         SDA = 1;
  22.         SCL = 1;
  23.         Delay2us();
  24.         SDA = 0;
  25.         Delay5us();
  26.         SCL = 0;
  27. }


  28. //停止
  29. void IIC_Stop(void)
  30. {        
  31.         SCL = 0;
  32.         SDA = 0;
  33.         Delay5us();
  34.         SCL = 1;
  35.         SDA = 1;
  36.         Delay2us();
  37.         SCL = 0;
  38.         
  39. }

  40. //答應
  41. void IIC_Ack(void)
  42. {
  43.         SCL = 0;
  44.         SDA = 0;
  45.         Delay5us();
  46.         SCL = 1;
  47.         Delay5us();
  48.         SCL = 0;
  49. }

  50. //不答應
  51. void IIC_NAck(void)
  52. {
  53.         SCL = 0;
  54.         SDA = 1;
  55.         Delay5us();
  56.         SCL = 1;
  57.         Delay5us();
  58.         SCL = 0;
  59. }

  60. //等待答應
  61. bit IIC_Wait_Ack(void)
  62. {
  63.         uint8_t temp = 0;
  64.         SDA = 1;
  65.         Delay2us();
  66.         SCL = 1;
  67.         Delay5us();
  68.         while(SDA)
  69.         {
  70.                 temp++;
  71.                 if(temp>250)
  72.                 {
  73.                         IIC_Stop();
  74.                         return 1;                //沒有答應返回1
  75.                 }
  76.         }
  77.         SCL = 0;
  78.         return 0;                        //有答應,返回0
  79. }

  80. //發動1個字節
  81. void IIC_Send_Byte(uint8_t dat)
  82. {
  83.         uint8_t t;
  84.         SCL = 0;
  85.         for(t=0;t<8;t++)
  86.         {
  87.                 SDA = (dat&0x80)>>7;
  88.                 dat=dat<<1;
  89.                 SCL = 1;
  90.                 Delay2us();
  91.                 SCL= 0;
  92.                 Delay2us();
  93.         }
  94. }

  95. //讀1個字節,ack=1時,發送ACK,ack=0,發送nACK
  96. uint8_t IIC_Read_Byte(bit ack)
  97. {
  98.         uint8_t i,receive = 0;
  99.         for(i=0;i<8;i++)
  100.         {
  101.                 SCL = 0;
  102.                 Delay2us();
  103.                 SCL = 1;
  104.                 receive<<=1;
  105.                 if(SDA)
  106.                 {
  107.                         receive++;
  108.                 }
  109.                 Delay2us();
  110.         }
  111.         if(!ack)
  112.         {
  113.                 IIC_NAck();
  114.         }
  115.         else
  116.         {
  117.                 IIC_Ack();
  118.         }
  119.         return receive;
  120. }


  121. //*************************液晶寫命令************************
  122. bit LCD_Write_CMD(uint8_t cmd)
  123. {
  124.         uint8_t LCD_cmd = 0x0C;
  125.         uint8_t LCD_EN;
  126.         uint8_t        Cmd_Temp;
  127.         Cmd_Temp = cmd;
  128.         cmd=cmd<<4;                 //低四位移到高四位
  129.         cmd = cmd|LCD_cmd;
  130.         
  131.         IIC_Start();   //啟動總線
  132.         IIC_Send_Byte(LCD_ADD<<1|0); //發送器件地址
  133.     if(IIC_Wait_Ack())
  134.         {
  135.                 IIC_Stop();
  136.                 LED = 0;
  137.                 return 1;
  138.         }
  139.         
  140.         IIC_Send_Byte(cmd);                //發送低四位數據
  141.     if(IIC_Wait_Ack())
  142.         {
  143.                 IIC_Stop();
  144.                 return 1;
  145.         }
  146.         Delay1s();
  147.         
  148.         cmd = Cmd_Temp|LCD_cmd;
  149.         IIC_Send_Byte(cmd);                //發送高四位數據
  150.     if(IIC_Wait_Ack())
  151.         {
  152.                 IIC_Stop();
  153.                 return 1;
  154.         }
  155.         Delay1s();
  156.         
  157.         LCD_EN |=(1<<(3-1));                //E = 1
  158.         IIC_Send_Byte(LCD_EN);                //發送使能數據
  159.         Delay2us();
  160.         LCD_EN &=~(1<<(3-1));                //E = 0
  161.         IIC_Send_Byte(LCD_EN);                //發送使能數據
  162.         Delay2us();
  163.         
  164.         IIC_Stop(); //結束總線
  165.         return 0;
  166. }

  167. //*************寫數據****************************
  168. bit LCD_Write_Data(uint8_t dat)
  169. {
  170.         uint8_t LCD_dat = 0x09;
  171.         uint8_t LCD_EN;
  172.         uint8_t        Dat_Temp;
  173.         dat = Dat_Temp;
  174.         dat=dat<<4;                 //低四位移到高四位
  175.         dat = dat|LCD_dat;

  176.         IIC_Start();   //啟動總線
  177.         IIC_Send_Byte(LCD_ADD<<1|0); //發送器件地址
  178.     if(IIC_Wait_Ack())
  179.         {
  180.                 IIC_Stop();
  181.                 LED = 0;
  182.                 return 1;
  183.         }
  184.         
  185.         IIC_Send_Byte(dat);                //發送低四位數據
  186.     if(IIC_Wait_Ack())
  187.         {
  188.                 IIC_Stop();
  189.                 return 1;
  190.         }
  191.         Delay1s();

  192.         dat = Dat_Temp|LCD_dat;
  193.         IIC_Send_Byte(dat);                //發送高四位數據
  194.     if(IIC_Wait_Ack())
  195.         {
  196.                 IIC_Stop();
  197.                 return 1;
  198.         }
  199.         Delay1s();
  200.         
  201.         LCD_EN |=(1<<(3-1));                //E = 1
  202.         IIC_Send_Byte(LCD_EN);                //發送使能數據
  203.         Delay2us();
  204.         LCD_EN &=~(1<<(3-1));                //E = 0
  205.         IIC_Send_Byte(LCD_EN);                //發送使能數據
  206.         Delay2us();
  207.         
  208.         
  209.         IIC_Stop(); //結束總線
  210.     return        0;
  211. }


  212. //**********************顯示字符串*****************************
  213. void Show_string(unsigned char x,unsigned char y,unsigned char *s)
  214. {
  215.         unsigned char position;
  216.         
  217.         if (y == 0)
  218.         {
  219.                 position = 0x80 + x;
  220.         }
  221.         
  222.         else
  223.         {
  224.                 position = 0xc0 + x;
  225.         }
  226.                
  227.     LCD_Write_CMD(position);
  228.         while (*s)
  229.          {     
  230.                 LCD_Write_Data(*s);     
  231.                 s++;     
  232.          }
  233. }

  234. int main(void)
  235. {
  236.         Delay1s();
  237.         LCD_Write_CMD(0x28);
  238.         LCD_Write_CMD(0x28);
  239.         Delay1s();

  240.         LCD_Write_CMD(0x0C);        
  241.         LCD_Write_CMD(0x0C);
  242.         Delay1s();
  243.         LCD_Write_CMD(0x01);
  244.         LCD_Write_CMD(0x01);
  245.         Delay1s();
  246.         while(1)
  247.         {
  248.                
  249.         }
  250. }
復制代碼
以上就是我的全部程序了,本想將IIC和1602的程序單獨寫的,但是那樣報錯所以就沒那樣寫了!只是在SYS.h里面定義了數據類型和延時函數!請各位大佬幫忙解答一下,謝謝了!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:151348 發表于 2018-5-23 21:28 | 只看該作者
這個程序用11.0592MHz晶振,查查你這個PCF芯片的地址是多少,不同后綴的地址不同
回復

使用道具 舉報

板凳
ID:71233 發表于 2019-3-4 15:10 | 只看該作者
你沒有寫入命令到8574的IO口。上樓的朋友說對了,要清楚芯片的地址。
回復

使用道具 舉報

地板
ID:94031 發表于 2019-3-4 17:45 | 只看該作者
先要 LCD_Init();初始化,再調用子程序顯示字符,我看你就沒有初始化。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产乱码久久久久久闺蜜 | 成人日韩av | 国产精品成人在线播放 | av免费在线播放 | 国产精品精品视频一区二区三区 | www.精品一区 | 成人在线中文字幕 | 北条麻妃99精品青青久久 | 黄网免费看 | 精品视频一区二区三区在线观看 | 日韩精品视频在线 | 久久国产精品免费一区二区三区 | 国产欧美在线 | 99久久99 | 欧美福利 | 色狠狠桃花综合 | 日韩毛片 | 国产精品美女一区二区 | 亚洲一区二区三 | 米奇狠狠鲁 | 成人av播放 | 美女毛片免费看 | 涩涩操 | 亚洲欧美一区二区三区在线 | 日韩欧美中文 | 欧美日韩精品一区二区三区四区 | 欧美久久精品一级黑人c片 91免费在线视频 | 午夜av免费 | 日日综合 | 日本在线网址 | 国产精品免费一区二区 | 天天夜碰日日摸日日澡 | 中文字幕精品一区二区三区精品 | 欧美一级二级视频 | 久久视频免费观看 | 午夜视频一区二区三区 | 国产一区二区三区精品久久久 | 日韩精品 | 一区二区在线免费观看 | 蜜桃视频在线观看免费视频网站www | www.国产 |