打印

关于430f5529的IO

[复制链接]
1449|37
手机看帖
扫描二维码
随时随地手机跟帖
沙发
IOUJANE|  楼主 | 2017-5-11 14:22 | 只看该作者
我在做一个程控放大器,使用单片机spi通信给dac7811发送一个数字量,现在可以发送一个固定的数字量,还需要按键步进增加或减少这个数字量从而改变增益

使用特权

评论回复
板凳
IOUJANE|  楼主 | 2017-5-11 14:24 | 只看该作者
使用的软件是ccs7.0,单片机是msp430f5529

使用特权

评论回复
地板
IOUJANE|  楼主 | 2017-5-11 15:37 | 只看该作者
#include <msp430.h>
#include <msp430f5529.h>
/*
* main.c
*/
#define uint unsigned int
int codeArray[]={0x199,0xCC,0x88,0x66,0x51,0x51,0x44,0x3A,0x33,0x2D,0x28};
int i=0;
void spiwrite(int data12,int cmd)
{
    int n,j;
    int jj=cmd;
    P3OUT |= 0x01; //SYNC高
    for( n=0;n<200;n++);
    P3OUT |= 0x02; //SCLK高
    P3OUT &= ~0x01; //SYNC低 片选使能
    for( n=0;n<200;n++);
    for(j=0;j<4;j++)
    {
        for(n=0;n<100;n++);
        P3OUT |= 0x02; //SCLK高
        for(n=0;n<100;n++);
        if((jj>>(3-j)) & 0x01)
            P3OUT |= 0x04;//数据高电平
        else
            P3OUT &=~0x04;//数据低电平
        for(n=0;n<100;n++);
        P3OUT &= ~0x02; //SCLK低
    }
    for(j=0;j<12;j++)
    {
        for(n=0;n<100;n++);
        P3OUT |= 0x02; //SCLK高
        for(n=0;n<100;n++);
        if((data12>>(11-j)) & 0x01)
            P3OUT |= 0x04;//数据高电平
        else
            P3OUT &=~0x04;//数据低电平
        for(n=0;n<100;n++);
        P3OUT &= ~0x02; //SCLK低
    }
    for(n=0;n<100;n++);
    P3OUT |= 0x02; //SCLK高
    for(n=0;n<100;n++);
    P3OUT |= 0x01; //SYNC高
    for(n=0;n<200;n++);
    }

    void delay(uint z)
    {
        uint x,y;
        for(x=z;x>0;x--)
            for(y=110;y>0;y--);
    }
    void main(void)

    {
    WDTCTL = WDTPW + WDTHOLD;
    P1DIR|=BIT0;   //设置p1.0为输出
    P1REN|=BIT1;
    P1OUT|=BIT1;


          P3OUT |= 0x07;//P3.0 - P3.2模拟SPI接口
          P3DIR |= 0x07;//P3.0->SYNC,P3.1->SCLK,P3.2->SDIN
          //int code=0x28;      //衰减20db,100倍0x28.
          //int code=0x800;
          int code=codeArray[i];
          int code1;
          spiwrite(code,1);
          while(1)
          {

              if(!(P1IN&0x02)){
                  delay(1);
                  if(!(P1IN&0x02)){
                      while(!(P1IN&0x02)){
                    P1OUT^=BIT0;
                   if(i<9)
                    i++;
                   code=codeArray[i];
                      }
                  }
              }
            code1 = code;
          spiwrite(code1,1);

         }

}



使用特权

评论回复
5
IOUJANE|  楼主 | 2017-5-11 16:30 | 只看该作者

触发按键p1.1,仅能改变一次数字量,各位大神能为我解答一下吗

使用特权

评论回复
6
dirtwillfly| | 2017-5-11 17:16 | 只看该作者
没看懂楼主有什么问题

使用特权

评论回复
7
dirtwillfly| | 2017-5-11 17:17 | 只看该作者
IOUJANE 发表于 2017-5-11 16:30
触发按键p1.1,仅能改变一次数字量,各位大神能为我解答一下吗

第二次按键,数字量不变了?

使用特权

评论回复
8
IOUJANE|  楼主 | 2017-5-11 17:42 | 只看该作者
dirtwillfly 发表于 2017-5-11 17:17
第二次按键,数字量不变了?

按一次按键后,直接跳到了数组第九个数

使用特权

