普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 4361|回复: 1

倒计时放按键里头

[复制链接]

2

主题

6

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2020-4-10 17:49:51 | 显示全部楼层 |阅读模式
6金钱
#include<reg51.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
  
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;//88点阵的口
static u16 i;
u8 lalal[80]={0x00,0x00,0xFE,0x92,0x92,0xF2,0x00,0x00,         
              0x00,0x00,0xFE,0x92,0x92,0xFE,0x00,0x00,        
              0x00,0x00,0x80,0x80,0x80,0xFF,0x00,0x00,         
              0x00,0x00,0xFE,0x12,0x12,0x1E,0x00,0x00,         
              0x00,0x00,0xF2,0x92,0x92,0x9E,0x00,0x00,        
              0x00,0x00,0xF0,0x10,0x10,0xFF,0x00,0x00,         
              0x00,0x00,0x92,0x92,0x92,0xFE,0x00,0x00,         
              0x00,0x00,0x9E,0x92,0x92,0xF2,0x00,0x00,         
              0x00,0x00,0x81,0xFF,0xFF,0x81,0x00,0x00,         
              0x00,0x7E,0x81,0x81,0x81,0x81,0x7E,0x00};//这些是八x八点阵的数码0到9
u8 lalae[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
void delay(u16 i)//延时函数
{
  while(i--);
}
void time()//中断加定时器
{
  TMOD|=0x01;
  TH0=0xD8;
  TL0=0xF0;;
  ET0=1;
  EA=1;
  TR0=1;
}
void hcsend(u8 dat)//段选
{
  u8 a;
  SRCLK=0;
  RCLK=0;
  for(a=0;a<8;a++)
  {
   SER=dat>>7;
   dat<<=1;
   SRCLK=1;
   _nop_();
   _nop_();
   SRCLK=0;
  }
  RCLK=1;
  _nop_();
  _nop_();
  RCLK=0;
}
void put(u16 g)//显示一个画面 比如0啊9啊
{     
     P0=0x7f;
   for(i=0;i<8;i++)
   {
    P0=lalae[i];
    hcsend(lalal[i+8*g]);
    delay(70);
    hcsend(0x00);
   }
}
void main()//主函数
{
   time();
  while(1);
}
void time0()interrupt 1
{
  static u16 a;
  static u16 b;
  TH0=0xD8;
  TL0=0xF0;
  b++;
  if(b==1000)//累积达到100就是1秒
  {
   b=0;
  switch(a)
  {
  case 0 : put(a);break;//9
  case 1 : put(a);break;//8
  case 2 : put(a);break;//7
  case 3 : put(a);break;
  case 4 : put(a);break;
  case 5 : put(a);break;
  case 6 : put(a);break;
  case 7 : put(a);break;
  case 8 : put(a);break;
  case 9 : put(a);break;//0
  default : break;
}a++;
}
  }
上面那个倒计时是可以运行的,放硬件里也没啥问题
但是我放矩阵按键里头就是不行,求大佬赐教
#include "reg51.h"   
typedef unsigned int u16;   
typedef unsigned char u8;
#define GPIO_KEY P1
u8 KeyValue;
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
u8 lalae[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
u8 Lie[64]={0x00,0x00,0x60,0x90,0x48,0x48,0x90,0x60,
              0x00,0x60,0x90,0x48,0x48,0x90,0x60,0x00,
              0x00,0x60,0x90,0x48,0x48,0x90,0x60,0x00,
              0x90,0x48,0x48,0x90,0x60,0x00,0x00,0x60,
              0x48,0x48,0x90,0x60,0x00,0x00,0x60,0x90,
              0x48,0x90,0x60,0x00,0x00,0x60,0x90,0x48,
              0x90,0x60,0x00,0x00,0x60,0x90,0x48,0x48,
              0x60,0x00,0x00,0x60,0x90,0x48,0x48,0x90};
u16 i,a,b;
u8 lalal[80]={0x00,0x00,0xFE,0x92,0x92,0xF2,0x00,0x00,         
              0x00,0x00,0xFE,0x92,0x92,0xFE,0x00,0x00,        
              0x00,0x00,0x80,0x80,0x80,0xFF,0x00,0x00,         
              0x00,0x00,0xFE,0x12,0x12,0x1E,0x00,0x00,         
              0x00,0x00,0xF2,0x92,0x92,0x9E,0x00,0x00,        
              0x00,0x00,0xF0,0x10,0x10,0xFF,0x00,0x00,         
              0x00,0x00,0x92,0x92,0x92,0xFE,0x00,0x00,         
              0x00,0x00,0x9E,0x92,0x92,0xF2,0x00,0x00,         
              0x00,0x00,0x81,0xFF,0xFF,0x81,0x00,0x00,         
              0x00,0x7E,0x81,0x81,0x81,0x81,0x7E,0x00};
void delay(u16 i)
{
while(i--);
}
void KeyDown(void)
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{
  delay(1000);
  if(GPIO_KEY!=0x0f)
  {
  
   GPIO_KEY=0X0F;
   switch(GPIO_KEY)
   {
    case(0X07): KeyValue=0;break;
    case(0X0b): KeyValue=1;break;
    case(0X0d):              KeyValue=2;break;
    case(0X0e): KeyValue=3;break;
   }
   
   GPIO_KEY=0XF0;
   switch(GPIO_KEY)
   {
    case(0X70): KeyValue=KeyValue;break;
    case(0Xb0): KeyValue=KeyValue+4;break;
    case(0Xd0):             KeyValue=KeyValue+8;break;
    case(0Xe0): KeyValue=KeyValue+12;break;
   }
   
  }
}
while((a<50)&&(GPIO_KEY!=0xf0))
{
  delay(100);
  a++;
}
}
void hcsend(u8 dat)
{
  u8 a;
  SRCLK=0;
  RCLK=0;
  for(a=0;a<8;a++)
  {
   SER=dat>>7;
   dat<<=1;
   SRCLK=1;
   delay(3);
   SRCLK=0;
  }
  RCLK=1;
  delay(3);
  RCLK=0;
}

void  love()
{
  u8 i;                 
  while(1)
  {
       u8 b=56;
   for(a=0;a<56;a+=8)
   {
   for(i=0;i<8;i++)
   {
    P0=lalae[i];
    hcsend(Lie[i+a]);
    delay(1000);
    hcsend(0x00);
   }
  }
  }
}
void time()
{
  TMOD|=0x01;
  TH0=0xD8;
  TL0=0xF0;
  ET0=1;
  EA=1;
  TR0=1;
}
void put(u16 g)//放置画面,比如0啊9啊
{     
                                 P0=0x7f;
   for(i=0;i<8;i++)
   {
    P0=lalae[i];
    hcsend(lalal[i+8*g]);
    delay(70);
    hcsend(0x00);
   }
}
void three()//第3个按键
{
  while(1)
  {
   P0=0x7f;
   for(i=0;i<8;i++)
   {
    P0=lalae[i];
    hcsend(Lie[i]);
    delay(70);
    hcsend(0x00);
   }
  }
   
}
void main()
{
                                TMOD|=0x01;
                 TH0=0xD8;
  TL0=0xF0;
  ET0=1;
  EA=1;
while(1)
{
  KeyDown();//扫描按键返回第KeyValue个按键是按下了的     
   switch(KeyValue)
  {
   case 0:love();break;//第一个按键按下后
   case 1:TR0=1;break;//第二个按键
   case 2:three();break;
   default:break;
  }
}  
}
void time0()interrupt 1
{
  static u16 b;
  TH0=0xD8;
  TL0=0xF0;
  b++;
  if(b==100)
  {
   b=0;
  switch(a)
  {
  case 0 : put(a);break;//9
  case 1 : put(a);break;//8
  case 2 : put(a);break;//7
  case 3 : put(a);break;
  case 4 : put(a);break;
  case 5 : put(a);break;
  case 6 : put(a);break;
  case 7 : put(a);break;
  case 8 : put(a);break;
  case 9 : put(a);break;//0
  default : break;
}a++;
}
  }

我知道答案 本帖寻求最佳答案回答被采纳后将获得系统奖励10 金钱 , 目前已有1人回答

回复

使用道具 举报

0

主题

49

帖子

242

积分

中级会员

Rank: 3Rank: 3

积分
242
发表于 2020-5-23 15:33:01 | 显示全部楼层
在楼主原来的程序基础上改了一下:/*按键选择8x8led显示
  按键:0-love();
              1-:;
                                2-three();
*/
#include "reg51.h"   
typedef unsigned int u16;   
typedef unsigned char u8;
#define GPIO_KEY P1
u8 KeyValue;
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
code u8 lalae[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
code u8 Lie[64]={ 0x00,0x00,0x60,0x90,0x48,0x48,0x90,0x60,
                                                                        0x00,0x60,0x90,0x48,0x48,0x90,0x60,0x00,
                                                                        0x00,0x60,0x90,0x48,0x48,0x90,0x60,0x00,
                                                                        0x90,0x48,0x48,0x90,0x60,0x00,0x00,0x60,
                                                                        0x48,0x48,0x90,0x60,0x00,0x00,0x60,0x90,
                                                                        0x48,0x90,0x60,0x00,0x00,0x60,0x90,0x48,
                                                                        0x90,0x60,0x00,0x00,0x60,0x90,0x48,0x48,
                                                                        0x60,0x00,0x00,0x60,0x90,0x48,0x48,0x90};

code u8 lalal[80]={ 0x00,0x00,0xFE,0x92,0x92,0xF2,0x00,0x00,         
                                                                                0x00,0x00,0xFE,0x92,0x92,0xFE,0x00,0x00,        
                                                                                0x00,0x00,0x80,0x80,0x80,0xFF,0x00,0x00,         
                                                                                0x00,0x00,0xFE,0x12,0x12,0x1E,0x00,0x00,         
                                                                                0x00,0x00,0xF2,0x92,0x92,0x9E,0x00,0x00,        
                                                                                0x00,0x00,0xF0,0x10,0x10,0xFF,0x00,0x00,         
                                                                                0x00,0x00,0x92,0x92,0x92,0xFE,0x00,0x00,         
                                                                                0x00,0x00,0x9E,0x92,0x92,0xF2,0x00,0x00,         
                                                                                0x00,0x00,0x81,0xFF,0xFF,0x81,0x00,0x00,         
                                                                                0x00,0x7E,0x81,0x81,0x81,0x81,0x7E,0x00};

        u16 i,a,b;                                               
void delay(u16 i)
{
while(i--);
}
void KeyDown(void)
{
        char a=0;
       
        //EA=0;
        GPIO_KEY=0x0f;
        if(GPIO_KEY!=0x0f)
        {
                 GPIO_KEY=0X0F;
                 switch(GPIO_KEY)
                 {
                        case(0X07): KeyValue=0;break;
                        case(0X0b): KeyValue=1;break;
                        case(0X0d): KeyValue=2;break;
                        case(0X0e): KeyValue=3;break;
                 }
                 
                 GPIO_KEY=0XF0;
                 switch(GPIO_KEY)
                 {
                        case(0X70): KeyValue=KeyValue;break;
                        case(0Xb0): KeyValue=KeyValue+4;break;
                        case(0Xd0): KeyValue=KeyValue+8;break;
                        case(0Xe0): KeyValue=KeyValue+12;break;
                 }
        }
        //EA=1;
}
void hcsend(u8 dat)
{
  u8 a;
  SRCLK=0;
  RCLK=0;
  for(a=0;a<8;a++)
  {
   SER=dat>>7;
   dat<<=1;
   SRCLK=1;
   delay(3);
   SRCLK=0;
  }
  RCLK=1;
  delay(3);
  RCLK=0;
}

void  love()
{
  u8 i;                 
  u8 b=56;
        for(a=0;a<56;a+=8)
        {
         for(i=0;i<8;i++)
         {
                P0=lalae;//位选
                hcsend(Lie[i+a]);//段码
                delay(1000);
         }
  }
}
/*void time()
{
  TMOD|=0x01;
  TH0=0xD8;
  TL0=0xF0;
  ET0=1;
  EA=1;
  TR0=1;
}*/

void three()//第3个按键
{
   for(i=0;i<8;i++)
   {
    P0=lalae;//位
    hcsend(Lie);//段
    delay(70);
   }
}

void UsartInit()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD|=0X20;                        //设置计数器工作方式2
        PCON=0X00;                        //波特率加倍0X00
        TH1=0XFd;                                //计数器初始值设置,注意波特率是4800的9600-0xfd@11.0592;
        TL1=0XFd;
        //ES=1;                                                //打开接收中断
        //EA=1;                                                //打开总中断
        TR1=1;                                        //打开计数器
}
void main()
{
  //time();
        UsartInit();  //        串口初始化
        while(1)
        {
                //u8 KeyValueold;
               
                KeyDown();//扫描按键返回第KeyValue个按键是按下了的
                /*if(KeyValue!=KeyValueold)
                {
      SBUF=KeyValue;while(!TI);TI=0;//串口发送
             KeyValueold=KeyValue;
                }*/       
          switch(KeyValue)
                {
                 case 0:love();break;//第一个按键按下后
                 case 1:TR0=1;break;//第二个按键
                 case 2:three();break;
                 default:break;
                }
  }  
}
/*void time0()interrupt 1
{
  static u16 b;
  TH0=0xD8;
  TL0=0xF0;
  b++;
}*/



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-20 13:14 , Processed in 0.088185 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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