打印

求助一个51的引脚定义改成msp430的引脚定义?

[复制链接]
2705|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小怪不大|  楼主 | 2016-6-26 20:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
dirtwillfly| | 2016-6-26 20:42 | 只看该作者
msp430的io操作和51差别比较大,不能直接赋值

使用特权

评论回复
板凳
小怪不大|  楼主 | 2016-6-26 21:03 | 只看该作者
我函数值这样定义的,但是会报错

333.png (14.32 KB )

函数

函数

444.png (14.16 KB )

报错

报错

使用特权

评论回复
地板
小怪不大|  楼主 | 2016-6-26 21:04 | 只看该作者
dirtwillfly 发表于 2016-6-26 20:42
msp430的io操作和51差别比较大,不能直接赋值

那怎么改?完全不懂啊

使用特权

评论回复
5
dirtwillfly| | 2016-6-26 21:32 | 只看该作者
小怪不大 发表于 2016-6-26 21:04
那怎么改?完全不懂啊

建议参考msp430的例程
#include <msp430.h>

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  P1DIR |= 0x01;                            // Set P1.0 to output direction

  while (1)                                 // Test P1.4
  {
    if ((0x10 & P1IN)) P1OUT |= 0x01;       // if P1.4 set, set P1.0
    else P1OUT &= ~0x01;                    // else reset
  }
}

使用特权

评论回复
6
dirtwillfly| | 2016-6-26 21:33 | 只看该作者
你用的具体什么型号?有些型号ti有提供库函数,也可以直接用库函数操作io

使用特权

评论回复
7
zyj9490| | 2016-6-26 21:45 | 只看该作者
430没有位指令,只能对寄成器读-改-写的方法,可以做修改寄成器位的宏。

使用特权

评论回复
8
小怪不大|  楼主 | 2016-6-26 22:02 | 只看该作者
dirtwillfly 发表于 2016-6-26 21:33
你用的具体什么型号?有些型号ti有提供库函数,也可以直接用库函数操作io

msp430G2553

使用特权

评论回复
9
51xlf| | 2016-6-26 22:56 | 只看该作者
引脚定义都不一样

使用特权

评论回复
10
51xlf| | 2016-6-26 23:02 | 只看该作者
你可以使用宏定义

使用特权

评论回复
11
pywmiss| | 2016-6-27 10:20 | 只看该作者
发一段例程你看看...IO脚定义都是这样玩的...

//***************************************************************************//
//                                                                           //
//                       引脚功能定义                                        //
//                                                                           //
//***************************************************************************//

#define LED_RED                BIT0  // P2.0 红灯亮起
#define BELL                   BIT0  // P6.0 蜂鸣器
#define RF_LPCTL               BIT3  // P2.3 射频卡休眠控制 ------RST   
#define RF_SS                  BIT5  // p2.5 射频卡从机选择(SS)---SDA
#define RF_SCLK                BIT4  // p2.4 射频卡数据时钟输出(SCLK)
#define RF_DATA_OUT            BIT2  // p2.2 射频卡数据输出(MOSI)
#define RF_DATA_IN             BIT1  // p2.1 射频模块输入(MISO)

//****************************************************************************
//                                                                           *
//                           操作宏定义                                      *
//                                                                           *
//****************************************************************************

//------------------------------- RC522操作宏 ------------------------------//
//#define    RF_POWER_ON             P8OUT &=~RF_PCTL                      // 射频模块上电
//#define    RF_POWER_OFF            P8OUT |= RF_PCTL                      // 射频模块下电

#define    RED_LED_ON              P2OUT &=~LED_RED                      // 红灯亮起
#define    RED_LED_OFF             P2OUT |= LED_RED                      // 红灯熄灭
#define    BELL_ON                 P6OUT &=~BELL                      // 绿灯亮起
#define    BELL_OFF                P6OUT |= BELL                      // 绿灯熄灭

使用特权

评论回复
评论
火山LF 2016-6-28 10:22 回复TA
赞 
评分
参与人数 1威望 +6 收起 理由
dirtwillfly + 6 很给力!
12
小怪不大|  楼主 | 2016-6-27 10:23 | 只看该作者
dirtwillfly 发表于 2016-6-26 21:32
建议参考msp430的例程
#include

我把其他的改了,第一个图中的方框里还是不会改。其中第一个方框里的意思是行选择,因为是1664的led点阵,因此原程序里的意思是第一行控制四个引脚,四个引脚的不同赋值决定选择哪一行,如图3.改这个我就不懂了。
第二个方框是595的数据口。图2中也有具体函数。图4是我找的程序,不知道能不能不用改直接用到我这里。
其实关键就是行选择的那个定义不会写了?

