欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 如何用單片機+獨立按鍵控制16*16LED點陣模塊點亮和熄滅?求指導 [打印本頁]

作者: 000999    時間: 2021-7-13 15:35
標題: 如何用單片機+獨立按鍵控制16*16LED點陣模塊點亮和熄滅?求指導
用獨立按鍵控制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);
                }               
        }               
}




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



}
不過首先你要做一顯示字的庫出來
作者: yzwzfyz    時間: 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計時(減)。
寫程序不重要,重要的是如果架構程序,如果構思、架構不是你的善長,及早改專業。
作者: 000999    時間: 2021-7-14 09:58
yzwzfyz 發表于 2021-7-14 08:54
1、先編好以下三個漢字的點陣:【開】、【關】、【 】。
2、做一個標記K,做一個計數器T10。
3、編寫顯示 ...

定時器那個怎么弄

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

延遲函數怎么弄啊

作者: glinfei    時間: 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++);
    }
}

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

我顯示的字為啥
一直再亮
作者: lkc8210    時間: 2021-7-14 10:49
glinfei 發表于 2021-7-14 10:16
稍微改了你的延遲函數,這樣delay(10)大約就10s了。
void delay(u16 i)
{ u16 j;  

延遲10秒太可怕了
在這10秒內什么都不能干
作者: xianfajushi    時間: 2021-7-14 11:21


作者: 000999    時間: 2021-7-14 11:36
xianfajushi 發表于 2021-7-14 11:21

怎么弄10S后熄滅啊


作者: xianfajushi    時間: 2021-7-14 12:22
10秒開定時器計數
作者: glinfei    時間: 2021-7-14 14:33
000999 發表于 2021-7-14 10:27
我顯示的字為啥
一直再亮

我以為你別的已經解決只問延時函數啊,一直亮是因為這個延時函數參數單位是1S,你給了延時1000S,可不是一直亮。這個程序沒啥難度,而且大多數代碼你都寫,具體還差什么啊?
作者: 000999    時間: 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);
                    }
             }
     }
         
}         
作者: xianfajushi    時間: 2021-7-14 16:52
看我回復的基本都是函數化的模塊,隨意選取組合即可實現,定時器也是一樣直接復制調用即可,計數自己修改即可,設置一個標志時間到就復原,按鍵按下就標記,就這么簡單.
作者: 000999    時間: 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);
                    }
             }
     }
         
}         


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

缺個定時器中斷

作者: 我會想你的    時間: 2021-7-14 17:27
老哥,慢慢來吧,萌新提示:可以用延時+標志位
1、先顯示漢字
2、延時,可以用定時器,也可以用delya延時
作者: 000999    時間: 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);
                    }
             }
     }
         
}   

作者: 我會想你的    時間: 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 定時 改改就是你的了
作者: 000999    時間: 2021-7-14 19:14
我會想你的 發表于 2021-7-14 17:39
void Timer0Init(void)                //1000微秒@22.1184MHz
{
        AUXR |= 0x80;                //定時器時鐘1T模式

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

作者: xianfajushi    時間: 2021-7-14 22:16
看程序前面按鍵代碼還好,后面是自學的還是什么人教的按鍵代碼




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