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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

LCD1602的8個數據口,怎么定義到單片機引腳

  [復制鏈接]
跳轉到指定樓層
樓主
我原來用STC89C52做的LCD1602顯示,現在想改成個頭小的STC15F204,哪位大神可以告知




51hei圖片編輯_20200106172039.jpg (33.84 KB, 下載次數: 121)

現在想把引腳改成這樣,應該怎么寫程序呢

現在想把引腳改成這樣,應該怎么寫程序呢

1578302482(1).png (35.71 KB, 下載次數: 129)

原來直接定義到P0口 #define lcddata P0

原來直接定義到P0口    #define lcddata P0
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:403593 發表于 2020-1-6 19:47 | 只看該作者
這樣做不行,8位的并口,所有的數據線必須都在單片機的同一組IO口上
回復

使用道具 舉報

板凳
ID:213173 發表于 2020-1-6 21:19 | 只看該作者
給你寫一個異組端口驅動LCD示例


  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit LCD_RW=P2^5;
  5. sbit LCD_RS=P2^6;       
  6. sbit LCD_EN=P2^7;       

  7. sbit code0=P1^1;                                        //定義LCD數據端口
  8. sbit code1=P1^0;
  9. sbit code2=P3^7;
  10. sbit code3=P3^6;
  11. sbit code4=P3^3;
  12. sbit code5=P3^2;
  13. sbit code6=P3^1;
  14. sbit code7=P3^0;       

  15. uchar table1[]="0123456789ABCDEFG";                //第一行
  16. uchar table2[]="HIJKLMNOPQRSTUVWX";        //第二行


  17. void PX(uchar i)                                        //寫入8位數據
  18. {   
  19.     code0=i&0x01;i>>=1;       
  20.     code1=i&0x01;i>>=1;
  21.     code2=i&0x01;i>>=1;
  22.     code3=i&0x01;i>>=1;
  23.     code4=i&0x01;i>>=1;
  24.     code5=i&0x01;i>>=1;
  25.     code6=i&0x01;i>>=1;
  26.     code7=i&0x01;
  27. }
  28. /*******100us延時程序********/
  29. void delay(uint x)
  30. {
  31.         uint a,b;
  32.         for(a=x;a>0;a--)
  33.                 for(b=10;b>0;b--);
  34. }
  35. /*******液晶寫指令程序********/
  36. void write_com(uchar com)
  37. {
  38.         LCD_RW=0;
  39.         LCD_EN=0;        //初始設置LCD_EN低電平
  40.         LCD_RS=0;        //允許寫指令
  41.         PX(com);                //傳遞指令
  42.         delay(10);        //延時1ms
  43.         LCD_EN=1;        //使能寫入
  44.         delay(10);        //延時1ms
  45.         LCD_EN=0;        //低跳變執行
  46.        
  47. }
  48. /*******液晶寫數據程序********/
  49. void write_date(uchar date)
  50. {
  51.         LCD_RW=0;
  52.         LCD_RS=1;        //允許寫數據
  53.         PX(date);        //傳遞數據
  54.         delay(10);        //延時1ms
  55.         LCD_EN=1;        //使能寫入
  56.         delay(10);        //延時1ms
  57.         LCD_EN=0;        //低跳變執行
  58.        
  59. }
  60. /*******液晶初始化程序********/
  61. void init()                //設置顯示模式、
  62. {

  63.         write_com(0x38);//設置16*2顯示,5*7點陣,8位數據接口
  64.         write_com(0x01);//顯示清零,數據指針清零
  65.         write_com(0x0c);//設置開顯示,不顯光標
  66.         write_com(0x06);//設置寫一個字符后地址指針加1
  67.         write_com(0x80);//數據指針初始化,設置顯示初始位置
  68. }
  69. /**********************主程序*************************/
  70. void main()
  71. {
  72.         uchar i;                                        //定義循環變量
  73.         init();                                                //初始化程序
  74. /******用for循環按字節逐個寫********/
  75.         write_com(0x80);                        //數據指針第一行起始0x80位置
  76.         for(i=0;i<16;i++)                        //每循環一次寫一個字節數據
  77.         {
  78.                 write_date(table1[i]);        //寫一個字節數據               
  79.         }
  80.         write_com(0xc0);                        //數據指針第二行起始位置0x80+0x40=0xc0
  81.         for(i=0;i<16;i++)                        //每循環一次寫一個字節數據
  82.         {
  83.                 write_date(table2[i]);        //寫一個字節數據               
  84.         }
  85.         while(1);
  86. }
