打印

求高手帮忙看个msp430f149驱动数码管的程序

[复制链接]
990|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dzddzsc|  楼主 | 2014-8-28 21:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人是430初学者,下了个小程序,打算实现每按一次4x4键盘,数码管移动显示一位,就和我们用的普通计算器那样,可是调了很久也没有实现这个功能,现在贴上来。求大神指点。需要说明的是p1.0-p1.3是列1.4-1.7是行
/****************************
程序本来要实现数码管和计算器一样
每按一个键数字向左移动一位显示
可是调了很久都没有实现,同样的程序
在按照51单片机的规则写在51的开发板上可以实现
可是在430上没有成功,求指点
****************************/
#include  <msp430x14x.h>/*头文件*/
typedef unsigned char uchar;
#define wei_h P5OUT |= BIT5  /*定义P5输出为00100000,打开位锁存器*/
#define wei_l P5OUT &=~BIT5  /*定义P5输出为00000000,关闭位锁存器*/
#define duan_h P6OUT |=BIT6  /*定义P6输出为01000000,打开段锁存器*/
#define duan_l P6OUT &=~BIT6 /*定义P6输出为00000000,关闭段锁存器*/
#define dataport P4OUT       /*宏定义P4输出,用dataport代替P4OUT*/
uchar duanma[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71};
uchar weima[] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar tempdata[8];
void delay(unsigned int t);
void display(unsigned int firstbit, unsigned int Num);   /*函数声明*/
uchar key_port(void);
/***************************************
               主函数
***************************************/
void main( void )
{
  WDTCTL = WDTPW + WDTHOLD;   /*关闭看门狗*/
  uchar i, j, num;
  uchar temp[8];
  /*************************************
           设置I/O口状态
  *************************************/
  P4DIR = 0xff;
  P4OUT = 0x00;
  P5DIR = 0xff;
  P6DIR = 0xff;
  P6OUT = 0xff; //防止蜂鸣器响
  display(0,8);
  while(1)
  {
    num = key_port();
    if (num != 0x00)
    {
      if (i<8)
      {
        temp[i] = duanma[num];
        for (j=0; j<=i; j++)
        {
          tempdata[7-i+j] = temp[j];
        }
      }
        i++;
        if (i == 9) // 为了清屏
        {
          i = 0;
          for(j=0; j<8; j++)
          {
            tempdata[j] = 0;
          }
        }
    }
  }
}
void delay(unsigned int t)
{
  while(t--);
}
/*******************************************************
显示函数,用于动态扫描数码管
输入参数 FirstBit 表示需要显示的第一位,如输入0表示从
第一个显示。Num表示需要显示的位数,如需要显示99两位数值
则该值输入2
********************************************************/
void display(unsigned int firstbit, unsigned int Num)
{
   static unsigned char i=0;
    duan_h;
    dataport = 0;
    duan_l;
    wei_h;
    dataport = weima[i + firstbit];
    wei_l;
    duan_h ;
    dataport = tempdata[i];
    duan_l;
    i++;
    if (i==Num)
      i = 0;
}
uchar key_scanf(void)
{
  uchar key_in_1, key_in_2;
  P1DIR = 0xff; //P1方向设置为输出
  P1OUT = 0xf0; //P1输出为11110000
  P1DIR = 0x0f; //P1.0-P1.3设置为输出,P1.4-P1.7设置为输入
  key_in_1 = P1IN&0xf0; //读取当前P1上的状态
  if (key_in_1 != 0xf0) //判断是否有键被按下
  {
    delay(10); //延时一段时间确认有键被按下
    if (key_in_1 != 0xf0) //再次确认是否有键被按下
    {
      key_in_1 = P1IN&0xf0;
      P1DIR = 0xff; //P1方向设置为输出
      P1OUT = 0x0f; //P1输出为00001111
      P1DIR = 0xf0; //P1.0-P1.3设置为输入,P1.4-P1.7设置为输出
      key_in_2 = P1IN&0x0f; //读取当前P1上的状态
    }
    return (key_in_1 + key_in_2); //key_in_1和key_in_2的值组合形成键码
  }
  else
    return (0x00);
}
/********************************
      按键值处理程序
********************************/
uchar key_port(void)
{
  switch(key_scanf()) //按键值判断处理,并将处理值返回
  {
  case 0xee: return 0;
  break;
  case 0xed: return 1;
  break;
  case 0xeb: return 2;
  break;
  case 0xe7: return 3;
  break;
  case 0xde: return 4;
  break;
  case 0xdd: return 5;
  break;
  case 0xdb: return 6;
  break;
  case 0xd7: return 7;
  break;
  case 0xbe: return 8;
  break;
  case 0xbd: return 9;
  break;
  case 0xbb: return 10;
  break;
  case 0xb7: return 11;
  break;
  case 0x7e: return 12;
  break;
  case 0x7d: return 13;
  break;
  case 0x7b: return 14;
  break;
  case 0x77: return 15;
  break;
  default : return 0x00;
  break;
  }
}

相关帖子

沙发
youluo235| | 2014-8-29 09:51 | 只看该作者
看运行问题出在那里。再对照程序修改。也可参考别人的

使用特权

评论回复
板凳
dirtwillfly| | 2014-8-29 14:45 | 只看该作者
数码管程序一般都是分段码和位码,没有分行和列的

使用特权

评论回复
地板
dzddzsc|  楼主 | 2014-8-29 16:47 | 只看该作者
dirtwillfly 发表于 2014-8-29 14:45
数码管程序一般都是分段码和位码,没有分行和列的

我说的是4x4键盘大哥

使用特权

评论回复
5
dirtwillfly| | 2014-8-29 17:23 | 只看该作者
dzddzsc 发表于 2014-8-29 16:47
我说的是4x4键盘大哥

汗啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