標(biāo)題: 單片機(jī)點(diǎn)陣程序怎樣讓移動(dòng)后的箭頭后面燈熄滅呢? [打印本頁]

作者: 2223987342    時(shí)間: 2022-1-14 17:58
標(biāo)題: 單片機(jī)點(diǎn)陣程序怎樣讓移動(dòng)后的箭頭后面燈熄滅呢?


單片機(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點(diǎn)陣高電平端口數(shù)據(jù)
unsigned char temp[8];
unsigned char matrixLED0[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED點(diǎn)陣低電平端口數(shù)據(jù)
void delay(unsigned int a)
{
   while(a--);
   }
void col_data(unsigned char dat)
{
unsigned char i=0;
for(i=0;i<8;i++)//循環(huán)8次即可將一個(gè)字節(jié)寫入寄存器中
{SER=dat>>7;//!優(yōu)先傳輸一個(gè)字節(jié)中的高位
dat<<=1;
SCK=0;
delay(1);
SCK=1;
delay(1); //上升沿時(shí)數(shù)據(jù)移位
}
RCK=0;
delay(1);
RCK=1;
}
void main()
{
unsigned char i,j,k;
while(1)
   {
for (i=0;i<15;i++)
   {
      if(i<8)
   {
      for(j=0;j<8;j++)  temp[j]=matrixLED0[j]<<(7-i);
         
      }
else
   {
      for(j=0;j<8;j++)
         temp[j]=(matrixLED0[j])&(0xff));

         }
for(k=0;k<5;k++)
   {
   for(j=0;j<8;j++)
      {
         P0=temp[j];
         col_data(matrixLED1[j]);//傳送高電平端口數(shù)據(jù)
         delay(100);
         col_data(0x00);
         }
         }}}}


程序哪里可以讓移動(dòng)后后面的燈熄滅,不至于出現(xiàn)方塊移動(dòng)

作者: 2223987342    時(shí)間: 2022-1-14 18:00
我想讓移動(dòng)后無圖案的數(shù)組清0,應(yīng)該就能熄滅,但不知道怎么弄
作者: suncat0504    時(shí)間: 2022-1-14 19:49
你先搞清楚思路。顯示滾動(dòng)其實(shí)就是利用時(shí)間差,靜態(tài)顯示數(shù)據(jù),形成動(dòng)態(tài)的圖案。這個(gè)時(shí)間差,你可以根據(jù)實(shí)驗(yàn)結(jié)果來調(diào)整。在某一個(gè)時(shí)刻A圖,間隔一定時(shí)間后,顯示B圖;再次間隔一定時(shí)間顯示C圖......
具體就是這個(gè)思路。按照這個(gè)思路,如果想在箭頭后清除畫面,就是發(fā)送能讓LED滅掉的數(shù)據(jù)而已。看你提供的電路圖,應(yīng)該是在顯示箭頭后的數(shù)據(jù)中,向P0口發(fā)送全1數(shù)據(jù)即可。即P0=0xFF;
作者: 188610329    時(shí)間: 2022-1-14 20:33
最簡(jiǎn)單的方法,就是把 8x8的箭頭圖,變成 16x8 ,其中8x8還是你原來的箭頭,另外的8x8 為全0,然后讓它 滾起來。
作者: 2223987342    時(shí)間: 2022-1-14 21:52
suncat0504 發(fā)表于 2022-1-14 19:49
你先搞清楚思路。顯示滾動(dòng)其實(shí)就是利用時(shí)間差,靜態(tài)顯示數(shù)據(jù),形成動(dòng)態(tài)的圖案。這個(gè)時(shí)間差,你可以根據(jù)實(shí)驗(yàn) ...

額。道理懂,但是我就是不太會(huì)改。我這就是掃描列,然后讓列移動(dòng)。
作者: wulin    時(shí)間: 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點(diǎn)陣高電平端口數(shù)據(jù)
  7. unsigned char temp[8];
  8. unsigned char matrixLED0[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED點(diǎn)陣低電平端口數(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次即可將一個(gè)字節(jié)寫入寄存器中
  17.         {
  18.                 SER=dat>>7;//!優(yōu)先傳輸一個(gè)字節(jié)中的高位
  19.                 dat<<=1;
  20.                 SCK=0;
  21.                 delay(1);
  22.                 SCK=1;
  23.                 delay(1); //上升沿時(shí)數(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ù)制代碼




作者: suncat0504    時(shí)間: 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次即可將一個(gè)字節(jié)寫入寄存器中
    for(i=0;i<8;i++) {
        SER=dat>>7;//!優(yōu)先傳輸一個(gè)字節(jié)中的高位
        dat<<=1;
        SCK=0;
        delay(1);
        SCK=1;
        delay(1); //上升沿時(shí)數(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;
            }


        }

    }
}


作者: suncat0504    時(shí)間: 2022-1-15 09:24
這是執(zhí)行效果

demo.zip

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

流動(dòng)箭頭的演示


作者: suncat0504    時(shí)間: 2022-1-15 09:31
如果想使用595,那么修改一下代碼,增加595部分(紅色文字代碼)的處理即可:
                P2=rows[i+j];
                col_data(rows[i+j]);

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

經(jīng)測(cè)試,是一樣的效果

作者: suncat0504    時(shí)間: 2022-1-15 09:44
wulin提供代碼,可能需要修改點(diǎn)陣LED的接線圖,要把器件反轉(zhuǎn)180度后,照?qǐng)D連接。這個(gè)需要特別注意。
作者: xianfajushi    時(shí)間: 2022-1-15 13:22
用得著寫那么多?原本數(shù)據(jù)不用添加消隱值,重點(diǎn)提示2句完成P0=[cs];QuDong595((cs+d<8?[cs+d]:0x00));數(shù)據(jù)逐漸消失,數(shù)據(jù)逐漸出現(xiàn)cs+8-d
作者: xianfajushi    時(shí)間: 2022-1-17 11:53
代碼簡(jiǎn)潔源于精妙嚴(yán)謹(jǐn)推敲,看電路寫代碼,看代碼連接電路,看電路改代碼,看代碼改電路都是基礎(chǔ),初學(xué)單片機(jī)時(shí),雖然自己有想法能寫出來,也希望能多看看別人是如何寫的,于是周游論壇,遍覽群書,訪師尋友只是看看,自己歷練才能達(dá)到想要的結(jié)果。級(jí)聯(lián)595演示只有一個(gè)8*8數(shù)據(jù),數(shù)組不再添加任何值,實(shí)現(xiàn)數(shù)據(jù)出現(xiàn)數(shù)據(jù)消失,90度轉(zhuǎn)向,實(shí)現(xiàn)4個(gè)方向花樣。

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

1.gif





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1