久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4569|回復: 20
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
80黑幣
用獨立按鍵控制16*16LED點陣模塊點亮和熄滅
按下K1 出現漢字“開”,顯示10S后熄滅。
按下K2出現漢字“關”,顯示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);
                }               
        }               
}



最佳答案

查看完整內容

用選擇結構中斷比如這樣 if(key1==0||key2==00)key=0就是接地,也就是按下 { if(key1=0) { 顯示開 延遲函數 } if(key2=0) { 顯示關 延遲函數 } } 不過首先你要做一顯示字的庫出來
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:950946 發表于 2021-7-13 15:35 | 只看該作者
用選擇結構中斷比如這樣
if(key1==0||key2==00)key=0就是接地,也就是按下
{
if(key1=0)
{
顯示開
延遲函數
}
if(key2=0)
{
顯示關
延遲函數
}



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

使用道具 舉報

板凳
ID:123289 發表于 2021-7-14 08:54 | 只看該作者
1、先編好以下三個漢字的點陣:【開】、【關】、【 】。
2、做一個標記K,做一個計數器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計時(減)。
寫程序不重要,重要的是如果架構程序,如果構思、架構不是你的善長,及早改專業。
回復

使用道具 舉報

地板
ID:874695 發表于 2021-7-14 09:58 | 只看該作者
yzwzfyz 發表于 2021-7-14 08:54
1、先編好以下三個漢字的點陣:【開】、【關】、【 】。
2、做一個標記K,做一個計數器T10。
3、編寫顯示 ...

定時器那個怎么弄
回復

使用道具 舉報

5#
ID:874695 發表于 2021-7-14 10:00 | 只看該作者
dwb123 發表于 2021-7-14 09:47
用選擇結構中斷比如這樣
if(key1==0||key2==00)key=0就是接地,也就是按下
{

延遲函數怎么弄啊
回復

使用道具 舉報

6#
ID:844772 發表于 2021-7-14 10:16 | 只看該作者
000999 發表于 2021-7-14 10:00
延遲函數怎么弄啊

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

使用道具 舉報

7#
ID:874695 發表于 2021-7-14 10:27 | 只看該作者
glinfei 發表于 2021-7-14 10:16
稍微改了你的延遲函數,這樣delay(10)大約就10s了。
void delay(u16 i)
{ u16 j;  

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

使用道具 舉報

8#
ID:161164 發表于 2021-7-14 10:49 | 只看該作者
glinfei 發表于 2021-7-14 10:16
稍微改了你的延遲函數,這樣delay(10)大約就10s了。
void delay(u16 i)
{ u16 j;  

延遲10秒太可怕了
在這10秒內什么都不能干
回復

使用道具 舉報

9#
ID:332444 發表于 2021-7-14 11:21 | 只看該作者

回復

使用道具 舉報

10#
ID:874695 發表于 2021-7-14 11:36 | 只看該作者

怎么弄10S后熄滅啊

回復

使用道具 舉報

11#
ID:332444 發表于 2021-7-14 12:22 | 只看該作者
10秒開定時器計數
回復

使用道具 舉報

12#
ID:844772 發表于 2021-7-14 14:33 | 只看該作者
000999 發表于 2021-7-14 10:27
我顯示的字為啥
一直再亮

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

使用道具 舉報

13#
ID:874695 發表于 2021-7-14 16:50 | 只看該作者
glinfei 發表于 2021-7-14 14:33
我以為你別的已經解決只問延時函數啊,一直亮是因為這個延時函數參數單位是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);
                    }
             }
     }
         
}         
回復

使用道具 舉報

14#
ID:332444 發表于 2021-7-14 16:52 | 只看該作者
看我回復的基本都是函數化的模塊,隨意選取組合即可實現,定時器也是一樣直接復制調用即可,計數自己修改即可,設置一個標志時間到就復原,按鍵按下就標記,就這么簡單.
回復

使用道具 舉報

15#
ID:874695 發表于 2021-7-14 16:55 | 只看該作者
glinfei 發表于 2021-7-14 14:33
我以為你別的已經解決只問延時函數啊,一直亮是因為這個延時函數參數單位是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);
                    }
             }
     }
         
}         

回復

使用道具 舉報

16#
ID:874695 發表于 2021-7-14 17:02 | 只看該作者
glinfei 發表于 2021-7-14 14:33
我以為你別的已經解決只問延時函數啊,一直亮是因為這個延時函數參數單位是1S,你給了延時1000S,可不是一 ...

缺個定時器中斷
回復

使用道具 舉報

17#
ID:839438 發表于 2021-7-14 17:27 | 只看該作者
老哥,慢慢來吧,萌新提示:可以用延時+標志位
1、先顯示漢字
2、延時,可以用定時器,也可以用delya延時
回復

使用道具 舉報

18#
ID:874695 發表于 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);
                    }
             }
     }
         
}   
回復

使用道具 舉報

19#
ID:839438 發表于 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 定時 改改就是你的了
回復

使用道具 舉報

20#
ID:874695 發表于 2021-7-14 19:14 | 只看該作者
我會想你的 發表于 2021-7-14 17:39
void Timer0Init(void)                //1000微秒@22.1184MHz
{
        AUXR |= 0x80;                //定時器時鐘1T模式

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

使用道具 舉報

21#
ID:332444 發表于 2021-7-14 22:16 | 只看該作者
看程序前面按鍵代碼還好,后面是自學的還是什么人教的按鍵代碼
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄色片亚洲| 久草免费电影 | 欧美日韩国产在线观看 | 欧美一级二级在线观看 | 精品无码久久久久久久动漫 | 一区中文字幕 | 久久一二三区 | 国产在线观 | 欧美综合精品 | 亚洲一区二区久久 | 亚洲国产成人精品女人久久久野战 | jizz18国产| 国产1区2区在线观看 | 日本午夜在线视频 | 精品一区二区三区在线视频 | 91久久国产综合久久 | 国产一级黄色网 | 伊人色综合久久天天五月婷 | www精品美女久久久tv | 精品国产欧美日韩不卡在线观看 | 国产一区二区三区四区 | 亚洲中午字幕 | 亚洲美女网站 | 亚洲精品电影网在线观看 | 欧美一区不卡 | 久久久久久亚洲 | 精品久久久久一区二区国产 | 狠狠色综合网站久久久久久久 | 天天操夜夜操免费视频 | 亚洲在线免费 | 在线成人www免费观看视频 | 欧美一区二区综合 | 国产精品久久久久久久久免费 | 国产精品久久久久久一级毛片 | 亚洲视频免费在线观看 | www.毛片| av黄色在线播放 | 中文字幕 在线观看 | 在线观看免费黄色片 | 日韩中文一区 | 久久免费视频1 |