|
51單片機的C語言源碼~
顯示效果秀~
大家來一起玩耍吖~
基礎(chǔ)部分最終版
實現(xiàn)功能:
按下獨立按鍵后,分別顯示四種顯示效果,并在靜態(tài)數(shù)碼管顯示效果編號:
(1)按下k1:乒乓球回彈
(2)按下k2: LED燈1357位和0246位交替亮滅
(3)按下k3: 中心波浪向兩側(cè)推出
(4)按下k4:點陣顯示桃心笑臉
接線:
靜態(tài)數(shù)碼管JP3------P0
數(shù)碼管段選J12------P2
點陣J17------P595_A,J18------P595_B
獨立按鍵k1------P1^1
K2------P1^2
K3------P1^3
K4------P1^4
注意:595跳帽要接上,165和JP1302的跳帽要摘去
0.jpg (39.2 KB, 下載次數(shù): 25)
下載附件
2018-6-11 17:22 上傳
單片機源程序如下:
- #include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
- #include "intrins.h"
- typedef unsigned int u16; //對數(shù)據(jù)類型進行聲明定義
- typedef unsigned char u8;
- #define GPIO_DIG P0
- sbit k1=P1^1;
- sbit k2=P1^2;
- sbit k3=P1^3;
- sbit k4=P1^4;
- #define led P2 //將P2口定義為led 后面就可以使用led代替P2口
- u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
- //--定義使用的IO口--//
- sbit SRCLK=P3^6;
- sbit R_CLK=P3^5;
- sbit SER=P3^4;
- //定義LED點陣的位選,也就是類似于數(shù)碼管的位選,因為要對其動態(tài)掃描操作
- //數(shù)組前16位和后16位數(shù)據(jù)正好是相反的,也就是說先讓第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; 此表情下對應(yīng)的點陣為:寬x高=16x16 --*/
- 0x00,0x08,0x1C,0x3E,0x7C,0x7C,0x3E,0x1C,
- 0x08,0x00,0x20,0x70,0xE0,0xE0,0x70,0x20,
- 0x00,0x04,0x08,0x10,0x20,0x20,0x40,0x41,
- 0x42,0x41,0x20,0x20,0x10,0x08,0x04,0x00
- };
- /*******************************************************************************
- * 函 數(shù) 名 : delay
- * 函數(shù)功能 : 延時函數(shù),i=1時,大約延時10us
- *******************************************************************************/
- void delay(u16 i)
- {
- while(i--);
- }
- /******************************************************************************
- 函數(shù)功能:第一種LED運行效果 :乒乓球回彈
- ******************************************************************************/
- void firstLedDisplay()
- {
- u8 i;
- led=0x01;
- {
- for(i=0;i<7;i++) //將led左移一位
- {
- led=_crol_(led,1);
- delay(30000); //大約延時450ms
- }
- for(i=0;i<7;i++) //將led右移一位
- {
- led=_cror_(led,1);
- delay(30000); //大約延時450ms
- }
- }
- }
- /**********************************************
- 函數(shù)功能:LED運行第二種效果:0,2,4,6和1,3,5,7交替亮滅
- **********************************************/
- void secondLedDisplay()
- {
- led=0x55;
- delay(50000); //大約延時450ms
- led=~led;
- delay(50000);
- }
- /*****************************************************
- 函數(shù)功能:LED運行第三種效果:中心波浪向兩側(cè)推出
- *****************************************************/
- void thirdLedDisplay()
- {
- led=0x18;
- delay(50000);
- led=0x24;
- delay(50000);
- led=0x42;
- delay(50000);
- led=0x81;
- delay(50000);
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
- * 函數(shù)功能 : 通過595發(fā)送四個字節(jié)的數(shù)據(jù)
- * 輸 入 : dat1:第4個595輸出數(shù)值
- * * dat2: 第3個595輸出數(shù)值
- * * dat3:第2個595輸出數(shù)值
- * * dat4:第1個595輸出數(shù)值
- * 輸 出 : 無
- *******************************************************************************/
- void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
- {
- u8 a;
- SRCLK = 1;
- R_CLK = 1;
- for(a=0;a<8;a++) //發(fā)送8位數(shù)
- {
- SER = dat1 >> 7; //從最高位開始發(fā)送
- dat1 <<= 1;
- SRCLK = 0; //發(fā)送時序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
-
- for(a=0;a<8;a++) //發(fā)送8位數(shù)
- {
- SER = dat2 >> 7; //從最高位開始發(fā)送
- dat2 <<= 1;
- SRCLK = 0; //發(fā)送時序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- for(a=0;a<8;a++) //發(fā)送8位數(shù)
- {
- SER = dat3 >> 7; //從最高位開始發(fā)送
- dat3 <<= 1;
- SRCLK = 0; //發(fā)送時序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- for(a=0;a<8;a++) //發(fā)送8位數(shù)
- {
- SER = dat4 >> 7; //從最高位開始發(fā)送
- dat4 <<= 1;
- SRCLK = 0; //發(fā)送時序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- R_CLK = 0;
- _nop_();
- _nop_();
- R_CLK = 1;
- }
- void dianZhenDisplay()
- {
- u8 i;
- for(i=0;i<16;i++)
- {
- Hc595SendByte(~ledwei[i+16],~ledwei[i],ledduan1[16+i],ledduan1[i]);
- delay(10);
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : BreakInit()
- * 函數(shù)功能 : 設(shè)置中斷
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void BreakInit()
- {
- EA=0;
- TMOD=0x01;
- TH0=0XFC; //給定時器賦初值,定時1ms
- TL0=0X18;
- IE=0x82;
- TR0=1;//打開定時器
- }
-
- /*main()*/
- u8 flag = 0 ;
- void main()
- {
- BreakInit();
- while(1)
- {
- switch (flag) {
- case 1 :
- GPIO_DIG=~smgduan[1];
- firstLedDisplay() ;
- break ;
- case 2 :
- GPIO_DIG=~smgduan[2];
- secondLedDisplay() ;
- break ;
- case 3 :
- GPIO_DIG=~smgduan[3];
- thirdLedDisplay() ;
- break ;
- case 4 :
- GPIO_DIG=~smgduan[4];
- dianZhenDisplay() ;
- break ;
- default :
- break ;
- }
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : void Timer0() interrupt 1
- * 函數(shù)功能 : 定時器0中斷函數(shù)
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Timer0() interrupt 1
- {
- static u16 i;
- TH0=0XFC; //給定時器賦初值,定時1ms
- TL0=0X18;
- i++;
- if(i==100)
- {
- i=0;
- if(k1==0)
- {
- flag=1;
- }
- if(k2==0)
- {
- flag=2;
- }
- if(k3==0)
- {
- flag = 3 ;
- }
- if(k4==0)
- {
- flag=4;
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
基礎(chǔ)部分最終版.docx
(163.52 KB, 下載次數(shù): 14)
2018-6-11 15:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|