找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4697|回復: 20
收起左側

如何用單片機+獨立按鍵控制16*16LED點陣模塊點亮和熄滅?求指導

[復制鏈接]
ID:874695 發(fā)表于 2021-7-13 15:35 | 顯示全部樓層 |閱讀模式
80黑幣
用獨立按鍵控制16*16LED點陣模塊點亮和熄滅
按下K1 出現(xiàn)漢字“開”,顯示10S后熄滅。
按下K2出現(xiàn)漢字“關”,顯示10S后熄滅

#include "reg51.h"                        
#include "intrins.h"

typedef unsigned int u16;         
typedef unsigned char u8;


sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
sbit k1=P1^0;


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 ledwei1[]=
{


0x80,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x80,0x00,
0x00,0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,

};

u8 code ledwei2[]=
{


0x00,0x00,0x10,0x11,0x16,0x10,0x10,0xF0,0x10,0x10,0x14,0x13,0x10,0x00,0x00,0x00,
0x81,0x81,0x41,0x41,0x21,0x11,0x0D,0x03,0x0D,0x11,0x21,0x41,0x41,0x81,0x81,0x00,
};

void delay(u16 i)
{
        while(i--);      
}


void keypros()
{
        if(k1==0)                  
        {      
                delay(1000);   
                if(k1==0)         
                {
                        ledwei=!ledwei;         
                }
                while(!k1);         
        }               
}


void main()
{      
        ledwei=1;
        while(1)
        {      
                keypros();  
        }               
}




void delay(u16 i)
{
        while(i--);      
}


void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
        u8 a;

        SRCLK = 1;
        RCLK = 1;

        for(a=0;a<8;a++)                 
        {
                SER = dat1 >> 7;                 
                dat1 <<= 1;

                SRCLK = 0;                        
                _nop_();
                _nop_();
                SRCLK = 1;      
        }

        for(a=0;a<8;a++)                 
        {
                SER = dat2 >> 7;                 
                dat2 <<= 1;

                SRCLK = 0;                        
                _nop_();
                _nop_();
                SRCLK = 1;      
        }

        for(a=0;a<8;a++)                 
        {
                SER = dat3 >> 7;                 
                dat3 <<= 1;

                SRCLK = 0;                        
                _nop_();
                _nop_();
                SRCLK = 1;      
        }

        for(a=0;a<8;a++)                 
        {
                SER = dat4 >> 7;                 
                dat4 <<= 1;

                SRCLK = 0;                        
                _nop_();
                _nop_();
                SRCLK = 1;      
        }

        RCLK = 0;
        _nop_();
        _nop_();
        RCLK = 1;
}



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);
                }               
        }               
}



最佳答案

查看完整內(nèi)容

用選擇結構中斷比如這樣 if(key1==0||key2==00)key=0就是接地,也就是按下 { if(key1=0) { 顯示開 延遲函數(shù) } if(key2=0) { 顯示關 延遲函數(shù) } } 不過首先你要做一顯示字的庫出來
回復

使用道具 舉報

ID:950946 發(fā)表于 2021-7-13 15:35 | 顯示全部樓層
用選擇結構中斷比如這樣
if(key1==0||key2==00)key=0就是接地,也就是按下
{
if(key1=0)
{
顯示開
延遲函數(shù)
}
if(key2=0)
{
顯示關
延遲函數(shù)
}



}
不過首先你要做一顯示字的庫出來
回復

使用道具 舉報

ID:123289 發(fā)表于 2021-7-14 08:54 | 顯示全部樓層
1、先編好以下三個漢字的點陣:【開】、【關】、【 】。
2、做一個標記K,做一個計數(shù)器T10。
3、編寫顯示程序(以下三者,只做一個):
3.1、T10=0,顯示【 】。
3.2、K=1,顯示【開 】。
3.3、K=0,顯示【關 】。
4、按下K1后,讓K=1,T10=10秒。
5、按下K2后,讓K=0,T10=10秒。
6、做一個定時器:
6.1、如果T10=0,什么也不做。
6.2、如果T10<>0,就對T10計時(減)。
寫程序不重要,重要的是如果架構程序,如果構思、架構不是你的善長,及早改專業(yè)。
回復

