0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

74HC595驅(qū)動(dòng)8*8點(diǎn)陣LED的原理分析

CHANBAEK ? 來源:電子e學(xué)堂 ? 作者:楊風(fēng)健 ? 2023-12-16 16:35 ? 次閱讀

一、8*8點(diǎn)陣結(jié)構(gòu)

下面圖片是8*8點(diǎn)陣內(nèi)部結(jié)構(gòu)原理圖,一共有16根引腳,如果直接用8位單片機(jī)進(jìn)行控制的話,需要占用單片機(jī)2個(gè)端口(如:P1,P2),實(shí)質(zhì)上就是控制64個(gè)LED燈的亮滅,比如我想讓左上角第一個(gè)LED燈亮起,其它燈全滅,那么需要讓h1輸出高電平,L1輸出低電平就可以了。注意要將L2-L8保持在高電平,否則第一行的其它燈也會(huì)亮。

圖片

二、串并轉(zhuǎn)換(74HC595)

上面這種控制方式雖然簡(jiǎn)單,但是占用單片機(jī)的IO口線過多,所以,我們經(jīng)常會(huì)利用74HC595這樣的串并轉(zhuǎn)換芯片作為驅(qū)動(dòng)芯片,一個(gè)595具有8個(gè)驅(qū)動(dòng)輸出端(QA-QH),那么我們這里需要2個(gè)595就夠用了。通過第一片595的SQH管腳進(jìn)行級(jí)聯(lián),將數(shù)據(jù)送至第二片595的數(shù)據(jù)輸入端,這樣單片機(jī)只需要3根線就可以實(shí)現(xiàn)對(duì)2片595的輸出控制。

圖片

三、控制時(shí)序

對(duì)于編寫595的驅(qū)動(dòng)程序來說,看時(shí)序圖是最直接了當(dāng)?shù)姆绞?,手?cè)上會(huì)說的比較多,簡(jiǎn)化來說,就是DATA_IN管腳用來輸入數(shù)據(jù)(實(shí)際上就是高低電平),然后SHIFT-CLK管腳提供時(shí)鐘,每當(dāng)SHIFT-CLK的上升沿到來,595會(huì)讀入DATA_IN管腳的電平狀態(tài),并存儲(chǔ)在內(nèi)部的鎖存器中,當(dāng)8個(gè)上升沿讀取結(jié)束后,第一片595的8個(gè)數(shù)據(jù)已經(jīng)全部讀完,但是我們這里是級(jí)聯(lián)的接法,所以還要繼續(xù)讀8個(gè)上升沿,然后數(shù)據(jù)從SQH管腳傳給第二片595的DATA_IN管腳,到這時(shí),16個(gè)上升沿的數(shù)據(jù)都讀進(jìn)595內(nèi)部并存儲(chǔ)起來了,注意此時(shí)還沒有放到QA-QH這16個(gè)輸出口線上,接下來需要LATCH-CLK給出一個(gè)下降沿,才將16個(gè)管腳的電平狀態(tài)進(jìn)行實(shí)際輸出。

看下時(shí)許圖,就可以一目了然:

圖片

四、程序編寫(靜態(tài)顯示)

//先做宏定義,目的是給單片機(jī)的管腳起個(gè)別名,便于我們能夠見名知義。共用到3個(gè)IO口。

//初始化時(shí)用到的端口
#define    cBRDDOT_Port_Shift  GPIO_P4
#define    cBRDDOT_Pin_Shift  GPIO_Pin_2
#define    cBRDDOT_Port_DIn  GPIO_P4
#define    cBRDDOT_Pin_DIn    GPIO_Pin_1
#define    cBRDDOT_Port_Latch  GPIO_P4
#define    cBRDDOT_Pin_Latch  GPIO_Pin_3
//定義讓端口輸出高低電平
#define    cBRDDOT_Bit_Shift  P42
#define    cBRDDOT_Bit_DIn    P41
#define    cBRDDOT_Bit_Latch  P43

//接下來做管腳的初始化,全部初始化為輸出。

//設(shè)置Shift的管腳,處于輸出模式
  GPIO_SetMode(cBRDDOT_Port_Shift, cBRDDOT_Pin_Shift, GPIO_Mode_OUT_PP);
  //設(shè)置DIn的管腳,處于輸出模式
  GPIO_SetMode(cBRDDOT_Port_DIn, cBRDDOT_Pin_DIn, GPIO_Mode_OUT_PP);
  //設(shè)置Latch的管腳,處于輸出模式
  GPIO_SetMode(cBRDDOT_Port_Latch, cBRDDOT_Pin_Latch, GPIO_Mode_OUT_PP);