666.png (26.39 KB )

改后定义

改后定义

555.png (25.02 KB )

改后函数

改后函数

777.png (25.97 KB )

有关行选择的程序

有关行选择的程序

888.png (17.5 KB )

找的程序

找的程序

使用特权

评论回复
13
小怪不大|  楼主 | 2016-6-27 10:26 | 只看该作者
pywmiss 发表于 2016-6-27 10:20
发一段例程你看看...IO脚定义都是这样玩的...

//****************************************************** ...

谢谢!我现在最大的问题是行选择的那个程序不会改。具体介绍在楼下我刚才发的

使用特权

评论回复
14
pywmiss| | 2016-6-27 15:48 | 只看该作者
430没办法位操作...我当时学习的时候也很烦...
也没有办法了..像我上面发的..把每个IO口用宏定义好之后...一个个变了...
所以你不能再用原来程序那种方式了...要转变一下.
P1 口第5脚 设置为输出高电平:  P1DIR |=BIT5  P1OUT  |=BIT5
....最笨的办法就一个一个去转换...
如果你想用循环的也是可以的..按最后的那个程序的方式..循环,,,再里面调用定义好的就行了.

使用特权

评论回复
15
小怪不大|  楼主 | 2016-6-27 16:21 | 只看该作者
这是我的程序,今天改的没有错误了!但是运行以后不显示,做了一个测试灯,灯是亮的!不知道什么原因

led.zip

44.59 KB

程序

使用特权

评论回复
16
小怪不大|  楼主 | 2016-6-27 16:22 | 只看该作者
小怪不大 发表于 2016-6-27 16:21
这是我的程序,今天改的没有错误了!但是运行以后不显示,做了一个测试灯,灯是亮的!不知道什么原因
...

@pywmiss

使用特权

评论回复
17
小怪不大|  楼主 | 2016-6-27 16:25 | 只看该作者
小怪不大 发表于 2016-6-27 16:21
这是我的程序,今天改的没有错误了!但是运行以后不显示,做了一个测试灯,灯是亮的!不知道什么原因
...

@pywmiss 这是今天改的程序  但是led屏不显示

/*
* led.c
*
*  Created on: 2016-6-26
*      Author: zhang
*/
//#include "led.h"
#include "MSP430G2553.h"
#include "ZIMU.h"

#define _UP                1
#define _DOWN        2
#define _DisBuf 1
#define _EffectBuf 2



/***********需要根据实际情况调整****************/
#define LedNO 8//横向串联的LED数


/*******************MCU引脚与点阵屏引脚对应关系********************
*        LA=P1^0        LB=P1^1        LC=P1^2        LD=p1^3
*        EN=P1^4        R1=P1^5        LT=P1^6        SK=P1^7
*        使用时点阵屏和单片机必须共地
*******************************************************************/
//#define HSelect(x)        P1 &= 0XF0;P1 |= (x);
#define LA_1 P1OUT |=BIT4;
#define LA_0 P1OUT &=~BIT4;
#define LB_1 P1OUT |=BIT5;
#define LB_0 P1OUT &=~BIT5;
#define LC_1 P2OUT |=BIT0;
#define LC_0 P2OUT &=~BIT0;
#define LD_1 P2OUT |=BIT1;
#define LD_0 P2OUT &=~BIT1;

#define nEN_1 P2OUT |=BIT2;
#define nEN_0 P2OUT &=~BIT2;
#define RED_1 P2OUT |=BIT3;
#define RED_0 P2OUT &=~BIT3;
#define LT_1 P2OUT |=BIT4;
#define LT_0 P2OUT &=~BIT4;
#define SK_1 P2OUT |=BIT5;
#define SK_0 P2OUT &=~BIT5;


void LA_Init(void);//点阵屏(LedArray)引脚初始化
void LA_ByteOut(unsigned char Byte);//单个字节输出
void LA_Disp(void);//将显示缓冲区的内容送LED屏显示
void LA_ByteLoad(unsigned char LedCnt,unsigned char *p);//将一个8*16点阵(ASCII字符字模)导入显示缓冲区

void HSelect(unsigned char x);

void test2(void);//右流动显示“welcome”


unsigned char DisBuf[16][LedNO+4];//显示缓冲区

