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

標題: 實用任意三個單片機IO口連接LCD1602A液晶屏 [打印本頁]

作者: gdbin001    時間: 2020-2-27 15:13
標題: 實用任意三個單片機IO口連接LCD1602A液晶屏
之前看到一個牛人zhu123帖子,是用二線連接1602。只用2個IO口節省了資源,但效果不太好,顯示速度慢。改成三線后效果就很好,可以實用化。這種接法的原理就是利用電容的充電放電效應進行存儲數字位,類似動態存儲器的原理。原貼是用51匯編寫的,現在我用Arduino實現了三線連接的實用化。經實驗,瓷片電容選擇范圍可從10nf-100nf都可以。代碼有注釋,很好懂。
二線連接帖子位置http://www.zg4o1577.cn/bbs/dpj-20365-1.html

制作出來的實物圖如下:


單片機源程序如下:
  1. #define setXy(x,y) lcdWrite(0,(x<<6)|(y&15)|0x80)
  2. #define dataA  4
  3. #define dataB 5
  4. #define commPin  6

  5. void lcdWrite(byte RS,char dat)
  6. {
  7. byte i;
  8. for (i = 2; i > 0; --i) //運行兩次,分別對應字節高4位和低4位
  9.   {
  10.     digitalWrite( dataB,dat & 0x80);  //LED_D7口。置位數據口為1。如果D7是1,先給D7位的C4充電(C1、C2、C3也會充滿電,這里不用管),在跌到低電平之前,將其他3個位充好電,再將1602使能讀入,即可完成半個字節數據的讀入。
  11.     digitalWrite( dataA,dat & 0x20); //LED_D5口。置位數據口為1   
  12.     digitalWrite( commPin,RS);//置位命令口為1。如果RS是1,是數據,0是命令   
  13.     delayMicroseconds(400);  //683電容,延時400us   
  14.     digitalWrite( commPin,HIGH);  //置位命令口為1
  15.     digitalWrite( dataB,dat & 0x40); //LED_D6口。置位數據口為1   
  16.     digitalWrite( dataA,dat & 0x10); //LED_D4口。置位數據口為1         
  17.     delayMicroseconds(1);      //0.5us < t < 1.36us
  18.     digitalWrite( commPin,LOW);  //命令口清零,1602使能,讀入數據
  19.     delayMicroseconds(50);
  20.     dat <<= 4;
  21.   }        
  22. }
  23. void lcdPrint(char *p)
  24. {
  25.   while(*p) lcdWrite(1,*p++);
  26. }
  27. void lcdInit(void)
  28. {
  29.    byte i = 3;
  30.   digitalWrite( dataB,LOW);  //D7=0
  31.   digitalWrite( commPin,LOW);  //命令口清零
  32.   delayMicroseconds(400); //683電容,延時400us
  33.   do{
  34.       digitalWrite( dataB,LOW);  //D6=0
  35.       delayMicroseconds(1);
  36.       digitalWrite( dataA,HIGH);  //D5=1      
  37.       delayMicroseconds(400); //683電容,延時400us
  38.       if (i == 0) {digitalWrite( dataA,LOW); } //D4=0      
  39.       digitalWrite( commPin,HIGH);  //置位命令口為1
  40.       delayMicroseconds(3);
  41.       digitalWrite( commPin,LOW);  //命令口清零
  42.       delayMicroseconds(3);
  43.     }while(i--);   
  44.   delay(100);
  45.   lcdWrite(0,0x28);  //4線 2行 5x7
  46.   delay(50);;
  47.   lcdWrite(0,0x06);//輸入方式自動增量,沒有顯示移位
  48.   delay(50);;
  49.   lcdWrite(0,0x0c);//開啟顯示屏,光標不顯示,無閃爍
  50.   delay(50);;
  51.   lcdWrite(0,0x01);//清除顯示屏,地址計數器AC歸零
  52.   delay(50);;
  53. }
  54. int  adc;
  55. void setup()
  56. {
  57.   byte aa=45;
  58.   pinMode(dataA,OUTPUT);
  59.   pinMode(dataB,OUTPUT);
  60.   pinMode(commPin,OUTPUT);  
  61.   delay(100);
  62.   lcdInit();//對LCD進行初始化   
  63. }
  64. void loop()
  65. {
  66. setXy(0,0);
  67.   lcdPrint("                ");
  68.   setXy(0,0);
  69.   lcdPrint("The value is:");   
  70.   setXy(1,0);
  71.   lcdPrint("                ");
  72.   setXy(1,0);
  73.   lcdPrint("352");
  74.   delay(1000);
復制代碼

以上程序51hei提供下載:
三線連接1602.zip (1.11 KB, 下載次數: 42)



作者: Liangkan    時間: 2020-3-2 21:42
很好的東西,可惜不會Arduino,不能移植。
作者: raymondau    時間: 2020-3-3 00:27
樓主用的是什么單片機,M8可以嗎?
作者: gdbin001    時間: 2020-3-3 16:11
Liangkan 發表于 2020-3-2 21:42
很好的東西,可惜不會Arduino,不能移植。

參考zhu123的帖子,應該就可以了。
作者: gdbin001    時間: 2020-3-3 16:22
raymondau 發表于 2020-3-3 00:27
樓主用的是什么單片機,M8可以嗎?

M8我沒有用過。屬于Arduino系列應該可以用。
作者: raymondau    時間: 2020-3-3 21:17
gdbin001 發表于 2020-3-3 16:22
M8我沒有用過。屬于Arduino系列應該可以用。

好的,我試一下,謝謝!
作者: 20171185    時間: 2021-5-13 09:22
這個用stc89c52能實現嗎?
作者: 名字不是重點    時間: 2021-5-19 10:50
自個玩玩可以,別真把它做進產品。
作者: 無聊到處逛    時間: 2021-5-20 21:01
可以用上少腳的單片機
作者: 1588848    時間: 2022-12-12 21:03
自個玩玩可以,別真把它做進產品
作者: lkc8210    時間: 2022-12-13 13:27
8051版本


  1. #include <reg52.h>

  2. typedef         unsigned char        u8;  //0 to 255
  3. typedef         unsigned int        u16;  //0 to 65535
  4. typedef         unsigned long        u32;  //0 to 4294967295
  5. sbit EN_RS = P2^5;
  6. sbit D4_D6 = P2^6;
  7. sbit D5_D7 = P2^7;
  8. #define SetRS 0x01
  9. #define RstRS 0x00
  10. void Delay2ms()                //@12.000MHz
  11. {
  12.     unsigned char i, j;

  13.     i = 4;
  14.     j = 225;
  15.     do
  16.     {
  17.         while (--j);
  18.     }
  19.     while (--i);
  20. }
  21. void Delay200us()                //@12.000MHz
  22. {
  23.     unsigned char i;

  24.     i = 97;
  25.     while (--i);
  26. }
  27. void ThreeWire(u8 dat)
  28. {
  29.     EN_RS = (bit)(dat & 0x01);
  30.     D4_D6 = (bit)(dat & 0x40);
  31.     D5_D7 = (bit)(dat & 0x80);
  32.     Delay200us();
  33.     D4_D6 = (bit)(dat & 0x10);
  34.     D5_D7 = (bit)(dat & 0x20);
  35.     EN_RS = 1;
  36.     EN_RS = 0;
  37.     D4_D6 = 0;
  38.     D5_D7 = 0;
  39.     Delay200us();
  40. }
  41. void LCD_Init_4bit();
  42. void LCD_WChar_4bit(u8 Row, u8 Address, char chr);
  43. void LCD_WStr_4bit(u8 Row, u8 Address, char *Str);

  44. void LCD_WCMD(u8 Cmd)
  45. {
  46.     ThreeWire(RstRS | (Cmd & 0xF0));
  47.     ThreeWire(RstRS | (Cmd << 4));
  48. }
  49. void LCD_WDAT(u8 Dat)
  50. {
  51.     ThreeWire(SetRS | (Dat & 0xF0));
  52.     ThreeWire(SetRS | (Dat << 4));
  53. }
  54. void LCD_Init_4bit()
  55. {
  56.     LCD_WCMD(0x02);
  57.     LCD_WCMD(0x28);
  58.     LCD_WCMD(0x0c);
  59.     LCD_WCMD(0x06);
  60.     LCD_WCMD(0x01);
  61.     Delay2ms();
  62. }
  63. void LCD_WChar_4bit(u8 Row, u8 Address, char chr)
  64. {
  65.     if(Row == 1)LCD_WCMD(0x80 + Address);
  66.     if(Row == 2)LCD_WCMD(0xc0 + Address);

  67.     LCD_WDAT(chr);
  68. }
  69. void LCD_WStr_4bit(u8 Row, u8 Address, char *Str)
  70. {
  71.     if(Row == 1)LCD_WCMD(0x80 + Address);
  72.     if(Row == 2)LCD_WCMD(0xc0 + Address);
  73.     while(*Str)
  74.     {
  75.         LCD_WDAT(*Str);
  76.         Str++;
  77.     }
  78. }
  79. void Delay1000ms()                //@12.000MHz
  80. {
  81.     unsigned char i, j, k;

  82.     i = 8;
  83.     j = 154;
  84.     k = 122;
  85.     do
  86.     {
  87.         do
  88.         {
  89.             while (--k);
  90.         }
  91.         while (--j);
  92.     }
  93.     while (--i);
  94. }

  95. u8 Count = 0;
  96. void main()
  97. {
  98.     EN_RS = 0;
  99.     D4_D6 = 0;
  100.     D5_D7 = 0;
  101.     LCD_Init_4bit();
  102.     LCD_WStr_4bit(1,0,"Hello World!");
  103.     LCD_WStr_4bit(2,0,"3 Wire LCD");
  104.     while (1)
  105.     {
  106.         LCD_WChar_4bit(2,13,Count/100%10 + '0');
  107.         LCD_WChar_4bit(2,14,Count/10%10 + '0');
  108.         LCD_WChar_4bit(2,15,Count%10 + '0');
  109.         Count++;
  110.         Delay1000ms();
  111.     }
  112. }
復制代碼








歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久久精品中文字幕 | 欧美区在线 | 蜜桃视频一区二区三区 | 在线视频中文字幕 | 精品中文视频 | 黄色欧美大片 | 欧美视频中文字幕 | 日本羞羞影院 | 国产色片| 亚洲欧美成人在线 | 国产精品成人一区二区三区夜夜夜 | 日批免费在线观看 | 免费一区二区三区 | 久久久一 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 欧美在线一区二区三区 | 四虎成人av | 国产午夜精品久久 | 免费精品久久久久久中文字幕 | 国产偷录视频叫床高潮对白 | 欧美一区二区网站 | 欧美视频成人 | 开操网 | 三级视频久久 | 99亚洲精品 | 香蕉久久网 | 成人妇女免费播放久久久 | 欧美中文字幕一区二区三区亚洲 | 久久精品网| 日本精品一区二区三区视频 | 91免费在线视频 | 精品少妇一区二区三区在线播放 | 国产日韩欧美中文 | 很黄很污的网站 | 日韩视频一区二区三区 | 欧美电影大全 | 99re在线视频 | 久久久精品视频一区二区三区 | 精品久久久久久红码专区 | 亚洲一区二区成人 | 国产99久久久国产精品 |