代碼:
- /**************************************************************************************
- * LED點陣--顯示漢字實驗 *
- 實現現象:下載程序后,按照光盤內操作視頻接線,LED點陣顯示漢字
-
- 注意事項:必須將74HC595模塊的JP595短接片短接,否則不會出現現象
- ***************************************************************************************/
- #include "reg51.h" //此文件中定義了單片機的一些特殊功能寄存器
- #include "intrins.h"
- typedef unsigned int u16; //對數據類型進行聲明定義
- typedef unsigned char u8;
- //--定義使用的IO口--//
- sbit SRCLK=P3^6;
- sbit RCLK=P3^5;
- sbit SER=P3^4;
- //定義LED點陣的位選,也就是類似于數碼管的位選,因為要對其動態掃描操作
- //數組前16位和后16位數據正好是相反的,也就是說先讓第3個595輸出低電平,然后再讓第4個595輸出低電平
- u8 code ledwei[]=
- {
- 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
- };
- u8 code ledduan1[]=
- {
- /*-- 文字: 普 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x40,0x44,0x54,0x64,0x45,0x7E,0x44,0x44,0x44,0x7E,0x45,0x64,0x54,0x44,0x40,0x00,
- 0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,
- };
- u8 code ledduan2[]=
- {
- /*-- 文字: 中 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,
- 0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x0F,0x00,0x00,0x00,
- };
- /*******************************************************************************
- * 函 數 名 : delay
- * 函數功能 : 延時函數,i=1時,大約延時10us
- *******************************************************************************/
- void delay(u16 i)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函 數 名 : Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
- * 函數功能 : 通過595發送四個字節的數據
- * 輸 入 : dat1:第4個595輸出數值
- * * dat2: 第3個595輸出數值
- * * dat3:第2個595輸出數值
- * * dat4:第1個595輸出數值
- * 輸 出 : 無
- *******************************************************************************/
- void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
- {
- u8 a;
- SRCLK = 1;
- RCLK = 1;
- for(a=0;a<8;a++) //發送8位數
- {
- SER = dat1 >> 7; //從最高位開始發送
- dat1 <<= 1;
- SRCLK = 0; //發送時序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- for(a=0;a<8;a++) //發送8位數
- {
- SER = dat2 >> 7; //從最高位開始發送
- dat2 <<= 1;
- SRCLK = 0; //發送時序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- for(a=0;a<8;a++) //發送8位數
- {
- SER = dat3 >> 7; //從最高位開始發送
- dat3 <<= 1;
- SRCLK = 0; //發送時序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- for(a=0;a<8;a++) //發送8位數
- {
- SER = dat4 >> 7; //從最高位開始發送
- dat4 <<= 1;
- SRCLK = 0; //發送時序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- RCLK = 0;
- _nop_();
- _nop_();
- RCLK = 1;
- }
- /*******************************************************************************
- * 函 數 名 : main
- * 函數功能 : 主函數
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void main()
- {
- u8 i;
-
- while(1)
- {
- for(i=0;i<16;i++)
- {
- Hc595SendByte(~ledwei[i+16],~ledwei[i],ledduan1[16+i],ledduan1[i]);
- delay(10);
- }
- }
- }
復制代碼
|