找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4538|回复: 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 单片机教程网

快速回复 返回顶部 返回列表