3495|11

8

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请帮忙看一下这个程序问题出在那里? [复制链接]

本帖最后由 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控制。


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



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






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




最新回复

第三个要吐槽的内容是程序的可读性太差,这是近期见到第二个用多个while(1)语句的网友了。 goto语句明明可以用break语句代替的,非得用强行跳转,这样程序结构会显得混乱,别人看不懂程序会在哪循环,很少人会跟着你的程序去跳转的。 第二个就是变量名称不明确,我到现在没看明白里面的x是用来干嘛的,程序也几乎看不下去,是通过现象来分析故障原因的。 第三个,程序几乎没有注释,加上变量、函数命名混乱,几乎是连蒙带猜才搞明白程序的大概运行流程。想细查都没查,实在查不下去了。  详情 回复 发表于 2015-8-26 22:46
 
点赞 关注

回复
举报

6066

帖子

92

TA的资源

裸片初长成(初级)

沙发
 
图片需要从本地上传。

点评

可以重新帮楼主编译一下吗?论坛有个插入代码功能  详情 回复 发表于 2015-8-26 16:36
 
 

回复

1632

帖子

4

TA的资源

纯净的硅(高级)

板凳
 
maylove 发表于 2015-8-26 16:10
图片需要从本地上传。

可以重新帮楼主编译一下吗?论坛有个插入代码功能
 
个人签名科技改变生活
 
 

回复

6066

帖子

92

TA的资源

裸片初长成(初级)

4
 
楼主,编辑宽右边有个添加代码文字处,这样更方便大家看你的代码。


 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

5
 
maylove 发表于 2015-8-26 16:44
楼主,编辑宽右边有个添加代码文字处,这样更方便大家看你的代码。

已经把代码重新发了,之前没用过这个功能,现在看起来应该清爽一些了。
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

6
 
眼大5子 发表于 2015-8-26 16:36
可以重新帮楼主编译一下吗?论坛有个插入代码功能

现在吧程序代码重新擦入了,还有没有需要改的地方?
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

7
 
我先吐槽一下拼音,wei=位,duan=段,shumaguan=数码管

于是在看到keyin的时候,我一直在想“可以啥啊”(ke yi n)然后想到“可以嗯!”,但是这说不通啊



最后才发现,应该拼写成Key_In 才是最合适的,按键输入
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

8
 
明显消隐没做好,所以每个字符除了自己显示,还显示到左边一个位上去了,在左边一个位上造成叠加图案。

在移动位之前,需要先将图案全部消去,也就是显示duan[5]的数据,不然你段码保持高电平,将位码的低电平移动到下一位,再改段码,那么在移动位码完成,但修改段码尚未完成这期间,你觉得数码管上会显示什么东西?

想想就明白了,这个时候上一位的内容会叠加到下一位上来,虽然你修改的及时,但是延时足够短的话,这个叠加还是很明显的。
 
 
 

回复

1632

帖子

4

TA的资源

纯净的硅(高级)

9
 
每次一轮显示完记得把a b c d e f g h清掉,即恢复到你的初始值。你是从汇编转到C的吧,C里面最好不要用goto语句,容易出错。
 
个人签名科技改变生活
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

10
 
第三个要吐槽的内容是程序的可读性太差,这是近期见到第二个用多个while(1)语句的网友了。

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

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

第三个,程序几乎没有注释,加上变量、函数命名混乱,几乎是连蒙带猜才搞明白程序的大概运行流程。想细查都没查,实在查不下去了。
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

11
 
qiushenghua 发表于 2015-8-26 22:46
第三个要吐槽的内容是程序的可读性太差,这是近期见到第二个用多个while(1)语句的网友了。

goto语句明明 ...

非常感谢!
最近才开始学单片机和编程,所以各种地方都有不足,我会根据你的意见去修改的。
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

12
 
眼大5子 发表于 2015-8-26 22:39
每次一轮显示完记得把a b c d e f g h清掉,即恢复到你的初始值。你是从汇编转到C的吧,C里面最好不要用got ...

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

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表