復制代碼



評分

參與人數 1黑幣 +15 收起 理由
m182892 + 15

查看全部評分

回復

使用道具 舉報

地板
ID:155507 發表于 2020-1-6 21:57 | 只看該作者
LCD1602還有一種使用高4位數據線的接法,可以減少單片機的負擔。
另外,RW的控制也并非是必用的,如果僅僅是用于讀取LCD1602“忙”的狀態,就可以用稍事等待來代替。這樣一來,RW就可以直接接地,使LCD1602永遠處于寫入的狀態。

那么,LCD1602和單片機之間就僅僅需要6條線了,這就是LCD1602最簡潔的連接方法。



  1. /*
  2. 詳解一種LCD1602 的4線接法
  3. LCD1602還有一種使用高4位數據線的接法,可以減少單片機的負擔。
  4. 另外,RW的控制也并非是必用的,如果僅僅是用于讀取LCD1602“忙”的狀態,就可以用稍事等待來代替。這樣一來,RW就可以直接接地,使LCD1602永遠處于寫入的狀態。

  5. 那么,LCD1602和單片機之間就僅僅需要6條線了,這就是LCD1602最簡潔的連接方法。

  6. */
  7. #include <reg51.h>
  8. #include <stdio.h>

  9. #define Hi 1
  10. #define Lo 0

  11. #ifndef TRUE
  12. #define TRUE 1
  13. #endif

  14. #ifndef FALSE
  15. #define FALSE 0
  16. #endif

  17. #define RIGHT 0
  18. #define LEFT  1

  19. void init_lcd(void);      //LCD初始化
  20. //void write_high_lcd(unsigned char Val);
  21. void gotoxy_lcd(unsigned char col,unsigned char line);  //按指定坐標
  22. void putc_lcd(unsigned char byte);        //顯示一個字符
  23. void print_lcd(char String[]);            //顯示一串字符
  24. void delay_lcd(void);                     //LCD顯示延時
  25. void write_lcd(unsigned char Val);        //發送一個字符
  26. //void write_low_lcd(unsigned char Val);
  27. void write_command_lcd(char cmd);         // 寫入指令
  28. //void scroll_lcd(char enable, char dir);
  29. //void clear_lcd();
  30. void write_nibble_lcd(unsigned char Val);  //使用的是4位數據傳輸

  31. //數據口
  32. sbit RS = P3^7;  //LCD寄存器選擇
  33. sbit En = P3^6;  //LCD使能控制
  34. sbit D0 = P3^3; //由4位的接線是接到LCD口的高四位
  35. sbit D1 = P3^2;
  36. sbit D2 = P3^1;
  37. sbit D3 = P3^0;


  38. void delay (unsigned int m) //延時函數
  39. { while(--m); }

  40. void delay_lcd (void) //LCD顯示延時
  41. {
  42.         unsigned int del1, del2;
  43.         for(del1=0;del1<10;del1++)
  44.         {
  45.                 for(del2=0;del2<200;del2++);
  46.         }
  47. }


  48. void init_lcd (void)    //LCD初始化
  49. {
  50.         RS = Lo;  //寫入命令   0 選擇發送命令    1 選擇發送數據
  51.         write_nibble_lcd(0x03);        delay_lcd();
  52.         write_nibble_lcd(0x03);        delay_lcd();
  53.         write_nibble_lcd(0x02);        delay_lcd();
  54.         write_lcd(0x28);    //在四位線下的初始化
  55.         write_lcd(0x06);    //寫一個指針加1
  56.         write_lcd(0x0c);    //開顯示不顯示光標
  57.         write_lcd(0x01);    //清屏
  58. }  

  59. void gotoxy_lcd(unsigned char col,unsigned char line) //按指定坐標
  60. {
  61.         RS = Lo;  //寫入命令   0 選擇發送命令    1 選擇發送數據
  62.         if (line == 1)
  63.         write_lcd(0x7f+col);
  64.         if (line == 2)
  65.         write_lcd(0xbf+col);
  66. }

  67. void write_command_lcd(char cmd)  // 寫入指令
  68. {
  69.         RS = Lo;
  70.         write_lcd(cmd);
  71.    
  72. }

  73. void putc_lcd(unsigned char byte) //顯示一個字符
  74. {
  75.         RS = Hi;  //寫入數據   0 選擇發送命令    1 選擇發送數據
  76.         write_lcd(byte);
  77. }

  78. void print_lcd(char String[]) //顯示一串字符
  79. {
  80.         int i = 0;
  81.         do
  82.         {
  83.                 putc_lcd(String[i]);
  84.                 i++;
  85.         }
  86.         while(String[i] != '\0');
  87. }

  88. void write_lcd(unsigned char Val) //發送一個字符
  89. {
  90.         write_nibble_lcd(Val >> 4);
  91.         write_nibble_lcd(Val);
  92.         delay_lcd();
  93. }

  94. void write_nibble_lcd(unsigned char Val) //使用的是4位數據傳輸
  95. {
  96.         En = Hi;   //寫入時序
  97.         D0 = D1 = D2 = D3 = 0;
  98.         if(Val & 0x01)
  99.         D0 = 1;
  100.         if(Val & 0x02)
  101.         D1 = 1;
  102.         if(Val & 0x04)
  103.         D2 = 1;
  104.         if(Val & 0x08)
  105.         D3 = 1;
  106.         En = Lo;   //使能清零
  107. }


  108. void main() //主函數
  109. {
  110.        
  111.         init_lcd(); //LCD初始化
  112.         write_command_lcd(0x01);  //清屏
  113.         gotoxy_lcd(1,2);
  114.         print_lcd("Hello 4 Bit LCD");
  115.         gotoxy_lcd(1,1);
  116.         while(1)
  117.         {
  118.                 putc_lcd('a'); putc_lcd('b'); delay(65255);delay(65255);
  119.         }
  120. }