//接下來目標(biāo)是點(diǎn)亮左上角第一個(gè)LED,下面是實(shí)現(xiàn)時(shí)序的代碼

void  DOT_ScanOut(void)  
{
  u8  V,  i;
  
  cBRDDOT_Bit_Latch  =  1;//看時(shí)序圖,latch管腳一開始為高電平,這里輸出1
  cBRDDOT_Bit_Shift  =  0;//時(shí)鐘shift-clk一開始為低電平
  {
    V  =  0xfe;//這里是進(jìn)行點(diǎn)陣的行選擇,為什么是FE,11111110,最低位為0,目的是要選中第一行的8個(gè)LED,
    for  (i=0;i< 8;i++)
    {
      if  (V  &  0x80)//每次都將最高位取出來,1000000 & 8位二進(jìn)制,只有最高位有效
        cBRDDOT_Bit_DIn  =  1;//如果最高位為高電平,則把DATA-IN輸出高電平,這時(shí)候我們就把數(shù)據(jù)放上去了。
      else
        cBRDDOT_Bit_DIn  =  0;//否則輸出低電平
      V  < <=  1;//數(shù)據(jù)向左移一位,原來的次高位變?yōu)樽罡呶?,原來的最低為補(bǔ)0,直到8個(gè)位全部讀完。


      cBRDDOT_Bit_Shift  =  0;
      cBRDDOT_Bit_Shift  =  1;//將SHIFT-CLK管腳電平由0變?yōu)?,上升沿產(chǎn)生,這時(shí)595會(huì)讀入DATA-IN的電平狀態(tài)并保存
      cBRDDOT_Bit_Shift  =  1;
      cBRDDOT_Bit_Shift  =  0;//恢復(fù)低電平
    }
  }
  //上面的代碼執(zhí)行完,可以理解為我們已經(jīng)選中了一行(第一行0XFE)
  //接下來就是要把這一行要亮的燈點(diǎn)亮。
  {
    V  =  0x80;//這里的邏輯是正的,1就代表亮,0代表滅。最左面的燈處于最高位位置。
    for  (i=0;i< 8;i++)
    {
      if  (V  &  0x80)
        cBRDDOT_Bit_DIn  =  1;
      else
        cBRDDOT_Bit_DIn  =  0;
      V  < <=  1;


      cBRDDOT_Bit_Shift  =  0;
      cBRDDOT_Bit_Shift  =  1;
      cBRDDOT_Bit_Shift  =  1;
      cBRDDOT_Bit_Shift  =  0;
    }
    //8次循環(huán)結(jié)束,那么就將要這一行要顯示的數(shù)據(jù)(要點(diǎn)亮的LED燈)也存到595內(nèi)部了。
  }
  cBRDDOT_Bit_Latch  =  0;//將LATCH-CLK拉成低電平,這時(shí)下降沿產(chǎn)生,595會(huì)把存儲(chǔ)的數(shù)據(jù)真正給到輸出口上,對(duì)應(yīng)的LED會(huì)亮起。
  cBRDDOT_Bit_Shift  =  0;
}

圖片

、程序編寫(動(dòng)態(tài)掃描)****

//但是現(xiàn)在有個(gè)問題是,我們剛才的代碼只能同時(shí)控制一行的LED亮滅,如果想同時(shí)控制8行來顯示圖案的話,就要用動(dòng)態(tài)掃描的方式,從第1行到第8行快速切換,然后放入數(shù)據(jù),形成視覺暫留的效果,讓人眼誤以為是同時(shí)在顯示。

//也就是說,我們需要一個(gè)定時(shí)中斷,每次中斷過來我都要更新一行的數(shù)據(jù)。那么我們就要把上面的程序放到中斷服務(wù)函數(shù)里面。

//先進(jìn)行初始化設(shè)置,這里用的是timer2
  Timer2_Init_AsTimer(False,0, 252, 112);
  Timer2_EnaInterrupt();
  Timer2_StartWork();

//全局變量

