找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

單片機(jī)點陣程序怎樣讓移動后的箭頭后面燈熄滅呢?

查看數(shù): 1879 | 評論數(shù): 11 | 收藏 0
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2022-1-14 17:58

正文摘要:

單片機(jī)源程序如下: #include <reg51.h> //定義74HC595控制管腳 sbit SCK=P3^6; sbit RCK=P3^5; sbit SER=P3^4; unsigned char matrixLED1[8]={0x00,0x38,0x38,0x38,0xfe,0x7c,0x38,0x10};//LED點 ...

回復(fù)

ID:332444 發(fā)表于 2022-1-17 11:53
代碼簡潔源于精妙嚴(yán)謹(jǐn)推敲,看電路寫代碼,看代碼連接電路,看電路改代碼,看代碼改電路都是基礎(chǔ),初學(xué)單片機(jī)時,雖然自己有想法能寫出來,也希望能多看看別人是如何寫的,于是周游論壇,遍覽群書,訪師尋友只是看看,自己歷練才能達(dá)到想要的結(jié)果。級聯(lián)595演示只有一個8*8數(shù)據(jù),數(shù)組不再添加任何值,實現(xiàn)數(shù)據(jù)出現(xiàn)數(shù)據(jù)消失,90度轉(zhuǎn)向,實現(xiàn)4個方向花樣。

1.gif (562.88 KB, 下載次數(shù): 30)

1.gif
ID:332444 發(fā)表于 2022-1-15 13:22
用得著寫那么多?原本數(shù)據(jù)不用添加消隱值,重點提示2句完成P0=[cs];QuDong595((cs+d<8?[cs+d]:0x00));數(shù)據(jù)逐漸消失,數(shù)據(jù)逐漸出現(xiàn)cs+8-d
ID:517466 發(fā)表于 2022-1-15 09:44
wulin提供代碼,可能需要修改點陣LED的接線圖,要把器件反轉(zhuǎn)180度后,照圖連接。這個需要特別注意。
ID:517466 發(fā)表于 2022-1-15 09:31
如果想使用595,那么修改一下代碼,增加595部分(紅色文字代碼)的處理即可:
                P2=rows[i+j];
                col_data(rows[i+j]);

                P0=(1<<j)^255;
電路修改為:

經(jīng)測試,是一樣的效果
ID:517466 發(fā)表于 2022-1-15 09:24
這是執(zhí)行效果

demo.zip

346.96 KB, 下載次數(shù): 3

流動箭頭的演示

ID:517466 發(fā)表于 2022-1-15 09:20
這是我修改后的代碼,沒有使用595,用P2口代替了
#include <reg51.h>
//定義74HC595控制管腳
sbit SCK=P3^6;
sbit RCK=P3^5;
sbit SER=P3^4;
unsigned char rows[24]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x1c,0x3e,0x7f,0x1c,0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

void delay(unsigned int a)
{
   while(a--);
   }
void col_data(unsigned char dat) {
    unsigned char i=0;
    //循環(huán)8次即可將一個字節(jié)寫入寄存器中
    for(i=0;i<8;i++) {
        SER=dat>>7;//!優(yōu)先傳輸一個字節(jié)中的高位
        dat<<=1;
        SCK=0;
        delay(1);
        SCK=1;
        delay(1); //上升沿時數(shù)據(jù)移位
    }
    RCK=0;
    delay(1);
    RCK=1;
}

void main() {
    unsigned char i,j;
    while(1) {
        for(i=0;i<16;i++) {
            for(j=0;j<8;j++) {
                P2=rows[i+j];
                P0=(1<<j)^255;
                delay(1300);
                P0=255;
            }


        }

    }
}

ID:213173 發(fā)表于 2022-1-15 08:36

  1. #include <reg51.h>
  2. //定義74HC595控制管腳
  3. sbit SCK=P3^6;
  4. sbit RCK=P3^5;
  5. sbit SER=P3^4;
  6. unsigned char matrixLED1[]={0x10,0x38,0x7c,0xfe,0x38,0x38,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//LED點陣高電平端口數(shù)據(jù)
  7. unsigned char temp[8];
  8. unsigned char matrixLED0[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED點陣低電平端口數(shù)據(jù)


  9. void delay(unsigned int a)
  10. {
  11.    while(a--);
  12. }
  13. void col_data(unsigned char dat)
  14. {
  15.         unsigned char i=0;
  16.         for(i=0;i<8;i++)//循環(huán)8次即可將一個字節(jié)寫入寄存器中
  17.         {
  18.                 SER=dat>>7;//!優(yōu)先傳輸一個字節(jié)中的高位
  19.                 dat<<=1;
  20.                 SCK=0;
  21.                 delay(1);
  22.                 SCK=1;
  23.                 delay(1); //上升沿時數(shù)據(jù)移位
  24.         }
  25.         RCK=0;
  26.         delay(1);
  27.         RCK=1;
  28. }
  29. void main()
  30. {
  31.         unsigned char i,j,k;
  32.         while(1)
  33.         {
  34.                 P0=0x00;
  35.                 col_data(matrixLED0[i]);
  36.                 P0=matrixLED1[i];
  37.                 i=++i%8;
  38.                 delay(100);
  39.                 j++;
  40.                 if(j>=100)
  41.                 {
  42.                         j=0;
  43.                         matrixLED1[16]=matrixLED1[0];
  44.                         for(k=0;k<16;k++)
  45.                                 matrixLED1[k]=matrixLED1[k+1];
  46.                 }
  47.         }
  48. }
復(fù)制代碼



ID:1001921 發(fā)表于 2022-1-14 21:52
suncat0504 發(fā)表于 2022-1-14 19:49
你先搞清楚思路。顯示滾動其實就是利用時間差,靜態(tài)顯示數(shù)據(jù),形成動態(tài)的圖案。這個時間差,你可以根據(jù)實驗 ...

額。道理懂,但是我就是不太會改。我這就是掃描列,然后讓列移動。
ID:624769 發(fā)表于 2022-1-14 20:33
最簡單的方法,就是把 8x8的箭頭圖,變成 16x8 ,其中8x8還是你原來的箭頭,另外的8x8 為全0,然后讓它 滾起來。
ID:517466 發(fā)表于 2022-1-14 19:49
你先搞清楚思路。顯示滾動其實就是利用時間差,靜態(tài)顯示數(shù)據(jù),形成動態(tài)的圖案。這個時間差,你可以根據(jù)實驗結(jié)果來調(diào)整。在某一個時刻A圖,間隔一定時間后,顯示B圖;再次間隔一定時間顯示C圖......
具體就是這個思路。按照這個思路,如果想在箭頭后清除畫面,就是發(fā)送能讓LED滅掉的數(shù)據(jù)而已?茨闾峁┑碾娐穲D,應(yīng)該是在顯示箭頭后的數(shù)據(jù)中,向P0口發(fā)送全1數(shù)據(jù)即可。即P0=0xFF;
ID:1001921 發(fā)表于 2022-1-14 18:00
我想讓移動后無圖案的數(shù)組清0,應(yīng)該就能熄滅,但不知道怎么弄

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

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

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