使用道具 舉報

ID:874695 發(fā)表于 2021-7-14 09:58 | 顯示全部樓層
yzwzfyz 發(fā)表于 2021-7-14 08:54
1、先編好以下三個漢字的點陣:【開】、【關】、【 】。
2、做一個標記K,做一個計數(shù)器T10。
3、編寫顯示 ...

定時器那個怎么弄
回復

使用道具 舉報

ID:874695 發(fā)表于 2021-7-14 10:00 | 顯示全部樓層
dwb123 發(fā)表于 2021-7-14 09:47
用選擇結構中斷比如這樣
if(key1==0||key2==00)key=0就是接地,也就是按下
{

延遲函數(shù)怎么弄啊
回復

使用道具 舉報

ID:844772 發(fā)表于 2021-7-14 10:16 | 顯示全部樓層
000999 發(fā)表于 2021-7-14 10:00
延遲函數(shù)怎么弄啊

稍微改了你的延遲函數(shù),這樣delay(10)大約就10s了。
void delay(u16 i)
{ u16 j;  
while(i--)
    { for(j=0;j<50000;j++);      
      for(j=0;j<50000;j++);
    }
}
回復

使用道具 舉報

ID:874695 發(fā)表于 2021-7-14 10:27 | 顯示全部樓層
glinfei 發(fā)表于 2021-7-14 10:16
稍微改了你的延遲函數(shù),這樣delay(10)大約就10s了。
void delay(u16 i)
{ u16 j;  

我顯示的字為啥
一直再亮
回復

使用道具 舉報

ID:161164 發(fā)表于 2021-7-14 10:49 | 顯示全部樓層
glinfei 發(fā)表于 2021-7-14 10:16
稍微改了你的延遲函數(shù),這樣delay(10)大約就10s了。
void delay(u16 i)
{ u16 j;  

延遲10秒太可怕了
在這10秒內(nèi)什么都不能干
回復

使用道具 舉報

ID:332444 發(fā)表于 2021-7-14 11:21 | 顯示全部樓層
錄像49_轉.gif
回復

使用道具 舉報

ID:874695 發(fā)表于 2021-7-14 11:36 | 顯示全部樓層
回復

使用道具 舉報

ID:332444 發(fā)表于 2021-7-14 12:22 | 顯示全部樓層
10秒開定時器計數(shù)
回復

使用道具 舉報

ID:844772 發(fā)表于 2021-7-14 14:33 | 顯示全部樓層
000999 發(fā)表于 2021-7-14 10:27
我顯示的字為啥
一直再亮

我以為你別的已經(jīng)解決只問延時函數(shù)啊,一直亮是因為這個延時函數(shù)參數(shù)單位是1S,你給了延時1000S,可不是一直亮。這個程序沒啥難度,而且大多數(shù)代碼你都寫,具體還差什么��?
回復

使用道具 舉報

ID:874695 發(fā)表于 2021-7-14 16:50 | 顯示全部樓層
glinfei 發(fā)表于 2021-7-14 14:33
我以為你別的已經(jīng)解決只問延時函數(shù)啊,一直亮是因為這個延時函數(shù)參數(shù)單位是1S,你給了延時1000S,可不是一 ...

#include "reg51.h"                        
#include "intrins.h"


typedef unsigned int u16;         
typedef unsigned char u8;
unsigned int YSJS=0;


sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
sbit k1=P1^0;
sbit k2=P1^1;




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[]=
{

0x80,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x80,0x00,
0x00,0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,

};

u8 code ledduan2[]=
{

0x00,0x00,0x10,0x11,0x16,0x10,0x10,0xF0,0x10,0x10,0x14,0x13,0x10,0x00,0x00,0x00,
0x81,0x81,0x41,0x41,0x21,0x11,0x0D,0x03,0x0D,0x11,0x21,0x41,0x41,0x81,0x81,0x00,
};

/*******************************************************************************

*******************************************************************************/
void delay(u16 i)
{
        
        while(i--);        
}

void keypros()
{
        if(k1==0)                  
        {        
                delay(100);   
                if(k1==0)        
                {
                SRCLK=1;
                RCLK=1;        
                                 }
                while(!k1);         
          }        
        if(k2==0)                  
        {        
                delay(1000);
                if(k2==0)         
                {
                SRCLK=1;
                RCLK=1;        
                                 }
                while(!k2);
   }
}


void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
        u8 a;

        SRCLK = 1;
        RCLK = 1;
        for(a=0;a<8;a++)                 
        {
                SER = dat1 >> 7;               
                dat1 <<= 1;

                SRCLK = 0;                        
                _nop_();
                _nop_();
                SRCLK = 1;        
        }

        for(a=0;a<8;a++)               
        {
                SER = dat2 >> 7;               
                dat2 <<= 1;

                SRCLK = 0;                        
                _nop_();
                _nop_();
                SRCLK = 1;        
        }

        for(a=0;a<8;a++)                 
        {
                SER = dat3 >> 7;               
                dat3 <<= 1;

                SRCLK = 0;                        
                _nop_();
                _nop_();
                SRCLK = 1;        
        }

        for(a=0;a<8;a++)               
        {
                SER = dat4 >> 7;               
                dat4 <<= 1;

                SRCLK = 0;                        
                _nop_();
                _nop_();
                SRCLK = 1;        
        }

        RCLK = 0;
        _nop_();
        _nop_();
        RCLK = 1;
}



void main()
{        
        u8 i;
         if(k2==0)
         {
                 
        while(1)
        {         
                for(i=0;i<16;i++)
                {
                        Hc595SendByte(~ledwei[i+16],~ledwei[ i],ledduan2[16+i],ledduan2[ i]);
                        delay(10);
                    }               
             }               
    }
         if(k1==0)
         {
        
        while(1)
        {         
                for(i=0;i<16;i++)
                {
                        Hc595SendByte(~ledwei[i+16],~ledwei[i ],ledduan1[16+i],ledduan1[ i]);
                        delay(10);
                    }
             }
     }
         
}         
回復

使用道具 舉報

ID:332444 發(fā)表于 2021-7-14 16:52 | 顯示全部樓層
看我回復的基本都是函數(shù)化的模塊,隨意選取組合即可實現(xiàn),定時器也是一樣直接復制調(diào)用即可,計數(shù)自己修改即可,設置一個標志時間到就復原,按鍵按下就標記,就這么簡單.
回復

使用道具 舉報

ID:874695 發(fā)表于 2021-7-14 16:55 | 顯示全部樓層
glinfei 發(fā)表于 2021-7-14 14:33
我以為你別的已經(jīng)解決只問延時函數(shù)啊,一直亮是因為這個延時函數(shù)參數(shù)單位是1S,你給了延時1000S,可不是一 ...

差個定時中斷
#include "reg51.h"  
#include "intrins.h"


typedef unsigned int u16;     
typedef unsigned char u8;
unsigned int YSJS=0;

//--¶¨òåê1óÃμÄIO¿ú--//
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
sbit k1=P1^0;
sbit k2=P1^1;



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[]=
{
/*--  ÎÄ×Ö:  ¿a  --*/
/*--  ËÎìå12;  ′Ë×Öìå϶Ôó|μÄμãÕóÎa£o¿íx¸ß=16x16   --*/
0x80,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x80,0x00,
0x00,0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,

};

u8 code ledduan2[]=
{

0x00,0x00,0x10,0x11,0x16,0x10,0x10,0xF0,0x10,0x10,0x14,0x13,0x10,0x00,0x00,0x00,
0x81,0x81,0x41,0x41,0x21,0x11,0x0D,0x03,0x0D,0x11,0x21,0x41,0x41,0x81,0x81,0x00,
};


void delay(u16 i)
{
        
        while(i--);        
}

void keypros()
{
        if(k1==0)     
        {        
                delay(100);  
                if(k1==0)  
                {
                SRCLK=1;
                RCLK=1;        
                                 }
                while(!k1);
          }        
        if(k2==0)   
        {        
                delay(1000);
                if(k2==0)  
                {
                SRCLK=1;
                RCLK=1;        
                                 }
                while(!k2);
   }
}


void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
        u8 a;

        SRCLK = 1;
        RCLK = 1;
        for(a=0;a<8;a++)  
        {
                SER = dat1 >> 7;   
                dat1 <<= 1;

                SRCLK = 0;   
                _nop_();
                _nop_();
                SRCLK = 1;        
        }

        for(a=0;a<8;a++)   
        {
                SER = dat2 >> 7;
                dat2 <<= 1;

                SRCLK = 0;
                _nop_();
                _nop_();
                SRCLK = 1;        
        }

        for(a=0;a<8;a++)   
        {
                SER = dat3 >> 7;
                dat3 <<= 1;

                SRCLK = 0;  
                _nop_();
                _nop_();
                SRCLK = 1;        
        }

        for(a=0;a<8;a++)  
        {
                SER = dat4 >> 7;   
                dat4 <<= 1;

                SRCLK = 0;  
                _nop_();
                _nop_();
                SRCLK = 1;        
        }

        RCLK = 0;
        _nop_();
        _nop_();
        RCLK = 1;
}



void main()
{        
        u8 i;
         if(k2==0)
         {
                 
        while(1)
        {         
                for(i=0;i<16;i++)
                {
                        Hc595SendByte(~ledwei[i+16],~ledwei[ i],ledduan2[16+i],ledduan2[i ]);
                        delay(10);
                    }               
             }               
    }
         if(k1==0)
         {
        
        while(1)
        {         
                for(i=0;i<16;i++)
                {
                        Hc595SendByte(~ledwei[i+16],~ledwei[ i],ledduan1[16+i],ledduan1[ i]);
                        delay(10);
                    }
             }
     }
         
}         

回復

使用道具 舉報

ID:874695 發(fā)表于 2021-7-14 17:02 | 顯示全部樓層
glinfei 發(fā)表于 2021-7-14 14:33
我以為你別的已經(jīng)解決只問延時函數(shù)啊,一直亮是因為這個延時函數(shù)參數(shù)單位是1S,你給了延時1000S,可不是一 ...

缺個定時器中斷
回復

使用道具 舉報

ID:839438 發(fā)表于 2021-7-14 17:27 | 顯示全部樓層
老哥,慢慢來吧,萌新提示:可以用延時+標志位
1、先顯示漢字
2、延時,可以用定時器,也可以用delya延時
回復

使用道具 舉報

ID:874695 發(fā)表于 2021-7-14 17:36 | 顯示全部樓層
#include "reg51.h"                        
#include "intrins.h"


typedef unsigned int u16;         
typedef unsigned char u8;
unsigned int YSJS=0;

//--?¨ò?ê1ó?μ?IO?ú
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
sbit k1=P1^0;
sbit k2=P1^1;



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[]=
{


0x80,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x80,0x00,
0x00,0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,

};

u8 code ledduan2[]=
{


0x00,0x00,0x10,0x11,0x16,0x10,0x10,0xF0,0x10,0x10,0x14,0x13,0x10,0x00,0x00,0x00,
0x81,0x81,0x41,0x41,0x21,0x11,0x0D,0x03,0x0D,0x11,0x21,0x41,0x41,0x81,0x81,0x00,
};


void delay(u16 i)
{
        
        while(i--);        
}

void keypros()
{
        if(k1==0)                  
        {        
                delay(100);   
                if(k1==0)         
                {
                SRCLK=1;
                RCLK=1;        
                                 }
                while(!k1);         
          }        
        if(k2==0)                  
        {        
                delay(1000);   
                if(k2==0)         
                {
                SRCLK=1;
                RCLK=1;        
                                 }
                while(!k2);
   }
}


void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
        u8 a;

        SRCLK = 1;
        RCLK = 1;
        for(a=0;a<8;a++)                 
        {
                SER = dat1 >> 7;                 
                dat1 <<= 1;

                SRCLK = 0;                        
                _nop_();
                _nop_();
                SRCLK = 1;        
        }

        for(a=0;a<8;a++)                 
        {
                SER = dat2 >> 7;                 
                dat2 <<= 1;

                SRCLK = 0;                        
                _nop_();
                _nop_();
                SRCLK = 1;        
        }

        for(a=0;a<8;a++)                 
        {
                SER = dat3 >> 7;                 
                dat3 <<= 1;

                SRCLK = 0;                        
                _nop_();
                _nop_();
                SRCLK = 1;        
        }

        for(a=0;a<8;a++)                 
        {
                SER = dat4 >> 7;                 
                dat4 <<= 1;

                SRCLK = 0;                        
                _nop_();
                _nop_();
                SRCLK = 1;        
        }

        RCLK = 0;
        _nop_();
        _nop_();
        RCLK = 1;
}



