找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4111|回復(fù): 10
收起左側(cè)

關(guān)于單片機(jī)16x32點(diǎn)陣左右移動(dòng)的程序問(wèn)題

[復(fù)制鏈接]
ID:709561 發(fā)表于 2021-2-19 17:43 | 顯示全部樓層 |閱讀模式
50黑幣
最近自己在學(xué)習(xí)點(diǎn)陣,點(diǎn)陣顯示也可以顯示自己想要的,可是左右移動(dòng)實(shí)在是搞得不明不白,參考了許多的網(wǎng)上資料,還是丈二的和尚摸不著頭腦,自己的知識(shí)水平還是欠缺,自己寫(xiě)的程序還是有問(wèn)題的,希望大神給予文獻(xiàn)資料幫助,不勝感激。。
MCU;STC12C5616AD晶振24.576MHZ,行列使用的是74HC595級(jí)聯(lián),
51hei圖片20210219172439.jpg 16x32點(diǎn)陣數(shù)字行掃描列數(shù)據(jù)設(shè)置圖片.jpg

單片機(jī)源程序如下:
  1. #include<STC12C5630AD.H>
  2. #include<intrins.h>


  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5.         
  6. #define  SP   5 //移動(dòng)速度,數(shù)字越小越快,數(shù)字越大越慢

  7. sbit HSER=P1^4;     //14數(shù)據(jù)
  8. sbit HSCK=P1^3;     //12鎖存                //行
  9. sbit HRCK=P1^2;     //11時(shí)鐘

  10. sbit LSER=P1^7;     //14數(shù)據(jù)
  11. sbit LSCK=P1^6;     //12鎖存                        //列
  12. sbit LRCK=P1^5;     //11時(shí)鐘

  13. uchar code tah[]={

  14. 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  15. 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

  16. };
  17. uchar code tal[]={
  18. 0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,/*"0",0*/

  19. 0xFF,0xFF,0xFF,0xF7,0xF1,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xC1,0xFF,0xFF,/*"1",1*/

  20. 0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xDF,0xDF,0xEF,0xF7,0xFB,0xBD,0x81,0xFF,0xFF,/*"2",2*/

  21. 0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xDF,0xE7,0xDF,0xBF,0xBF,0xBD,0xDD,0xE3,0xFF,0xFF,/*"3",3*/

  22. 0xFF,0xFF,0xFF,0xDF,0xCF,0xD7,0xDB,0xDB,0xDD,0xDD,0x81,0xDF,0xDF,0x87,0xFF,0xFF,/*"4",4*/

  23. 0xFF,0xFF,0xFF,0x81,0xFD,0xFD,0xFD,0xE5,0xD9,0xBF,0xBF,0xBD,0xDD,0xE3,0xFF,0xFF,/*"5",5*/

  24. 0xFF,0xFF,0xFF,0xC7,0xDB,0xFD,0xFD,0xE5,0xD9,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,/*"6",6*/

  25. 0xFF,0xFF,0xFF,0x81,0xDD,0xDD,0xEF,0xEF,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFF,0xFF,/*"7",7*/

  26. 0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xDB,0xE7,0xDB,0xBD,0xBD,0xBD,0xC3,0xFF,0xFF,/*"8",8*/

  27. 0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0x9B,0xA7,0xBF,0xBF,0xDB,0xE3,0xFF,0xFF,/*"9",9*/

  28. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  29. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  30. };
  31. void H959(uchar num,uchar num1)        //行
  32. {
  33.         uchar i,k;
  34.         for(i=0;i<8;i++)
  35.         {
  36.                 HSER=num&0x80;
  37.                 num<<=1;
  38.         _nop_();
  39.                 HRCK=0;
  40.         _nop_();
  41.                 HRCK=1;
  42.         HRCK=0;
  43.         }
  44.     for(k=0;k<8;k++)
  45.         {
  46.                 HSER=num1&0x80;
  47.                 num1<<=1;
  48.         _nop_();
  49.                 HRCK=0;
  50.         _nop_();
  51.                 HRCK=1;
  52.         HRCK=0;
  53.         }
  54.     _nop_();
  55.         HSCK=0;
  56.     _nop_();
  57.         HSCK=1;
  58.     HSCK=0;
  59. }
  60. void L959(uchar num,uchar num1,uchar num2,uchar num3)        //列
  61. {
  62.         uchar i,k,j,n;
  63.         for(i=0;i<8;i++)
  64.         {
  65.                 LSER=num&0x80;
  66.                 num<<=1;
  67.         _nop_();
  68.                 LRCK=0;
  69.         _nop_();
  70.                 LRCK=1;
  71.         LRCK=0;
  72.         }
  73.     for(k=0;k<8;k++)
  74.         {
  75.                 LSER=num1&0x80;
  76.                 num1<<=1;
  77.         _nop_();
  78.                 LRCK=0;
  79.         _nop_();
  80.                 LRCK=1;
  81.         LRCK=0;
  82.         }
  83.     for(j=0;j<8;j++)
  84.         {
  85.                 LSER=num2&0x80;
  86.                 num2<<=1;
  87.         _nop_();
  88.                 LRCK=0;
  89.         _nop_();
  90.                 LRCK=1;
  91.         LRCK=0;
  92.         }
  93.     for(n=0;n<8;n++)
  94.         {
  95.                 LSER=num3&0x80;
  96.                 num3<<=1;
  97.         _nop_();
  98.                 LRCK=0;
  99.         _nop_();
  100.                 LRCK=1;
  101.         LRCK=0;
  102.         }
  103.     _nop_();
  104.         LSCK=0;
  105.     _nop_();
  106.         LSCK=1;
  107.     LSCK=0;
  108. }
  109. void delay1ms(void)   //誤差 0us
  110. {
  111.     unsigned char a,b;
  112.     for(b=195;b>0;b--)
  113.         for(a=30;a>0;a--);
  114. }
  115. void main()   
  116. {
  117.     HRCK=0;LRCK=0;

  118.         while(1)
  119.         {
  120.         uchar k,j,i,n;
  121.         for(j=0;j<96;j++)
  122.         {
  123.             for(n=0;n<SP;n++)
  124.             {
  125.         for(k=0;k<16;k++)
  126.         {
  127.             i=j+k;
  128.             L959(tal[i+48],tal[i+32],tal[i+16],tal[i]);
  129.            delay1ms();
  130.             H959(tah[k+8],tah[k]);
  131.         }    }
  132.     }
  133.   }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

ID:592807 發(fā)表于 2021-2-20 13:55 | 顯示全部樓層
這東西要看硬件才知道怎么改軟件
回復(fù)

使用道具 舉報(bào)

ID:709561 發(fā)表于 2021-2-21 10:45 | 顯示全部樓層
黃youhui 發(fā)表于 2021-2-20 13:55
這東西要看硬件才知道怎么改軟件

行是兩個(gè)74HC595級(jí)聯(lián),列是4個(gè)74HC595級(jí)聯(lián),點(diǎn)陣是16x32的,行是陽(yáng)極列是陰極,自己對(duì)程序還不是很理解無(wú)法寫(xiě)出左右移動(dòng)程序,望請(qǐng)大神給予幫助。。
回復(fù)

使用道具 舉報(bào)

ID:332444 發(fā)表于 2021-2-21 11:16 | 顯示全部樓層
程序位置不對(duì)引起的,上一半與下一半對(duì)調(diào)試看
回復(fù)

使用道具 舉報(bào)

ID:709561 發(fā)表于 2021-2-21 14:21 | 顯示全部樓層
xianfajushi 發(fā)表于 2021-2-21 11:16
程序位置不對(duì)引起的,上一半與下一半對(duì)調(diào)試看

按你說(shuō)的已經(jīng)嘗試過(guò)了,但還是不對(duì)出現(xiàn)了錯(cuò)誤,還請(qǐng)大神給予幫助。!
回復(fù)

使用道具 舉報(bào)

ID:785191 發(fā)表于 2021-2-21 23:28 | 顯示全部樓層
1、程序中定義函數(shù)變量應(yīng)該在第一行。2、你的點(diǎn)陣沒(méi)有消隱。(用數(shù)碼管消隱的方法)3、個(gè)人覺(jué)得學(xué)習(xí)點(diǎn)陣只是為了了解一下其工作原理,了解595的用法。4、如果你想實(shí)現(xiàn)左移右移有許多其它好用的外設(shè)(例如OLED)5、個(gè)人建議不要學(xué)51太長(zhǎng)時(shí)間,學(xué)會(huì)定時(shí)器、中斷、串口通信、就行了,至于外設(shè)主要的是它的思想,程序上問(wèn)題是自己的問(wèn)題需要積累,個(gè)人建議買(mǎi)本C primier Plus,學(xué)著查著,慢慢就會(huì)了。之后就直接上手ARM內(nèi)核的芯片(個(gè)人推薦STM32),你會(huì)對(duì)單片機(jī)有全新的理解。
回復(fù)

使用道具 舉報(bào)

ID:592807 發(fā)表于 2021-2-22 08:31 | 顯示全部樓層
1P1P 發(fā)表于 2021-2-21 10:45
行是兩個(gè)74HC595級(jí)聯(lián),列是4個(gè)74HC595級(jí)聯(lián),點(diǎn)陣是16x32的,行是陽(yáng)極列是陰極,自己對(duì)程序還不是很理解無(wú) ...

你定義一個(gè)二維數(shù)組記錄每一個(gè)每一個(gè)燈的狀態(tài),根據(jù)燈的改變數(shù)組,然后再讀出數(shù)組給595賦值,這是最簡(jiǎn)單有效的方法。可能延時(shí)會(huì)比較大。
復(fù)雜點(diǎn)的方法就是,你左右移動(dòng)也就是Y軸不變LED在X軸移動(dòng),這時(shí)候你Y軸的595可以變,然后計(jì)算你的X軸的595要移動(dòng)幾個(gè)單位。
回復(fù)

使用道具 舉報(bào)

ID:592807 發(fā)表于 2021-2-22 09:25 | 顯示全部樓層
黃youhui 發(fā)表于 2021-2-22 08:31
你定義一個(gè)二維數(shù)組記錄每一個(gè)每一個(gè)燈的狀態(tài),根據(jù)燈的改變數(shù)組,然后再讀出數(shù)組給595賦值,這是最簡(jiǎn)單 ...

說(shuō)錯(cuò)了,Y軸不變X變
回復(fù)

使用道具 舉報(bào)

ID:390416 發(fā)表于 2021-2-22 17:12 | 顯示全部樓層
回復(fù)

使用道具 舉報(bào)

ID:390416 發(fā)表于 2021-2-22 17:19 | 顯示全部樓層
回復(fù)

使用道具 舉報(bào)

ID:839835 發(fā)表于 2021-2-23 09:46 | 顯示全部樓層
讓上一次的燈光等于要移動(dòng)的燈光的數(shù)組就可以實(shí)現(xiàn)移動(dòng)。比如lcd[i+1]=lcd[i]
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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