標(biāo)題: 按鍵控制數(shù)碼管 [打印本頁]

作者: hhhh123as    時間: 2018-5-1 14:58
標(biāo)題: 按鍵控制數(shù)碼管
#include "reg52.h"    //此文件中定義了單片機(jī)的一些特殊功能寄存器
typedef unsigned int u16;   //對數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;  //定義按鍵端口
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值

#define KEY1 1
#define KEY2 2
#define KEY3 3
#define KEY4 4
char keynum;
u8 DisplayData[8];
/*******************************************************************************
* 函 數(shù) 名         : delay
* 函數(shù)功能     : 延時函數(shù),i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
//mode=0 單次   1:連續(xù)
u8 KeyScan(u8 mode)
{
static u8 keyen=1;
if(mode==1)
{
  keyen=1;
}
if(keyen==1&&(k1==0||k2==0||k3==0||k4==0))
{
  delay(1000);  //消抖處理
  keyen=0;
  if(k1==0)return KEY1;
  else if(k2==0)return KEY2;
  else if(k3==0)return KEY3;
  else if(k4==0)return KEY4;   
}
else if(k1==1&&k2==1&&k3==1&&k4==1)
{
  keyen=1;
}
return 0;
}

/*******************************************************************************
* 函 數(shù) 名         : DigDisplay
* 函數(shù)功能     : 數(shù)碼管動態(tài)掃描函數(shù),循環(huán)掃描8個數(shù)碼管顯示
*******************************************************************************/
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
  switch(i)  //位選,選擇點(diǎn)亮的數(shù)碼管,
  {
   case(0):
    LSA=0;LSB=0;LSC=0; break;//顯示第0位
   case(1):
    LSA=1;LSB=0;LSC=0; break;//顯示第1位
   case(2):
    LSA=0;LSB=1;LSC=0; break;//顯示第2位
   case(3):
    LSA=1;LSB=1;LSC=0; break;//顯示第3位
   case(4):
    LSA=0;LSB=0;LSC=1; break;//顯示第4位
   case(5):
    LSA=1;LSB=0;LSC=1; break;//顯示第5位
   case(6):
    LSA=0;LSB=1;LSC=1; break;//顯示第6位
   case(7):
    LSA=1;LSB=1;LSC=1; break;//顯示第7位
  }
  P0=DisplayData[i];//發(fā)送段碼
  delay(100); //間隔一段時間掃描
  P0=0x00;//消隱
}
}
void datapros()
{
u8 key=KeyScan(0);
switch(key)
{
  case 1:  keynum++;if(keynum==100)keynum=0; break;
  case 2:  keynum--;if(keynum<=0)keynum=99; break;
  case 3:  keynum=0; break;
  case 4:   break;
}
DisplayData[0]=smgduan[keynum%10];
DisplayData[1]=smgduan[keynum/10];
}
/*******************************************************************************
* 函 數(shù) 名       : main
* 函數(shù)功能   : 主函數(shù)
* 輸    入       : 無
* 輸    出      : 無
*******************************************************************************/
void main()
{
while(1)
{
  datapros();
  DigDisplay();
}  
}

按鍵控制數(shù)碼管.zip

17.48 KB, 下載次數(shù): 4, 下載積分: 黑幣 -5


作者: xiaoyu.    時間: 2018-5-18 15:20
獨(dú)立按鍵控制數(shù)碼管的時鐘
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit K1=P3^4;
sbit K2=P3^5;
sbit K3=P3^6;
sbit K4=P3^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uint aa;
uchar num1,num2,shi1,ge1,shi2,ge2;

void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

void display(uchar num1,uchar num2)
{
        shi1=num1/10;
        ge1=num1%10;
        shi2=num2/10;
        ge2=num2%10;
       
        dula=1;
        P0=table[shi1];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfe;
        wela=0;
        delay(1);

        dula=1;
        P0=table[ge1];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfd;
        wela=0;
        delay(1);

        dula=1;
        P0=table[shi2];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfb;
        wela=0;
        delay(1);

        dula=1;
        P0=table[ge2];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xf7;
        wela=0;
        delay(1);
}

void key()
{
        if(K1==0)
        {
                delay(5);
                if(K1==0)
                {
                        TR0=0;
                        while(!K1);
                }
        }

        if(K2==0)
        {
                delay(5);
                if(K2==0)
                {
                        if(num1==0)
                        {
                                num1=60;
                        }
                        num1--;
                        while(!K2);
                }
        }

        if(K3==0)
        {
                delay(5);
                if(K3==0)
                {
                        num1++;
                        if(num1>=60)
                        {
                                num1=num1-60;
                        }
                        while(!K3);
                }
        }

        if(K4==0)
        {
                delay(5);
                if(K4==0)
                {
                        TR0=1;
                        while(!K4);
                }
        }
}

void inint()
{
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
}

void main()
{
        inint();
        while(1)
        {
                key();
                display(num1,num2);
        }
}

void zhongduan()interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        aa++;
        if(aa==20)
        {
                aa=0;
                num2++;
                if(num2==60)
                {
                        num2=0;
                        num1++;
                        if(num1==60)
                                num1=0;
                }
        }
}




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1