找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1668|回复: 6
收起左侧

如何修改这个单片机程序,目的是按键切换,现在只有按键1能切换按键2没有反应

[复制链接]
ID:758120 发表于 2020-5-27 22:08 | 显示全部楼层 |阅读模式
10黑币
#include "reg51.h"

#define uchar unsigned char
#define uint  unsigned int

#define Lie   P1

sbit SHCP = P2^0;
sbit  DS  = P2^1;
sbit STCP = P2^2;
bit run=0;

uchar code led[ ] ={.....}
uchar code led2[ ] ={....}
uchar code led3[ ] ={....}//点阵码
void shift16bit(uchar dat1,uchar dat2)  
{
uchar i;
STCP=0;        
                 for(i=0;i<8;i++)
                  {
                           SHCP=0;
                           if(dat1  & 0x80) DS=1;
                           else DS=0;
                           dat1<<=1;
                           SHCP=1;
                  }
                  for(i=0;i<8;i++)
                  {
                           SHCP=0;
                           if(dat2 &0x80) DS=1;
                           else DS=0;
                           dat2<<=1;
                           SHCP=1;
                  }
                 STCP=1;
}

void delay(uint x)
{
uint i;
for(i=0;i<x;i++);
}

void Int0Init()
{
        //设置INT0
        IT0=1;//跳变沿出发方式(下降沿)
        EX0=1;//打开INT0的中断允许。        
        EA=1;//打开总中断        
}


void main()
{
        
    unsigned char i;
    unsigned char x=0;
    unsigned int n;

        run=0;
          Int0Init();  //        设置外部中断0
while(1)
{
     if(run==2)
         {
          uchar i,x=0;
uint n;

while(1)
{
        for(n=0;n<5;n++) //控制滚动速度
         for(i=0;i<16;i++)//控制字形代码共16列
          {
           Lie=i;
           shift16bit(led3[2*i+2*x+1],led3[2*i+2*x]);//取出每一列的数据
           delay(100);
          }
  x++;
         
if(x==96) x=0;
}//第三种输出
     }
         else if(run==1)
         {
         uchar i,x=0;
uint n;

while(1)
{
        for(n=0;n<5;n++) //控制滚动速度
         for(i=0;i<16;i++)//控制字形代码共16列
          {
           Lie=i;
           shift16bit(led2[2*i+2*x+1],led2[2*i+2*x]);//取出每一列的数据
           delay(100);
          }
  x++;
         
if(x==160) x=0;
}//第二种输出
     }         
     else
         {
          for(n=0;n<5;n++) //控制滚动速度
         for(i=0;i<16;i++)//控制字形代码共16列
          {
           Lie=i;
           shift16bit(led[2*i+2*x+1],led[2*i+2*x]);//取出每一列的数据
           delay(100);
          }
  x++;
          if(x==64)
          x=0;
         }
}
}
//外部中断0
void int0(void) interrupt 0
{
        run=1;
}



K)]XHY(@_%TP~90AU3}8.png
回复

使用道具 举报

ID:758120 发表于 2020-5-27 22:43 | 显示全部楼层
感觉是我中断出问题o(╥﹏╥)o有大佬帮忙改一下吗
回复

使用道具 举报

ID:267719 发表于 2020-5-28 08:32 | 显示全部楼层
外部中断1没开,中断函数也没。当然按键2没反应了。
回复

使用道具 举报

ID:758120 发表于 2020-5-28 09:54 | 显示全部楼层
carpcarey 发表于 2020-5-28 08:32
外部中断1没开,中断函数也没。当然按键2没反应了。

大佬能帮忙改一下吗,并不熟悉中断,我是拿一个中断往原来程序上改的o(╥﹏╥)o
回复

使用道具 举报

ID:744327 发表于 2020-5-28 10:20 | 显示全部楼层
main函数有问题,while(1)
{
     if(run==2)
         {
          uchar i,x=0;
uint n;
变量不能声明在if里面
回复

使用道具 举报

ID:758120 发表于 2020-5-28 10:49 | 显示全部楼层
已完成,感谢大佬相助!万分感谢
回复

使用道具 举报

ID:481073 发表于 2020-5-28 11:01 | 显示全部楼层
你确定你了解中断吗
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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