標題: 16*16的點陣 我想讓它閃爍隔一秒顯示一下,用的是4個595和2個138驅動 [打印本頁]

作者: 51hei小林    時間: 2016-10-20 18:49
標題: 16*16的點陣 我想讓它閃爍隔一秒顯示一下,用的是4個595和2個138驅動
各位大神些,本人小白一個,請教一個問題。我買了一塊16*16的點陣,用的是4個595和2個138驅動。現在的程序能正確顯示圖形。但我想讓它閃爍隔一秒顯示一下。要怎么才能閃爍呢?
  1. /*-----------------------------------------------
  2.   名稱:595控制4漢字點陣屏
  3.   內容:屏+5V、GND連接電源5V
  4.         P0.0-P0.3分別連接A、B、C、D,用于控制16行,通過2路HC138控制
  5.         SCK時鐘連接P2.5
  6.         LATCH鎖存連接P2.6
  7.         R1紅色數據信號連接至P0.4
  8.         G1綠色數據信號連接至P2.4,如果使用單紅色屏此信號無需連接
  9.         OE使能端一般接GND,可以用IO引腳PWM控制亮度
  10.         或者使用此引腳控制拖尾現象。
  11.   現象:使用普通速度51系列單片機。屏幕出現笑臉圖標
  12. ------------------------------------------------*/
  13. #include<reg52.h>
  14. #include <intrins.h>  
  15. #define uchar unsigned char  
  16. #define uint  unsigned int


  17. sbit Key1=P1^0;   //定義單片機P1口的第0位(即P1.0)為輸入
  18. sbit Key2=P1^1;   //定義單片機P1口的第0位(即P1.1)為輸入
  19. sbit Key3=P1^2;   //定義單片機P1口的第0位(即P1.2)為輸入


  20. sbit T_STR = P2^6;       //鎖存引腳,屏上標識位STR
  21. sbit R1    = P0^4;       //數據引腳,屏上標識R1
  22. sbit G1    = P2^4;       //數據引腳,屏上標識G1
  23. sbit T_CLK = P2^5;       //時鐘引腳,屏上標識位CLK
  24. sbit OE    = P2^1;       //使能引腳,屏上標識EN/OE

  25. unsigned char tab[8];
  26. unsigned char DIS[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//行數據

  27. /*-----------------------------------------------
  28.              16x16漢字取模數據
  29. ------------------------------------------------*/
  30. unsigned char code hztest[][32]=    //二維數組,目的是減少運算,可以用最基本的一維數組,每個漢字有32個字節(jié)數據
  31. {
  32. /*--  調入了一幅圖像:K:\C51\漢字 取模程序\前行16.bmp  --*/
  33. /*--  寬度x高度=16x16  --*/
  34. 0x80,0x01,0xC0,0x03,0xE0,0x07,0xF0,0x0F,0xF8,0x1F,0xFC,0x3F,0xDE,0x7B,0xCF,0xF3,
  35. 0xC7,0xE3,0xC3,0xC3,0xC1,0x83,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,



  36. /*--  調入了一幅圖像:K:\C51\漢字 取模程序\左轉16.bmp  --*/
  37. /*--  寬度x高度=16x16  --*/
  38. 0x80,0x07,0xC0,0x03,0xE0,0x01,0xF0,0x00,0x78,0x00,0x3C,0x00,0xFE,0xFF,0xFF,0xFF,
  39. 0xFF,0xFF,0xFE,0xFF,0x3C,0x00,0x78,0x00,0xF0,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,



  40. /*--  調入了一幅圖像:K:\C51\漢字 取模程序\右轉16.bmp  --*/
  41. /*--  寬度x高度=16x16  --*/
  42. 0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0F,0x00,0x1E,0x00,0x3C,0xFF,0x7F,0xFF,0xFF,
  43. 0xFF,0xFF,0xFF,0x7F,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x80,0x07,0xC0,0x03,0xE0,0x01,

  44. };
  45. /*-----------------------------------------------
  46.              向595寫入一個字節(jié) 單紅色
  47. ------------------------------------------------*/
  48. void InputByte( uchar DataR1) //寫一個字節(jié)
  49. {
  50. uchar i;
  51. for(i=8; i>0; i--)
  52. {
  53. R1 = !(DataR1&0x01);                  
  54. T_CLK = 0;
  55. T_CLK = 1;
  56. DataR1 = DataR1 >> 1;
  57. }
  58. }
  59. /*-----------------------------------------------
  60.              向595寫入兩個字節(jié) 雙色
  61. ------------------------------------------------*/
  62. void Input2Byte( uchar DataR1,uchar DataG1) //寫一個字節(jié)
  63. {
  64. uchar i;
  65. for(i=8; i>0; i--)
  66. {
  67. R1 = !(DataR1&0x01);   
  68. G1 = !(DataG1&0x01);               
  69. T_CLK = 0;
  70. T_CLK = 1;
  71. DataR1 = DataR1 >> 1;
  72. DataG1 = DataG1 >> 1;
  73. }
  74. }



  75. void Write_A(uint k) //寫一個字符
  76. {
  77. static uchar count,j;
  78. uchar i;

  79. T_STR=0;       //鎖存釋放
  80.    
  81. for(j=0;j<1;j++) //取每個漢字的前2個字節(jié),數據傳輸完成后鎖存輸出即可 j表示漢字個數,如果是3個漢字屏就可以修改成3
  82.         {
  83.     InputByte(hztest[j][k]);
  84.     InputByte(hztest[j][k+1]);
  85.         }
  86. OE=1;  //暫時關閉屏幕,防止出現鬼影,如果沒有使用該引腳控制則會出現拖影現象。
  87. T_STR=1;      //鎖存有效,此時一行的數據顯示到屏上
  88. P0=DIS[15-count]|0xf0;//用P0口的前4位控制16行,屏內部通過4-16譯碼器工作,循環(huán)掃描其他15行
  89. OE=0;//使能
  90. count++;
  91. i+=2;              //累加調用下一行數據
  92. if(count==16)
  93.     count=0;
  94. if(i==32)
  95.     i=0;
  96. }

  97. //--------------------------------------------
  98. /*n毫秒的延時程序*/  
  99. void Delay_xms(uint x)  
  100. {  
  101. uint i,j;  
  102. for(i=0;i<x;i++)  
  103.   for(j=0;j<112;j++);  
  104. }



  105. /*-----------------------------------------------
  106.                       主程序
  107. ------------------------------------------------*/
  108. main()
  109. {


  110. while(1)
  111. {

  112.   Write_A(1);
  113.   Delay_xms(2000);//這名出錯,一加上就不能正確顯示;



  114. }
  115. }
復制代碼



作者: zl2168    時間: 2016-10-20 21:42
本帖最后由 zl2168 于 2016-10-21 09:09 編輯

實例66  LED 16×16點陣掃描顯示漢字
電路設計

該案例技術要求與你的完全相同,且比你的更簡潔有效。
595與164同屬串入并出移位寄存器,區(qū)別是595有輸出控制,移位完畢再輸出;164是邊移邊輸出。因此用2片164有16機器周期的顯示混亂期,而595沒有。不過對于顯示來講,人眼根本不能察覺。若晶振為12MHz,16機器周期只有16us,人眼能察覺的至少20ms以上,20ms=20000us>>16us。而且,595輸出控制要多花費一個I/O引腳。你要用4片595?怎么用?
154可頂2片138。154是4-16譯碼器,138是3-8譯碼器,控制列掃描一片154就夠了。
至于秒閃爍,只需在每次顯示0.5s后,164置CLR=0或595置OE=0,停顯示0.5s,就行。
漢字編碼
漢字編碼概述   …
漢字點陣顯示代碼   …
漢字點陣取模軟件   
程序設計   
Keil調試   
Proteus仿真
Proteus仿真一下,確認有效。
實例66a LED 16×16點陣漢字顯示.rar (48.21 KB, 下載次數: 17)



以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil CProteus》清華大學出版社ISBN 978-7-302-41682-1
書中電路和程序設計有詳細說明,程序語句條條有注解














































































作者: yzwzfyz    時間: 2016-10-20 22:06
做一個標記位(如:B_FLASH),
做一個0.5秒定時器(可利用中斷,每0.5秒置標記,如:B_05S)
當0.5秒到時(如:B_05S=1時),將B_FLASH求反(B_FLASH=~B_FLASH,當然記得復位B_05S)。
在你現有的輸出數據動作前,增加“插入”一個動作,就是將輸出數據與B_FLASH“與”一下再輸出。
作者: yzwzfyz    時間: 2016-10-20 22:08
凡是需要閃的數據位,就與B_FLASH“與”一下再送出,不需要閃的,不與。

作者: zl2168    時間: 2016-10-21 09:20
實例66  LED 16×16點陣掃描顯示漢字
該案例技術要求與你的完全相同,且比你的更簡潔有效。
595與164同屬串入并出移位寄存器,區(qū)別是595有輸出控制,移位完畢再輸出;164是邊移邊輸出。因此用2片164有16機器周期的顯示混亂期,而595沒有。不過對于顯示來講,人眼根本不能察覺。若晶振為12MHz,16機器周期只有16us,人眼能察覺的至少20ms以上,20ms=20000us>>16us。而且,595輸出控制要多花費一個I/O引腳。你要用4片595?怎么用?
154可頂2片138。154是4-16譯碼器,138是3-8譯碼器,控制列掃描一片154就夠了。
至于秒閃爍,只需在每次顯示0.5s后,164置CLR=0或595置OE=0,停顯示0.5s,就行。





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