找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1857|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

74HC595+單片機(jī)3個IO口驅(qū)動LCD1602 利用位尋址變量 Proteus仿真程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:137736 發(fā)表于 2022-11-27 16:33 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
完全使用3個IO口驅(qū)動LCD1602
8051三線傳送數(shù)據(jù)到74HC595,驅(qū)動LCD1602.利用位變量可位操作,程序更加簡單。根據(jù)網(wǎng)上別人的程序改編而來。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


/*hc595->1602管腳連接bin(D7,D6,D5,D4,0,E,RW,RS)*/
#include <reg52.h>
//8051->hc595引腳定義
sbit LCD1602_SHCP=P3^6;        //in clock
sbit LCD1602_DS=P3^4;         //in data
sbit LCD1602_STCP=P3^5;          //out clock

//兩種數(shù)據(jù)類型
typedef unsigned char uchar;
typedef unsigned int uint;

//定義數(shù)據(jù)槽
//uchar RS,RW,E,D4,D5,D6,D7;
bdata uchar sendData;
sbit RS = sendData^0;
sbit RW = sendData^1;
sbit E = sendData^2;

單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #include "lcd595.h"

  3. const uchar type_t[]={
  4.   0x1f,0x02,0x02,0x02,
  5.         0x02,0x02,0x02,0x00
  6. };

  7. const uchar line1[]="Have a nice day!";
  8. const uchar line2[]="HE Wcommands";

  9. void main()
  10. {
  11.         uchar i;
  12.         LcdInit();
  13.         LcdWriteCGRAM(0x00,type_t);
  14.         LcdWriteData(0x00);
  15.         LcdWriteCom(0x81);
  16.         LcdPrintf("HE With");
  17.         LcdWriteCom(0xc0);
  18.         LcdPrintf("Commands");
  19.         Lcd1602_Delay1ms(1000);
  20.         LcdWriteCom(0x01);
  21.         while(1){
  22.                 for(i=0;i<16;i++){
  23.                         LcdWriteCom(0x80+i);
  24.                         LcdWriteData(line1[i]);
  25.                         Lcd1602_Delay1ms(100);
  26.                 }
  27.                 Lcd1602_Delay1ms(500);
  28.                 LcdWriteCom(0xc1);
  29.                 LcdWriteData(0x00);
  30.                 Lcd1602_Delay1ms(100);
  31.                 for(i=0;i<12;i++){
  32.                         LcdWriteCom(0xc2+i);
  33.                         LcdWriteData(line2[i]);
  34.                         Lcd1602_Delay1ms(100);
  35.                 }
  36.                 LcdWriteCom(0x01);
  37.                 Lcd1602_Delay1ms(100);
  38.         }
  39. }
復(fù)制代碼
  1. /*hc595->1602管腳連接bin(D7,D6,D5,D4,0,E,RW,RS)*/
  2. #include <reg52.h>
  3. //8051->hc595引腳定義
  4. sbit LCD1602_SHCP=P3^6;        //in clock
  5. sbit LCD1602_DS=P3^4;         //in data
  6. sbit LCD1602_STCP=P3^5;          //out clock

  7. //兩種數(shù)據(jù)類型
  8. typedef unsigned char uchar;
  9. typedef unsigned int uint;

  10. //定義數(shù)據(jù)槽
  11. //uchar RS,RW,E,D4,D5,D6,D7;
  12. bdata uchar sendData;
  13. sbit RS = sendData^0;
  14. sbit RW = sendData^1;
  15. sbit E = sendData^2;
  16. sbit D4 = sendData^3;
  17. sbit D5 = sendData^4;
  18. sbit D6 = sendData^5;
  19. sbit D7 = sendData^6;

  20. void Lcd1602_Delay1ms(uint c); //延時函數(shù),延時1ms
  21. void LCD1602_DATAPINS(uchar value); //更改74HC595連接LCD1602的數(shù)據(jù)
  22. void LcdCalc(uchar i); //確定4位總線
  23. void LcdWriteCom(uchar com); //向LCD寫入一個字節(jié)的命令
  24. void LcdWriteData(uchar dat); //向LCD寫入一個字節(jié)的數(shù)據(jù)
  25. void LcdInit(); //初始化LCD屏
  26. void LcdPrintf(uchar *s); //向屏幕輸出字符
  27. void LcdWriteCGRAM(uchar index,uchar *p); //建立一個自定義字符
  28. void LCDPrintNum(uint num,uchar wei); //顯示數(shù)字

  29. /*******************************************************************************
  30. * 函 數(shù) 名         : Lcd1602_Delay1ms
  31. * 函數(shù)功能                   : 延時函數(shù),延時1ms
  32. * 輸    入         : c
  33. * 輸    出         : 無
  34. * 說    名         : 該函數(shù)是在12MHZ晶振下,12分頻單片機(jī)的延時。
  35. *******************************************************************************/
  36. void Lcd1602_Delay1ms(uint c)   //誤差 0us
  37. {
  38.         uchar a,b;
  39.         for(;c>0;c--){
  40.                 for(b=199;b>0;b--){
  41.                         for(a=1;a>0;a--);
  42.                 }
  43.         }
  44. }
  45. /*******************************************************************************
  46. * 函 數(shù) 名         : LCD1602_DATAPINS
  47. * 函數(shù)功能                   : 更改74HC595連接LCD1602的數(shù)據(jù)
  48. * 輸    入         : value
  49. * 輸    出         : 無
  50. 74HC595傳送數(shù)據(jù)的常用寫法
  51. *******************************************************************************/   
  52. void LCD1602_DATAPINS(uchar value)
  53. {
  54.     uchar i;
  55.     for(i=0;i<8;i++)
  56.     {
  57.         LCD1602_DS=value&0x80;//取數(shù)據(jù)高位
  58.         if(LCD1602_DS==0x80){ //判斷數(shù)據(jù)高位是否為1
  59.             LCD1602_DS=1;//如果高位為1,DS置1
  60.         }
  61.         else{
  62.             LCD1602_DS=0;//否則DS置0
  63.         }
  64.         LCD1602_SHCP=0;
  65.         LCD1602_SHCP=1;//上升沿使這一位寫入移位寄存器
  66.         value<<=1;//數(shù)據(jù)左移1位,數(shù)據(jù)的第7位變?yōu)樽罡呶,循環(huán)第8次時數(shù)據(jù)的最低位也變成最高位
  67.     }
  68.     LCD1602_STCP=0;
  69.     LCD1602_STCP=1;//給STCP一個上升沿,將for循環(huán)中輸入的數(shù)據(jù)移入輸出鎖存寄存器,刷新輸出數(shù)據(jù)
  70. }

  71. void LcdWriteCom(uchar com)          //寫入命令
  72. {
  73.         //LcdCalc(com>>4);        //發(fā)送高四位
  74. ……………………

  75. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

Keil代碼與Proteus仿真下載: 利用可位尋址變量-hc595-1602.zip (102.37 KB, 下載次數(shù): 30)

評分

參與人數(shù) 1黑幣 +90 收起 理由
admin + 90 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表