评论回复
9
IOUJANE|  楼主 | 2017-5-11 17:52 | 只看该作者
dirtwillfly 发表于 2017-5-11 17:17
第二次按键,数字量不变了?

  if(!(P1IN&0x02)){
                  delay(1);
                  if(!(P1IN&0x02)){
                      while(!(P1IN&0x02)){
                    P1OUT^=BIT0;
                   if(i<9)
                    i++;
                   code=codeArray;
                      }

使用特权

评论回复
10
dirtwillfly| | 2017-5-11 19:47 | 只看该作者
IOUJANE 发表于 2017-5-11 17:42
按一次按键后,直接跳到了数组第九个数

哦,你的按键扫描频率太快了。按了一次被扫描无数次

使用特权

评论回复
11
火山LF| | 2017-5-12 08:20 | 只看该作者
按键记得都要滤波

使用特权

评论回复
12
IOUJANE|  楼主 | 2017-5-12 10:46 | 只看该作者
dirtwillfly 发表于 2017-5-11 19:47
哦,你的按键扫描频率太快了。按了一次被扫描无数次

怎么改呢,延时时间增加吗

使用特权

评论回复
13
IOUJANE|  楼主 | 2017-5-12 10:47 | 只看该作者
火山LF 发表于 2017-5-12 08:20
按键记得都要滤波

通过编程可以滤波吗?

使用特权

评论回复
14
dirtwillfly| | 2017-5-12 10:48 | 只看该作者
IOUJANE 发表于 2017-5-12 10:46
怎么改呢,延时时间增加吗

不只是简单的延时。还有按键识别逻辑也需要修改。

使用特权

评论回复
15
IOUJANE|  楼主 | 2017-5-12 10:50 | 只看该作者
dirtwillfly 发表于 2017-5-12 10:48
不只是简单的延时。还有按键识别逻辑也需要修改。

if(!(P1IN&0x02)){//判断P1.1是否按下
                  Delay10ms(1);//消除抖动
                  if(!(P1IN&0x02)){//再次检测按键是否按下
                      j=0;
                      while((j<50)&&!(P1IN&0x02))//检测按键是否松开
                      {
                          Delay10ms(1);
                          j++;
                         }
                         P1OUT^=BIT0;
                         if(i<9){
                         i++;
                         code=codeArray;
                        }
              }
能否帮忙改一下

使用特权

评论回复
16
dirtwillfly| | 2017-5-12 10:55 | 只看该作者
IOUJANE 发表于 2017-5-12 10:50
if(!(P1IN&0x02)){//判断P1.1是否按下
                  Delay10ms(1);//消除抖动
                  if ...

参考这个资料,自己改吧
https://wenku.baidu.com/view/71f6c75dbe23482fb4da4c30.html

使用特权

评论回复
17
yingjiashu| | 2017-5-12 11:53 | 只看该作者
我说一下吧:
1、楼主的问题描述不清楚,在论坛提出问题时一定要简洁,清楚,这样别人回答时会比较方便;
2、一般编程序发现问题时最好可以通过断点调试,一步一步查询变量执行情况;
3.如果楼主发现按键按下,而发送变量没有按照预期变化,则应该和按键检测程序有关;反之侧和你的SPI程序有关;
特别建议一下楼主,刚开始编程尽量自己排查一些简单的问题,这样对提高能力是有好处的。
谢谢!

使用特权

评论回复
18
shenmu2012| | 2017-5-12 21:19 | 只看该作者
这个是采用IO口的中断实现的

使用特权

评论回复
19
IOUJANE|  楼主 | 2017-5-13 12:36 | 只看该作者
shenmu2012 发表于 2017-5-12 21:19
这个是采用IO口的中断实现的

使用中断怎么实现按一次按键, i 的值加1而不是随便加,并且使用中断是否必须要进入低功耗模式,大神能写个程序看看吗

使用特权

评论回复
20
dirtwillfly| | 2017-5-16 22:17 | 只看该作者
IOUJANE 发表于 2017-5-13 12:36
使用中断怎么实现按一次按键, i 的值加1而不是随便加,并且使用中断是否必须要进入低功耗模式,大神能写 ...

按一次按键数值加一,主要是防抖。进不进低功耗,看你的功耗要求,这个和按键识别逻辑无关

使用特权

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

本版积分规则

1

主题

11

帖子

0

粉丝