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

QQ登錄

只需一步,快速開始

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

2*16*16漢字點(diǎn)陣滾動(dòng)顯示單片機(jī)源碼及仿真電路圖等資料

[復(fù)制鏈接]
ID:275479 發(fā)表于 2018-2-3 07:53 | 顯示全部樓層 |閱讀模式
源碼和電路圖都在壓縮包中,滾動(dòng)顯示最關(guān)鍵的就在于不同8*8點(diǎn)陣塊中如何銜接與字模數(shù)據(jù)如何傳入到595芯片當(dāng)中。

一、點(diǎn)陣測(cè)試說明
一、單組點(diǎn)陣原理圖
1.png
電路采用H1~H16用2個(gè)138組成4譯16電路驅(qū)動(dòng),L1~L16用2個(gè)74HC595的串并轉(zhuǎn)換驅(qū)動(dòng)

ABCDG 為16行 譯碼控制信號(hào)。
ABCD 為H0~H16的4-16(兩個(gè)138組成)的譯碼輸入信號(hào)。G為兩個(gè)138譯碼控制腳,低電平有效。
CLK 為列信號(hào)控制的時(shí)鐘信號(hào)
DATA 為串行數(shù)據(jù)信號(hào)
LATCH 為信號(hào)鎖定,上升沿時(shí)移位寄存器的數(shù)據(jù)進(jìn)入數(shù)據(jù)存儲(chǔ)寄存器,下降沿時(shí)存儲(chǔ)寄存器數(shù)據(jù)不變。(通常將LATCH置為低電平,)當(dāng)移位結(jié)束后,在LATCH端產(chǎn)生一個(gè)正脈沖(5V時(shí),大于幾十納秒就行了。通常都選微秒級(jí)),更新顯示數(shù)據(jù)
DATAOUT 為級(jí)聯(lián)時(shí)數(shù)據(jù)串出信號(hào)。
IN針定義(從上到下)依次為L(zhǎng)ATCH、CLK、DATA、G、A、B、C、D
OUT針定義(從上到下)依次為L(zhǎng)ATCH、CLK、DATAOUT、G、A、B、C、D
級(jí)聯(lián)使用時(shí)OUT針和IN針用短路片連接。

二、實(shí)驗(yàn)方式:
可單個(gè)點(diǎn)陣顯示,也通過短路片連接可接聯(lián)控制。

三、實(shí)驗(yàn)接線:
P1.0接D
P1.1接C
P1.2接B
P1.3接A
P1.4接G
P1.5接DATA
P1.6接CLK
P1.7接LATCH

四、實(shí)驗(yàn)程序
程序1  LED3J.C   三字靜態(tài)顯示
程序2  LED3D.C  二屏(左邊二屏)六字左移顯示。(如三屏接聯(lián),最右屏同最左屏的字,且字向下偏移一個(gè)位)
調(diào)試時(shí),按調(diào)試按鈕傳送結(jié)束后,在反匯編窗口點(diǎn)擊0000起始地址,讓程序從0000開始運(yùn)行;蛑苯釉阪I盤上運(yùn)行起始地址為0000。

字模設(shè)置選項(xiàng)
2.png

加了左右滾動(dòng)開關(guān),非常好用,閃爍是手機(jī)錄制的問題

加了左右滾動(dòng)開關(guān),非常好用,閃爍是手機(jī)錄制的問題

0.png

仿真圖:
0.png

