MSP430F149流水灯闪烁以及数码管的显示

今天下午写了一个流水灯闪烁的实验,总的来说,不难,因为这块板子集合的电路图没有上一块那么复杂,所以总的来说,还是比较顺手,开始的时候,出现流水灯没有流转的现象,原来是没有加入延时函数,后来经过调整,结果很快就出来了

电路示意图:

 

示例代码:

#include<msp430x14x.h>

#define CPU_F               ((double)8000000) 
#define delay_us(x)        __delay_cycles((long)(CPU_F*(double)x/1000000.0)) 
#define delay_ms(x)        __delay_cycles((long)(CPU_F*(double)x/1000.0)) 
unsigned char table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  unsigned char i=0;
  
  P2SEL = 0x0;//设置P2普通的I/O
  P2DIR = 0xff;//设置普通的输出
 
  
  while(1)
  {
      P2OUT = table1[i];
      delay_ms(50);
      i++;
      if(i == 8)
          i=0;
  }

  
}

 

实验板点亮数码管

实验板的电路图

 

示例代码:

#include<msp430x14x.h>

#define dula_l P6OUT &=~BIT6
#define dula_h P6OUT |=BIT6
#define wela_l P5OUT &=~BIT5
#define wela_h P5OUT |=BIT5


#define CPU_F               ((double)8000000) 
#define delay_us(x)        __delay_cycles((long)(CPU_F*(double)x/1000000.0)) 
#define delay_ms(x)        __delay_cycles((long)(CPU_F*(double)x/1000.0)) 

unsigned char scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                              0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//记录显示位数的全局变量

void  main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  
  P6SEL = 0x0;//设置P6,P5,P4为普通的I/O
  P5SEL = 0x0;
  P4SEL = 0x0;
  
  P6DIR |=BIT6;//选择P6.6,P5.5为输出
  P5DIR |=BIT5;
  P4DIR = 0xff;
  
  wela_h;//拉高位选
  P4OUT = 0xff;
  wela_l;
  
  P4OUT = 0x0;//消影
  dula_h;
  P4OUT = scandata[4];//选择段选
  delay_ms(10);//延时
  dula_l;
  
  while(1);


}


虽然程序按照51的方式写出来了,但是问题出现了,把该程序下载到板子上,结果发现不是第一个数码管亮,改变段选,结果数码管又亮了,这是led灯后三位也亮了,不知道怎么回事,这个程序还有待完善~~

 

版权所有,转载请注明链接地址:http://www.cnblogs.com/fengdashen/p/3403954.html

 

以下是msp430f149按键时能在数码管显示相应数字的代码: ```c #include <msp430.h> #define KEY BIT3 #define D1 BIT0 #define D2 BIT1 #define D3 BIT2 #define D4 BIT3 #define SEG_A BIT4 #define SEG_B BIT5 #define SEG_C BIT6 #define SEG_D BIT7 void delay(unsigned int t) { unsigned int i; for (i = 0; i < t; i++); } void display(unsigned char num) { unsigned char seg_code[] = { 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x67, // 9 }; P2OUT = 0x00; // 关闭所有数码管 P1OUT = (num / 1000) << 4; // 数码管1显示千位 P2OUT = seg_code[num / 1000]; // 数码管1显示千位对应的段码 delay(1000); P1OUT = (num % 1000 / 100) << 4; // 数码管2显示百位 P2OUT = seg_code[num % 1000 / 100]; // 数码管2显示百位对应的段码 delay(1000); P1OUT = (num % 100 / 10) << 4; // 数码管3显示十位 P2OUT = seg_code[num % 100 / 10]; // 数码管3显示十位对应的段码 delay(1000); P1OUT = (num % 10) << 4; // 数码管4显示个位 P2OUT = seg_code[num % 10]; // 数码管4显示个位对应的段码 delay(1000); } void main(void) { WDTCTL = WDTPW + WDTHOLD; // 停用看门狗定时器 P1DIR |= (D1 | D2 | D3 | D4); // 设置数码管的控制引脚为输出 P1OUT &= ~(D1 | D2 | D3 | D4); // 初始数码管显示 P2DIR |= (SEG_A | SEG_B | SEG_C | SEG_D); // 设置数码管的段选引脚为输出 P2OUT &= ~(SEG_A | SEG_B | SEG_C | SEG_D); // 初始数码管显示 P1DIR &= ~KEY; // 设置KEY为输入 P1REN |= KEY; // 使能KEY的上拉电阻 P1OUT |= KEY; // 设置KEY上拉 while (1) { if ((P1IN & KEY) == 0) // 判断KEY是否按下 { display(1234); // 按下KEY时在数码管显示1234 } else { P1OUT &= ~(D1 | D2 | D3 | D4); // 数码管显示 } } } ``` 代码说明: 1. 定义了按键所在的引脚为 `KEY`,数码管的控制引脚为 `D1`、`D2`、`D3`、`D4`,数码管的段选引脚为 `SEG_A`、`SEG_B`、`SEG_C`、`SEG_D`。 2. 定义了 `delay` 函数用于延时一段时间。 3. 定义了 `display` 函数用于在数码管显示数字。该函数接受一个 `unsigned char` 类型的参数 `num`,表示要在数码管显示的数字。 4. 在 `main` 函数中,先停用看门狗定时器。 5. 设置数码管的控制引脚和段选引脚为输出,初始状态数码管显示。 6. 设置 `KEY` 为输入,使能上拉电阻,初始状态为高电平。 7. 进入死循环,判断 `KEY` 是否按下,如果按下则在数码管显示1234,否则数码管显示。 8. 循环结束。 注意事项: 1. 代码中使用了 P1.3 引脚作为按键,如果实际硬件电路不同,需要修改代码中的引脚定义。 2. 代码中使用了 P1.0、P1.1、P1.2、P1.3 引脚作为数码管控制引脚,如果实际硬件电路不同,需要修改代码中的引脚定义。 3. 代码中使用了 P2.4、P2.5、P2.6、P2.7 引脚作为数码管段选引脚,如果实际硬件电路不同,需要修改代码中的引脚定义。 4. 代码中使用了 GPIO 模块的输入输出控制寄存器(P1DIR、P1OUT、P1IN、P1REN、P2DIR、P2OUT),需要先了解相关知识后再使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值