復制代碼





回復

使用道具 舉報

5#
ID:160500 發表于 2020-1-6 22:01 | 只看該作者
這樣寫程序很麻煩的,要控制好LCD1602的控制信號,把數據分開到不同的IO口,讀取的時候還要合并數據,麻煩。
回復

使用道具 舉報

6#
ID:444039 發表于 2020-1-6 22:47 | 只看該作者
隨便定義,定義后寫一個子程序,在子程序中對數據轉移至相應位的引腳中即可。
回復

使用道具 舉報

7#
ID:475247 發表于 2020-1-7 10:55 | 只看該作者
P1與P3口都可以用,如果你要用外部中斷就只能用P1口,具體看你的要求來定
回復

使用道具 舉報

8#
ID:307020 發表于 2020-1-8 00:38 | 只看該作者
并行數據需要按順序接到1個完整的8位口上去
回復

使用道具 舉報

9#
ID:584814 發表于 2020-1-8 10:50 | 只看該作者
用1602的4+2線方案吧,省P口。
還可以花2塊錢淘個IIC接口,只要2線就可以,還可以控制背光。
以上線數不包括電源的2線。
回復

使用道具 舉報

10#
ID:130230 發表于 2020-1-8 11:38 | 只看該作者
接到一組IO口
回復

使用道具 舉報

11#
ID:608872 發表于 2020-1-8 11:51 | 只看該作者
wulin 發表于 2020-1-6 21:19
給你寫一個異組端口驅動LCD示例

謝謝,順利移植成功
回復

使用道具 舉報

12#
ID:608872 發表于 2020-1-8 15:23 | 只看該作者
angmall 發表于 2020-1-6 21:57
LCD1602還有一種使用高4位數據線的接法,可以減少單片機的負擔。
另外,RW的控制也并非是必用的,如果僅僅 ...

謝謝,顯示成功了。這個高4位的接法是不是要比8位的刷新慢呢?我原來8位的3秒刷新顯示,用4位的要12秒
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久69精品久久久久久久电影好 | 青青久久| 欧美精品影院 | 日韩欧美在线一区 | 亚洲国产精品99久久久久久久久 | 国产九九九 | 神马久久久久久久久久 | 日韩精品无码一区二区三区 | 久久成人精品视频 | 亚洲欧美在线视频 | av网站免费看 | 色一级片 | 亚洲精品一区国产精品 | 国产精品99久久久久久宅男 | 福利片在线 | 欧美一级片a | 亚洲免费一区二区 | 中文字幕在线视频精品 | 精品成人69xx.xyz | 亚洲一区二区三区免费视频 | 一区二区三区四区免费观看 | 男人天堂av网站 | 视频三区 | 国产一区二区成人 | 日日干夜夜操 | 亚洲精品字幕 | 在线视频成人 | 国产黄色在线观看 | 日韩在线播放av | 超黄毛片 | 国产精品综合 | 97人人草| 欧美一区二区在线 | 一区二区中文字幕 | 懂色av一区二区三区在线播放 | 伊人网国产 | 国产激情在线 | 国产日韩精品在线 | 国内精品久久久久久 | 你懂的在线视频播放 | 亚洲一区二区精品视频 |