單片機(jī)源程序如下:
  1. #include "main.h"
  2. #include <intrins.h>
  3. //char code STT516[3] _at_ 0x003b;
  4. #define Display_Num_Word 2                                //液晶能顯示的漢字個(gè)數(shù)

  5. unsigned char Display_Buffer[4];
  6. unsigned char Display_Swap_Buffer[Display_Num_Word][32]={0};                                        //顯示緩沖區(qū)
  7. bit Shift_Bit = 0;
  8. bit Flag_Shift = 0;
  9. #define Shift_Speed 5                                                                                        //移動(dòng)速度
  10. unsigned char Timer0_Count = 0;
  11. unsigned char temp = 0x80;
  12. unsigned char Shift_Count = 0;
  13. unsigned char Display_Word_Count = 0;

  14. #define Num_Of_Word 6
  15. unsigned char code Word[Num_Of_Word][32] =
  16. {

  17. 0xFE,0xFE,0xFE,0xFE,0xFE,0xE0,0xEF,0xEF,0xEF,0xE0,0xEF,0xFE,0xD7,0xDB,0xBB,0xFF,
  18. 0xFF,0xFF,0x07,0xFF,0xEF,0x07,0xEF,0xEF,0xEF,0x0F,0xEF,0xEF,0x77,0xBB,0xBB,0xFF,/*"點(diǎn)",0*/

  19. 0xFF,0x07,0x77,0x68,0x5E,0x6E,0x75,0x70,0x77,0x57,0x68,0x7F,0x7F,0x7F,0x7F,0x7F,
  20. 0x7F,0x7F,0x7F,0x03,0xFF,0xBF,0xBF,0x03,0xBF,0xBF,0x01,0xBF,0xBF,0xBF,0xBF,0xBF,/*"陣",1*/

  21. 0xBF,0xD8,0xDB,0x7B,0xBA,0xAA,0xEA,0xDA,0xDA,0xDA,0x3A,0xBE,0xBD,0xBD,0xBB,0xB7,
  22. 0xFD,0x3D,0xBD,0xAD,0xAD,0xAD,0xAD,0xAD,0xAD,0xAD,0xAD,0xFD,0x7D,0xBD,0xB5,0xFB,/*"測(cè)",2*/

  23. 0xFF,0xBF,0xDF,0xCF,0xD8,0xFF,0x1F,0xD8,0xDE,0xDE,0xDE,0xDE,0xD6,0xC9,0xDF,0xFF,
  24. 0xDF,0xD7,0xDB,0xDB,0x01,0xDF,0xDF,0x1F,0xDF,0xEF,0xEF,0xF5,0x35,0xF9,0xFD,0xFF,/*"試",3*/

  25. 0xBF,0xDE,0xCE,0xDE,0xFE,0xFE,0x1D,0xDA,0xDE,0xDE,0xDF,0xDF,0xD7,0xCF,0xDC,0xF3,
  26. 0xFF,0x0F,0xEF,0xEF,0xEF,0xEF,0xF1,0x07,0xF7,0xF7,0x6F,0x6F,0x9F,0x6F,0xF1,0xFB,/*"設(shè)",4*/

  27. 0xBF,0xDF,0xCF,0xDF,0xFF,0x0C,0xEF,0xEF,0xEF,0xEF,0xEF,0xED,0xEB,0xE7,0xEF,0xFF,
  28. 0xDF,0xDF,0xDF,0xDF,0xDF,0x01,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,/*"計(jì)",5*/


  29. };

  30. //************************************************************
  31. //主函數(shù)
  32. //************************************************************
  33. void main()
  34. {
  35.         Init_Timer0();
  36.         Clear_Display();
  37.         while(1)
  38.         {
  39.                 Display(Display_Swap_Buffer);
  40.                 if(Flag_Shift == 1)
  41.                 {
  42.                         Flag_Shift = 0;
  43.                         Display_Word_Count = Shift_Count/16;                                //計(jì)算當(dāng)前顯示第幾個(gè)字
  44.                         Calc_Shift();                                                                               
  45.                        
  46.                         Shift_Count++;
  47.                        
  48.                         if(Shift_Count == (Num_Of_Word+Display_Num_Word)*16 )                                //移動(dòng)次數(shù)
  49.                         {
  50.                                 Shift_Count = 0;                               
  51.                         }                       
  52.                 }                                                                       
  53.         }
  54. }

  55. //****************************************************
  56. //初始化定時(shí)器0
  57. //****************************************************
  58. void Init_Timer0()
  59. {
  60.         TMOD = 0X01;                        //T0, 工作模式1

  61.         TH0 = (65536 - 50000)/256;
  62.         TL0 = (65536 - 50000)%256;

  63.         TR0 = 1;                                //開啟定時(shí)器
  64.         ET0 = 1;                            //開啟定時(shí)器中斷
  65.         EA = 1;                                        //開啟總中斷               
  66. }

  67. //****************************************************
  68. //中斷函數(shù)
  69. //****************************************************
  70. void Timer0() interrupt 1
  71. {
  72.         TH0 = (65536 - 50000)/256;
  73.         TL0 = (65536 - 50000)%256;
  74.        
  75.         TF0 = 0;
  76.         Timer0_Count++;
  77.         if(Timer0_Count >= Shift_Speed)
  78.         {
  79.                 Timer0_Count = 0;
  80.                 Flag_Shift = 1;
  81.         }

  82. }

  83. //************************************************************
  84. //計(jì)算移動(dòng)數(shù)據(jù),存在在緩沖器
  85. //************************************************************
  86. void Calc_Shift()
  87. {
  88.         unsigned char i;

  89.         for(i = 0;i < 16;i++)
  90.         {
  91.                 if((Display_Swap_Buffer[0][16+i]&0x80) == 0)                                                                        //每行第一個(gè)字節(jié)移位
  92.                 {
  93.                         Display_Swap_Buffer[0][i] = (Display_Swap_Buffer[0][i] << 1)&0xfe;                         //最低位清零       
  94.                 }
  95.                 else
  96.                 {
  97.                         Display_Swap_Buffer[0][i] = (Display_Swap_Buffer[0][i] << 1)|0x01;                        //最低位置一        
  98.                 }

  99.                 if((Display_Swap_Buffer[1][i]&0x80) == 0)                                                                        //每行第二個(gè)字節(jié)移位
  100.                 {
  101.                         Display_Swap_Buffer[0][16+i] = (Display_Swap_Buffer[0][16+i] << 1)&0xfe;                         //最低位清零       
  102.                 }
  103.                 else
  104.                 {
  105.                         Display_Swap_Buffer[0][16+i] = (Display_Swap_Buffer[0][16+i] << 1)|0x01;                        //最低位置一        
  106.                 }

  107.                 if((Display_Swap_Buffer[1][16+i]&0x80) == 0)                                                                        //每行第三個(gè)字節(jié)移位
  108.                 {
  109.                         Display_Swap_Buffer[1][i] = (Display_Swap_Buffer[1][i] << 1)&0xfe;                         //最低位清零       
  110.                 }
  111.                 else
  112.                 {
  113.                         Display_Swap_Buffer[1][i] = (Display_Swap_Buffer[1][i] << 1)|0x01;                        //最低位置一        
  114.                 }

  115.                 if(Shift_Count%16 < 8 && Display_Word_Count < Num_Of_Word)
  116.                 {
  117.                         Shift_Bit = Word[Display_Word_Count][i]&temp;
  118.                 }
  119.                 else if(Shift_Count%16 < 16 && Display_Word_Count < Num_Of_Word)
  120.                 {
  121.                         Shift_Bit = Word[Display_Word_Count][16+i]&temp;
  122.                 }
  123.                 else
  124.                 {
  125.                         Shift_Bit = 1;                                                //把字移出緩沖區(qū)
  126.                 }

  127.                 if( Shift_Bit == 0)                                                                                                                //后8位移位
  128.                 {
  129.                         Display_Swap_Buffer[1][16+i] = (Display_Swap_Buffer[1][16+i] << 1)&0xfe;                 //最低位清零
  130.                 }
  131.                 else
  132.                 {
  133.                         Shift_Bit =        1;
  134.                         Display_Swap_Buffer[1][16+i] = (Display_Swap_Buffer[1][16+i] << 1)|0x01;                //最低位置一                        
  135.                 }
  136.                
  137.         }
  138.         temp = (temp>>1)&0x7f;
  139.         if(temp == 0x00)
  140.         {
  141.                 temp = 0x80;
  142.         }
  143. }

  144. //************************************************************
  145. //清空緩沖區(qū)
  146. //************************************************************
  147. void Clear_Display()
  148. {
  149.         unsigned char i,j;
  150.         for(j = 0 ; j < Display_Num_Word; j++)
  151.         {
  152.                 for(i = 0 ; i < 32 ;i++)
  153.                 {
  154.                         Display_Swap_Buffer[j][i] = 0xff;                                //0=顯示  1=不顯示        
  155.                 }
  156.         }
  157. }

  158. //************************************************************
  159. //num為字?jǐn)?shù)  dat[][32]為字模的名稱
  160. //*************************************************************
  161. void Display(unsigned char dat[][32])                                       
  162. {
  163.         unsigned char i,j;

  164.         for( i = 0 ; i < 16 ; i++ )
  165.         {
  166.                 LEDARRAY_G = 1;                        //更新數(shù)據(jù)時(shí)候關(guān)閉顯示。等更新完數(shù)據(jù),打開138顯示行。防止重影。

  167.                 Display_Buffer[0] = dat[0][i];               
  168.                 Display_Buffer[1] = dat[0][i+16];
  169.                 Display_Buffer[2] = dat[1][i];
  170.                 Display_Buffer[3] = dat[1][i+16];

  171.                 Send(Display_Buffer[3]);
  172.                 Send(Display_Buffer[2]);
  173.                 Send(Display_Buffer[1]);
  174.                 Send(Display_Buffer[0]);

  175.                 LEDARRAY_LAT = 1;                                        //鎖存數(shù)據(jù)
  176.                 _nop_();
  177.        
  178.                 LEDARRAY_LAT = 0;
  179.                 _nop_();

  180.                 Scan_Line(i);                                                //選擇第i行

  181.                 LEDARRAY_G = 0;
  182.                
  183.                 for( j = 0 ; j < 30 ; j++);                //延時(shí)一段時(shí)間,讓LED亮起來。
  184.         }       
  185. }

  186. //****************************************************
  187. //掃描某一行
  188. //****************************************************
  189. void Scan_Line( unsigned char m)
  190. {       
  191.         switch(m)
  192.         {
  193.                 case 0:                       
  194.                         LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 0;                                        
  195.                         break;
  196.                 case 1:                                       
  197.                         LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 1;                
  198.                         break;
  199.                 case 2:                                       
  200.                         LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 0;                
  201.                         break;
  202.                 case 3:                                       
  203.                         LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 1;                
  204.                         break;
  205.                 case 4:
  206.                         LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 0;                
  207.                         break;
  208.                 case 5:
  209.                         LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 1;                
  210.                         break;
  211.                 case 6:
  212.                         LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 0;                
  213.                         break;
  214.                 case 7:
  215.                         LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 1;                
  216.                         break;
  217.                 case 8:
  218.                         LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 0;                
  219.                         break;
  220.                 case 9:
  221.                         LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 1;                
  222.                         break;       
  223.                 case 10:
  224.                         LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 0;                
  225.                         break;
  226.                 case 11:
  227.                         LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 1;                
  228.                         break;
  229.                 case 12:
  230.                         LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 0;                
  231.                         break;
  232.                 case 13:
  233.                         LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 1;                
  234.                         break;
  235.                 case 14:
  236.                         LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 0;                
  237.                         break;
  238.                 case 15:
  239.                         LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 1;                
  240.                         break;
  241.                 default : break;       
  242.         }
  243. }

  244. //****************************************************
  245. ……………………

  246. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
0.png

所有資料51hei提供下載:
漢字點(diǎn)陣滾動(dòng).zip (1.13 MB, 下載次數(shù): 58)


評(píng)分

參與人數(shù) 2黑幣 +55 收起 理由
Asher0120 + 5 共享資料的黑幣獎(jiǎng)勵(lì)!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:291645 發(fā)表于 2018-3-15 18:02 | 顯示全部樓層
我打開這個(gè)仿真的,顯示非法字符,咋回事,有知道怎么改的嗎
回復(fù)

使用道具 舉報(bào)

ID:443613 發(fā)表于 2018-12-10 20:33 | 顯示全部樓層
想問下帶不帶論文啊
回復(fù)

使用道具 舉報(bào)

ID:275479 發(fā)表于 2019-1-2 13:22 來自手機(jī) | 顯示全部樓層
dqm123 發(fā)表于 2018-12-10 20:33
想問下帶不帶論文啊

不帶論文,可以自己寫寫
回復(fù)

使用道具 舉報(bào)

ID:483687 發(fā)表于 2019-3-23 22:12 | 顯示全部樓層
為什么仿真出現(xiàn)錯(cuò)誤啊 Wire label contains illegal characters [P20,]
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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