u8  code  cBRDDOT_Colomn_Sel[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//每一行的模值
u8  xdata  vBRDDOT_Values[8]={0x24,0x7e,0xff,0xff,0x7e,0x3e,0x1b,0x00};//心形圖案

// 下面是中斷服務(wù)程序

void  BRDDOT_ScanOut(void)  interrupt  IntNo_Timer2
{
  u8  V,  i;
  //這2行代碼的目的是讓vBRDDOT_ColIndex在0-7之間不斷循環(huán),
  //比如當(dāng)vBRDDOT_ColIndex為8時(shí),二進(jìn)制對(duì)應(yīng)0000 10000,和0000 0111進(jìn)行與運(yùn)算,8變?yōu)?.
  vBRDDOT_ColIndex++;
  vBRDDOT_ColIndex  &=  7;


  cBRDDOT_Bit_Latch  =  1;
  cBRDDOT_Bit_Shift  =  0;
  //輸出Col
  {
    //行選擇,這里的V就不能是固定值了,因?yàn)橐鹦酗@示,每一次進(jìn)來會(huì)更新一行。
    //需要在第1到第8行不斷選擇,所以cBRDDOT_Colomn_Sel數(shù)組里面應(yīng)該放好進(jìn)行每一行選擇的IO模值
    V  =  cBRDDOT_Colomn_Sel[vBRDDOT_ColIndex];
    for  (i=0;i< 8;i++)
    {
      if  (V  &  0x80)
        cBRDDOT_Bit_DIn  =  1;
      else
        cBRDDOT_Bit_DIn  =  0;
      V  < <=  1;


      cBRDDOT_Bit_Shift  =  0;
      cBRDDOT_Bit_Shift  =  1;
      cBRDDOT_Bit_Shift  =  1;
      cBRDDOT_Bit_Shift  =  0;
    }
  }
  
  {
  //這里面vBRDDOT_Values要存儲(chǔ)8行LED的顯示內(nèi)容,建議用取模軟件去生成。
  //每次中斷進(jìn)來都會(huì)換一行顯示,因?yàn)関BRDDOT_ColIndex一直在變。
    V  =  vBRDDOT_Values[vBRDDOT_ColIndex];
    for  (i=0;i< 8;i++)
    {
      if  (V  &  0x80)
        cBRDDOT_Bit_DIn  =  1;
      else
        cBRDDOT_Bit_DIn  =  0;
      V  < <=  1;


      cBRDDOT_Bit_Shift  =  0;
      cBRDDOT_Bit_Shift  =  1;
      cBRDDOT_Bit_Shift  =  1;
      cBRDDOT_Bit_Shift  =  0;
    }
  }
  cBRDDOT_Bit_Latch  =  0;
  cBRDDOT_Bit_Shift  =  0;
}

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 原理圖
    +關(guān)注

    關(guān)注

    1308

    文章

    6373

    瀏覽量

    236464
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6050

    文章

    44702

    瀏覽量

    641299
  • led燈
    +關(guān)注

    關(guān)注

    22

    文章

    1593

    瀏覽量

    108812
  • 鎖存器
    +關(guān)注

    關(guān)注

    8

    文章

    918

    瀏覽量

    41782
  • 74HC595
    +關(guān)注

    關(guān)注

    7

    文章

    193

    瀏覽量

    31127
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    16*16點(diǎn)陣 74hc595

    自己動(dòng)手做的16*16 點(diǎn)陣用了四塊***4快74hc595
    發(fā)表于 12-08 17:50

    挽救一下小蝦們脆弱的心吧,74HC595驅(qū)動(dòng)LED點(diǎn)陣方面

    在學(xué)習(xí)點(diǎn)陣方面,在用74HC595驅(qū)動(dòng)LED點(diǎn)陣時(shí)遇到的問題,下面是仿真圖和程序圖,感覺電路和程序都對(duì)啊,為什么protuse里的
    發(fā)表于 08-11 20:31

    基于51的4塊8*8點(diǎn)陣拼成16*16點(diǎn)陣

    `最近剛剛接觸單片機(jī),想做一個(gè)用74hc595驅(qū)動(dòng)的16*16點(diǎn)陣,但是不知道從哪下手,有沒有大神教一下啊。。`
    發(fā)表于 12-09 21:17

    新手求幫助8*8點(diǎn)陣

    用51單片機(jī),74hc59574ls138來點(diǎn)亮8*8點(diǎn)陣,74ls138接陰極行掃描,
    發(fā)表于 12-16 15:40

    51單片機(jī)學(xué)習(xí)總結(jié)(三)8*8點(diǎn)陣屏,串口通信(內(nèi)含模塊代碼) 精選資料推薦

    上面,這8個(gè)引腳是引出來,所以88使用的是這個(gè)原理圖里面的1-6個(gè)引腳)(注:清翔的點(diǎn)陣屏把需要使用的74HC595放到了點(diǎn)陣屏模塊里面)實(shí)物:74
    發(fā)表于 07-15 06:20

    74HC595驅(qū)動(dòng)LED點(diǎn)陣或數(shù)碼管的正確用法 精選資料推薦

    這幾天有些時(shí)間想做LED點(diǎn)陣玩玩,所以需要學(xué)習(xí)74HC595芯片,上網(wǎng)找了幾個(gè)例程和關(guān)于74HC595的幾篇應(yīng)用,照貓畫虎實(shí)際操作一下,哪知根本不可行,教程都是錯(cuò)誤的。于是自己潛心研究
    發(fā)表于 07-22 08:49

    74HC595驅(qū)動(dòng)LED點(diǎn)陣或數(shù)碼管的正確用法是什么?

    74HC595正確的工作原理是什么?74HC595驅(qū)動(dòng)LED點(diǎn)陣或數(shù)碼管的正確用法是什么?
    發(fā)表于 07-23 12:34

    如何使用三片74HC595對(duì)一個(gè)8X8雙色點(diǎn)陣進(jìn)行控制呢

    74HC595是什么?74HC595串行轉(zhuǎn)并行芯片各引腳的作用是什么?如何使用三片74HC595對(duì)一個(gè)8X8雙色點(diǎn)陣進(jìn)行控制呢?
    發(fā)表于 10-25 09:04

    如何去實(shí)現(xiàn)一種8x8點(diǎn)陣的設(shè)計(jì)

    一.8x8點(diǎn)陣(1)74h595認(rèn)識(shí)(2)8x8點(diǎn)陣排列(3)實(shí)踐:#includetypedef unsigned char u
    發(fā)表于 12-10 07:17

    [圖文]74HC595驅(qū)動(dòng)8個(gè)LED電路圖

    74HC595驅(qū)動(dòng)8個(gè)LED電路圖
    發(fā)表于 04-16 17:59 ?5413次閱讀
    [圖文]<b class='flag-5'>74HC595</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>8</b>個(gè)<b class='flag-5'>LED</b>電路圖

    74HC595驅(qū)動(dòng)8個(gè)LED電路

    74HC595驅(qū)動(dòng)8個(gè)LED電路
    發(fā)表于 02-25 15:43 ?8044次閱讀
    <b class='flag-5'>74HC595</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>8</b>個(gè)<b class='flag-5'>LED</b>電路

    基于單片機(jī)74HC595驅(qū)動(dòng)點(diǎn)陣

    基于單片機(jī)74HC595驅(qū)動(dòng)點(diǎn)陣程序,喜歡的朋友下載來學(xué)習(xí)。
    發(fā)表于 01-06 14:31 ?132次下載

    基于8051的Proteus仿真-74HC59574LS154

    基于8051的Proteus仿真-74HC59574LS154設(shè)計(jì)的16×16點(diǎn)陣
    發(fā)表于 05-11 17:35 ?57次下載

    一種用 74hc138 和 74hc595 驅(qū)動(dòng) 8x8 點(diǎn)陣顯示技術(shù)

    用STC89C52,74hc138驅(qū)動(dòng)列,74hc595驅(qū)動(dòng)行,8x8點(diǎn)陣顯示問題。
    發(fā)表于 05-30 10:18 ?1w次閱讀
    一種用 <b class='flag-5'>74hc</b>138 和 <b class='flag-5'>74hc595</b> <b class='flag-5'>驅(qū)動(dòng)</b> <b class='flag-5'>8x8</b> <b class='flag-5'>點(diǎn)陣</b>顯示技術(shù)

    16x16點(diǎn)陣滾動(dòng)顯示漢字74HC595程序仿真原理圖驅(qū)動(dòng)文件

    16x16點(diǎn)陣滾動(dòng)顯示漢字程序+仿真原理圖 74HC595驅(qū)動(dòng)資料文件下載
    發(fā)表于 08-29 10:16 ?53次下載