附上實驗結果的截圖,完整電路圖和程序在壓縮包內
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- /*8x8LED顯示從0到9數據 */
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- //74HC595 行選
- sbit LOCK = P2^3; //禁止輸出
- sbit SCLK = P2^4; //時鐘引腳
- sbit DATA = P2^5; //數據
- //74HC138 列選
- sbit hc138_A = P2^0;
- sbit hc138_B = P2^1;
- sbit hc138_C = P2^2;
- //數字字模,10個數字0~9,每個數字8個字節(縱向,正序)
- uchar code shuzi[10][8]=
- {
- {0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, //0
- {0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00}, //1
- {0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, //2
- {0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, //3
- {0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, //4
- {0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, //5
- {0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //6
- {0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, //7
- {0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, //8
- {0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00}, //9
- };
- //數字字模指針
- uchar col=0;
- //第幾個字符
- uchar count=0;
- //定時器定時次數
- uchar time = 0;
- //595串行輸入的行數據
- uchar d=0;
- //8位數據從74HC595的串行輸入,并行輸出
- void dat74595(unsigned char d)
- {
- unsigned char i;
- for (i=0;i<8;i++) //8位數據串行輸入
- {
- SCLK = 0;
- DATA = (bit)(d&0x80);
- SCLK = 1;
- d=d<<1;
- }
- DATA = 1;
- LOCK=0;LOCK=1; //8位數據并行輸出
- }
- void main(void)
- {
- TMOD=0x01; //定時器0方式1
- TH0=(65536-5000)/256; //設置定時計數初值,5ms
- TL0=(65536-5000)%256;
- TR0=1;
- ET0=1; //打開定時器0中斷
- EA=1;
- while(1);
- }
- /*定時器0中斷服務程序,5ms中斷一次,掃描一列*/
- void Timer0Int(void) interrupt 1
- {
- TH0=(65536-5000)/256;
- TL0=(65536-5000)%256;
-
- switch(col) //列選通
- {
- case 0: hc138_C =0; hc138_B=0; hc138_A=0; // 選擇第0列顯示
- break;
- case 1: hc138_C =0; hc138_B=0; hc138_A=1; // 選擇第1列顯示
- break;
- case 2: hc138_C =0; hc138_B=1; hc138_A=0; // 選擇第2列顯示
- break;
- case 3: hc138_C =0; hc138_B=1; hc138_A=1; // 選擇第3列顯示
- break;
- case 4: hc138_C =1; hc138_B=0; hc138_A=0; // 選擇第4列顯示
- break;
- case 5: hc138_C =1; hc138_B=0; hc138_A=1; // 選擇第5列顯示
- break;
- case 6: hc138_C =1; hc138_B=1; hc138_A=0; // 選擇第6列顯示
- break;
- case 7: hc138_C =1; hc138_B=1; hc138_A=1; // 選擇第7列顯示
- default: break;
- }
- d=shuzi[count][col]; //行,送數字字模
- dat74595(d); //把數一位一位的傳給74HC595
- col++;
- if(col==8)
- {
- col=0;
- }
-
- time++;
- if (time >= 200) //定時200次,1s,每個數字顯示1s
- {
- time = 0;
- count++; //準備顯示下一個數字
- if (count >= 10)
- {
- count = 0;
- }
- }
- }
復制代碼
所有資料51hei提供下載:
點陣.zip
(61.44 KB, 下載次數: 108)
2018-8-28 08:10 上傳
點擊文件名下載附件
|