51微控制器基於74HC595級聯驅動16X16LED點陣
摘要:
電路圖:
原理:
首先Protues基礎庫件裡是沒有16X16的點陣的,需要從網上下載或者是自己DIY出來一個,我就是對著百度DIY出來的,建議大家有條件的話也嘗試DIY一下,增強對點陣電路的瞭解。不想DIY的話就去下載吧,有時間我會把這套電路圖和16x16設計的電路圖放上來...
電路圖:
原理:
首先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{ 150X8000,0X4000,0X2000,0X1000,0X0800,0X0400,0X0200,0X0100, 160X0080,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 { 26u16 a; 27if(!c){//sbit比較特殊 先這麼玩 28baseSHCP_0=0; 29baseSTCP_0=0; 30for(a=0;a<16;a++) 31{ 32baseDS_0=dat>>15; 33dat<<=1; 34baseSHCP_0=1; 35baseSHCP_0=0; 36} 37baseSTCP_0=1; 38baseSTCP_0=0; 39}else{ 40baseSHCP_1=0; 41baseSTCP_1=0; 42for(a=0;a<16;a++) 43{ 44baseDS_1=dat>>15; 45dat<<=1; 46baseSHCP_1=1; 47baseSHCP_1=0; 48} 49baseSTCP_1=1; 50baseSTCP_1=0; 51} 52 } 53 54 void delay(unsigned int time) 55 { 56unsigned int i,j; 57for(i=0;i<time;i++) 58for(j=0;j<121;j++); 59 } 60 61 void main(void){ 62char i = 0; 63while(1){ 64for(i=0;i<16;i++) 65{ 66Hc595SendByte(1,LAB[i]); 67Hc595SendByte(0,~inData[1][i]);//傳送段選資料 68delay(1);//延時 69} 70}; 71 }