请帮忙看一下这个程序问题出在那里?

2019-03-24 09:50发布

本帖最后由 inazuma 于 2015-8-26 17:48 编辑
  1. #include <msp430x14x.h>

  2. #define wei_h P5OUT |= BIT5

  3. #define wei_l P5OUT&= ~BIT5

  4. #define duan_l P6OUT&= ~BIT6

  5. #define duan_h P6OUT |= BIT6

  6. #define keyin (P1IN & 0x0f)

  7. typedef unsigned char uchar;
  8. uchar duan[6]={0x3f,0x06,0x5b,0x4f,0x66,0x00};
  9. uchar wei [9]={0x00,0xfe,0xfd,0xfb,0xf7,
  10.                0xef,0xdf,0xbf,0x7f};
  11. void delay(void);
  12. void shumaguan(void);
  13. void main(void)
  14. {
  15.   WDTCTL = WDTPW + WDTHOLD;
  16.   uchar temp,k,x=0,a=5,b=5,c=5,d=5,e=5,f=5,g=5,h=5;
  17.   P6DIR |= BIT2;
  18.   P6OUT |= BIT2;
  19.   P1DIR = 0;
  20.   P1OUT = 0;
  21.   P4DIR = 0xff;
  22.   P4OUT = 0xff;
  23.   P5DIR = 0xff;
  24.   P6DIR = 0xff;
  25.   while (1)
  26.   {
  27.   loop:if (keyin !=0x0f)
  28.     {
  29.       delay();
  30.       if (keyin !=0x0f)
  31.      {
  32.        temp=keyin;
  33.        while (keyin !=0x0f);
  34.        switch (temp)
  35.         {
  36.           case 0x0e: k = 1;  break;
  37.           case 0x0d: k = 2;  break;      
  38.           case 0x0b: k = 3;  break;
  39.           case 0x07: k = 4;  break;
  40.           default:   k = 0;  break;         
  41.         }
  42.         x++;
  43.         if (x>8)x=1;
  44.         switch (x)
  45.           {
  46.             case 1:a=k;break;
  47.             case 2:b=k;break;
  48.             case 3:c=k;break;
  49.             case 4:d=k;break;  
  50.             case 5:e=k;break;
  51.             case 6:f=k;break;      
  52.             case 7:g=k;break;
  53.             case 8:h=k;break;
  54.             default:break;
  55.           }
  56.         while (1)
  57.         {
  58.           shumaguan();
  59.           P4OUT=duan[a];
  60.           duan_h;
  61.           duan_l;
  62.           P4OUT=wei[1];
  63.           wei_h;
  64.           wei_l;
  65.           P4OUT=duan[b];
  66.           duan_h;
  67.           duan_l;
  68.           P4OUT=wei[2];
  69.           wei_h;
  70.           wei_l;
  71.           P4OUT=duan[c];
  72.           duan_h;
  73.           duan_l;
  74.           P4OUT=wei[3];
  75.           wei_h;
  76.           wei_l;
  77.           P4OUT=duan[d];
  78.           duan_h;
  79.           duan_l;
  80.           P4OUT=wei[4];
  81.           wei_h;
  82.           wei_l;
  83.           P4OUT=duan[e];
  84.           duan_h;
  85.           duan_l;
  86.           P4OUT=wei[5];
  87.           wei_h;
  88.           wei_l;
  89.           P4OUT=duan[f];
  90.           duan_h;
  91.           duan_l;
  92.           P4OUT=wei[6];
  93.           wei_h;
  94.           wei_l;
  95.           P4OUT=duan[g];
  96.           duan_h;
  97.           duan_l;
  98.           P4OUT=wei[7];
  99.           wei_h;
  100.           wei_l;
  101.           P4OUT=duan[h];
  102.           duan_h;
  103.           duan_l;
  104.           P4OUT=wei[8];
  105.           wei_h;
  106.           wei_l;
  107.           if(keyin !=0x0f)  
  108.           {   
  109.               goto loop;
  110.            }
  111.         }
  112.       }
  113.     }
  114.   }
  115. }
  116. void delay(void)
  117.     {
  118.   unsigned int x;
  119.    for(x = 12000;x > 0;x--);
  120.     }
  121. void shumaguan(void)
  122. {
  123. unsigned int w;
  124. for(w=3000;w>0;w--);
  125. }
复制代码
最近买了一个学习板,想做一个按键控制数码管显示的功能,但是不知道哪里有错一直显示不正常。希望给位能帮帮我谢谢!
功能如下:
1:4个按键按下后能分别显示1~4的数字在数码管上。
2:数码管由两个4位八段数码管组成,并使用两个74HC573控制。
360反馈意见截图16511003101110138.png

3:当第一次按下任意一个按键时,数码管第一位点亮相应的数字,
4:当第二次按下任意一个按键时,数码管第二位点亮相应的数字,同时第一位不变,····
5:当第九次按下任意一个按键时,数码管第一位点亮相应的数字,其他位不变。



但是显示有问题
1:第一次按下按键1时
数码管第一位和第八位同时点亮
2:第二次按下按键2时
数码管第3位显示2,第二位显示的是1和2的合体。

IMG_20150826_150117.jpg

IMG_20150826_150130.jpg
IMG_20150826_150140.jpg
IMG_20150826_150146.jpg
希望各位能指正一下程序的错误出在哪里谢谢!!




此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
qiushenghua
1楼-- · 2019-03-25 14:45
 精彩回答 2  元偷偷看……
眼大5子
2楼-- · 2019-03-25 14:52
每次一轮显示完记得把a b c d e f g h清掉,即恢复到你的初始值。你是从汇编转到C的吧,C里面最好不要用goto语句,容易出错。
qiushenghua
3楼-- · 2019-03-25 17:36
第三个要吐槽的内容是程序的可读性太差,这是近期见到第二个用多个while(1)语句的网友了。

goto语句明明可以用break语句代替的,非得用强行跳转,这样程序结构会显得混乱,别人看不懂程序会在哪循环,很少人会跟着你的程序去跳转的。

第二个就是变量名称不明确,我到现在没看明白里面的x是用来干嘛的,程序也几乎看不下去,是通过现象来分析故障原因的。

第三个,程序几乎没有注释,加上变量、函数命名混乱,几乎是连蒙带猜才搞明白程序的大概运行流程。想细查都没查,实在查不下去了。
inazuma
4楼-- · 2019-03-25 20:16
 精彩回答 2  元偷偷看……
inazuma
5楼-- · 2019-03-25 20:22
眼大5子 发表于 2015-8-26 22:39
每次一轮显示完记得把a b c d e f g h清掉,即恢复到你的初始值。你是从汇编转到C的吧,C里面最好不要用got ...

谢谢!
其实最近才开始学C语言,汇编重来没学过。

一周热门 更多>

相关问题

    相关文章