void main()
{        
        u8 i;
         if(k2==0)
         {
                 
        while(1)
        {         
                for(i=0;i<16;i++)
                {
                        Hc595SendByte(~ledwei[i+16],~ledwei[ i],ledduan2[16+i],ledduan2[ i]);
                        delay(10);
                    }               
             }               
    }
         if(k1==0)
         {
        
        while(1)
        {         
                for(i=0;i<16;i++)
                {
                        Hc595SendByte(~ledwei[i+16],~ledwei[ i],ledduan1[16+i],ledduan1[ i]);
                        delay(10);
                    }
             }
     }
         
}   
回復

使用道具 舉報

ID:839438 發(fā)表于 2021-7-14 17:39 | 顯示全部樓層
void Timer0Init(void)                //1000微秒@22.1184MHz
{
        AUXR |= 0x80;                //定時器時鐘1T模式
        TMOD &= 0xF0;                //設置定時器模式
        TMOD |= 0x01;                //設置定時器模式
        TL0 = 0x9A;                //設置定時初值
        TH0 = 0xA9;                //設置定時初值
        TF0 = 0;                //清除TF0標志
        TR0 = 1;                //定時器0開始計時
        ET0 =1;
}
void Timer0() interrupt 1
{
       
  TL0 = 0x9A;                //設置定時初值
        TH0 = 0xA9;                //設置定時初值
        num++;
        Time_key_cnt++;
        Timer0_cnt++;
        if(Timer0_cnt >10)
                        {
                                Timer0_cnt=0;
                                Key_scan();
                        }
                        if(num >1000)
                        {
                                num =0;
                                LED =~LED;
                        }
}
stc 15f 0.1s 定時 改改就是你的了
回復

使用道具 舉報

ID:874695 發(fā)表于 2021-7-14 19:14 | 顯示全部樓層
我會想你的 發(fā)表于 2021-7-14 17:39
void Timer0Init(void)                //1000微秒@22.1184MHz
{
        AUXR |= 0x80;                //定時器時鐘1T模式

我這個的程序里面應該把啥替換LED
回復

使用道具 舉報

ID:332444 發(fā)表于 2021-7-14 22:16 | 顯示全部樓層
看程序前面按鍵代碼還好,后面是自學的還是什么人教的按鍵代碼
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表