void HSelect(unsigned char x)
{
        switch(x)
        {
                case 0: LA_0;LB_0;LC_0;LD_0;break;
                case 1: LA_0;LB_0;LC_0;LD_1;break;
                case 2: LA_0;LB_0;LC_1;LD_0;break;
                case 3: LA_0;LB_0;LC_1;LD_1;break;
                case 4: LA_0;LB_1;LC_0;LD_0;break;
                case 5: LA_0;LB_1;LC_0;LD_1;break;
                case 6: LA_0;LB_1;LC_1;LD_0;break;
                case 7: LA_0;LB_1;LC_1;LD_1;break;
                case 8: LA_1;LB_0;LC_0;LD_0;break;
                case 9: LA_1;LB_0;LC_0;LD_1;break;
                case 10: LA_1;LB_0;LC_1;LD_0;break;
                case 11: LA_1;LB_0;LC_1;LD_1;break;
                case 12: LA_1;LB_1;LC_0;LD_0;break;
                case 13: LA_1;LB_1;LC_0;LD_1;break;
                case 14: LA_1;LB_1;LC_1;LD_0;break;
                case 15: LA_1;LB_1;LC_1;LD_1;break;
                default:break;

        }
}

void LA_Init(void)
{
/***********************************
*        将与LED相连的相关引脚配置成推挽输出
***********************************/
        HSelect(0);
        nEN_1;
        LT_1;
        SK_0;
}

void LA_ByteOut(unsigned char Byte)
{
        unsigned char cnt;
        Byte=~Byte;
        for(cnt=0;cnt<8;cnt++){
//                RED(Byte>>7);
                if(Byte&0x01)
                {
                        RED_1;
                }
                else
                {
                        RED_0;
                }
                SK_1;
                Byte<<=1;
                SK_0;
        }
}

void LA_Disp(void)
{
        unsigned char cnt1;
        unsigned long cnt2;
        unsigned long cnt;
        for(cnt1=0;cnt1<16;cnt1++)
        {
                for(cnt2=0;cnt2<LedNO;cnt2++)
                        LA_ByteOut(DisBuf[cnt1][cnt2+2]);
//延时。串联的LED板越多的时候,这个时间应当越小,否则会有闪烁现象
                for(cnt=20;cnt!=0;cnt--);
                nEN_1;
                LT_1;
                LT_0;
                HSelect(cnt1);
                nEN_0;
        }
        for(cnt=80;cnt!=0;cnt--);
        nEN_1;
}

/*******************************************************
*        功能:将一个8*16点阵(ASCII字符字模)导入显示缓冲区
*        参数:WhichBuf指定目标缓冲区,_DisBuf表示显示缓冲区,
*                LedCnt缓冲区横坐标
*                 p指向待插入的内容
*******************************************************/
void LA_ByteLoad(unsigned char LedCnt,unsigned char *p)
{
        unsigned char cnt;
        for(cnt=0;cnt<16;cnt++)
                DisBuf[cnt][LedCnt] = *(p++);

}


void test2(void)//右流动显示“welcome”
{
        unsigned char cnt;
        LA_ByteLoad(9,ZiMu2[7]);//空格
        LA_ByteLoad(8,ZiMu2[0]);//w
        LA_ByteLoad(7,ZiMu2[1]);//e
        LA_ByteLoad(6,ZiMu2[2]);//l
        LA_ByteLoad(5,ZiMu2[3]);//c
        LA_ByteLoad(4,ZiMu2[4]);//o
        LA_ByteLoad(3,ZiMu2[5]);//m
        LA_ByteLoad(2,ZiMu2[6]);//e

        for(cnt=150;cnt!=0;cnt--)//停留一段时间
                LA_Disp();
}


#include <MSP430G2553.h>
#include "led.h"
/*
* main.c
*/
int main(void) {
    WDTCTL = WDTPW | WDTHOLD;        // Stop watchdog timer
        LA_Init();

        P1DIR |=BIT0;
        while(1)
        {
                test2();

                P1OUT |=BIT0;
        }

}



使用特权

评论回复
18
youtome| | 2016-6-27 22:18 | 只看该作者
引脚直接赋值吗

使用特权

评论回复
19
youtome| | 2016-6-27 22:26 | 只看该作者
可以使用#define

使用特权

评论回复
20
pywmiss| | 2016-6-28 09:01 | 只看该作者
小怪不大 发表于 2016-6-27 16:25
@pywmiss 这是今天改的程序  但是led屏不显示

/*

IO口有没有初始化?>???2553默认IO口是输入的...
移植程序第一步...先确认要用的IO口输出是不是你需要的...
第二步才是程序的其他内容..一步一步..慢慢调,,可以用单步运行的方式来确认,仿真

使用特权

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

本版积分规则

2

主题

20

帖子

1

粉丝