51單片機基於74HC595級聯驅動16X16LED點陣


電路圖:

 

原理:

  首先Protues基礎庫件里是沒有16X16的點陣的,需要從網上下載或者是自己DIY出來一個,我就是對着百度DIY出來的,建議大家有條件的話也嘗試DIY一下,增強對點陣電路的了解。不想DIY的話就去下載吧,有時間我會把這套電路圖和16x16設計的電路圖放上來。

  本次實驗是利用74HC595(位移寄存器的一種)級聯,節省IO口。至於74HC959的原理自己百度。

  下面上代碼(剛剛入坑單片機第四天,大佬勿噴):

  

 1 #include <reg51.h>
 2 //16X16點陣LED雙74HC595聯級(2X2個74HC595)驅動程序
 3 sbit baseDS_0 = P3^0;//0號74HC595串行數據輸入口
 4 sbit baseSTCP_0 = P3^1;//0號74595 並行儲存寄存器輸出 上升沿觸發
 5 sbit baseSHCP_0 = P3^2;//0號74HC595 位移寄存器(使0號74HC595的Qs口位移)
 6 
 7 sbit baseDS_1 = P3^4;//1號74HC595串行數據輸入口
 8 sbit baseSTCP_1 = P3^5;//1號74595 並行儲存寄存器輸出 上升沿觸發
 9 sbit baseSHCP_1 = P3^6;//0號74HC595 位移寄存器(使0號74HC595的Qs口位移)
10 typedef unsigned int u16;      //對數據類型進行聲明定義
11 typedef unsigned char u8;
12 
13 code u16 LAB[16] = //掃描行數據16位二進制輪轉
14                                     {
15                                     0X8000,0X4000,0X2000,0X1000,0X0800,0X0400,0X0200,0X0100,
16                                     0X0080,0X0040,0X0020,0X0010,0X0008,0X0004,0X0002,0X0001
17                                     };
18 code u16 inData[2][16] = {
19 {0x0000,0x0000,0x0000,0x000C,0x080C,0x080C,0x180C,0x3FFC,0x7FFC,0x000C,0x000C,0x000C,0x000C,0x0000,0x0000,0x0000},//1
20 {0x0022,0x0022,0x0024,0x7FA4,0x4928,0x4930,0x4920,0x7FFF,0x4920,0x4930,0x4928,0x7FA4,0x0024,0x0022,0x0022,0x0000},/*"果",0*/
21 };
22 //{0x0000,0x0000,0x0000,0x000C,0x080C,0x080C,0x180C,0x3FFC,0x7FFC,0x000C,0x000C,0x000C,0x000C,0x0000,0x0000,0x0000},/*"未命名文件",0*/
23 //{0x0022,0x0022,0x0024,0x7FA4,0x4928,0x4930,0x4920,0x7FFF,0x4920,0x4930,0x4928,0x7FA4,0x0024,0x0022,0x0022,0x0000},/*"果",0*/
24 void Hc595SendByte(char c,u16 dat)//操作74HC595函數 
25 {
26     u16 a;
27     if(!c){//sbit比較特殊 先這么玩
28             baseSHCP_0=0;
29             baseSTCP_0=0;
30             for(a=0;a<16;a++)
31             {
32                 baseDS_0=dat>>15;
33                 dat<<=1;
34                 baseSHCP_0=1;
35                 baseSHCP_0=0;    
36             }
37             baseSTCP_0=1;
38             baseSTCP_0=0;
39     }else{
40             baseSHCP_1=0;
41             baseSTCP_1=0;
42             for(a=0;a<16;a++)
43             {
44                 baseDS_1=dat>>15;
45                 dat<<=1;
46                 baseSHCP_1=1;
47                 baseSHCP_1=0;    
48             }
49             baseSTCP_1=1;
50             baseSTCP_1=0;
51     }
52 }
53 
54 void delay(unsigned int time)
55 {
56   unsigned int i,j;
57   for(i=0;i<time;i++)
58     for(j=0;j<121;j++);
59 }
60 
61 void main(void){
62     char i = 0;
63     while(1){
64         for(i=0;i<16;i++)
65         {
66             Hc595SendByte(1,LAB[i]);
67             Hc595SendByte(0,~inData[1][i]);    //發送段選數據
68             delay(1);           //延時
69         }
70     };
71 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM