用MSP420F5529写12864并行显示的时候,遇到了一点问题。

2019-03-24 09:33发布

就是数据输入口 并行输入需要8个口,然后一般端口都是直接用一组PX0~PX7的,可是5529并没有完整的一组端口PX0~PX7

然后在单片机给12864写数据的那里我不懂该怎么改。我的开发板5529的端口是这样。
111.jpg
目前我用的是P7.0 P7.1 P7.2 P7.3 P7.5 和 P6.4 P6.6 P6.7  自己也改了下 可是显示的数据并不完整,于是我就搞不懂了
【程序里的图片代码我删掉了 因为太长了】

程序如下:
#include <msp430f5529.h>
#include <in430.h>
#include <stdint.h>

#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long

#define LCD_DataIn    P7DIR=0x00,P6DIR&=~(BIT4+BIT6+BIT7)    //数据口方向设置为输入
#define LCD_DataOut   P7DIR=0xff,P6DIR|=(BIT4+BIT6+BIT7)    //数据口方向设置为输出
#define LCD2MCU_Data  (P7IN&0x2f)|(P6IN&0xD0)
#define LCD_CMDOut    P2DIR|=(BIT0+BIT1+BIT3)     //P2口的低三位设置为输出
#define LCD_RS_H      P2OUT|=BIT0      //P2.0
#define LCD_RS_L      P2OUT&=~BIT0     //P2.0
#define LCD_RW_H      P2OUT|=BIT1      //P2.1
#define LCD_RW_L      P2OUT&=~BIT1     //P2.1
#define LCD_EN_H      P2OUT|=BIT3      //P2.3
#define LCD_EN_L      P2OUT&=~BIT3     //P2.3

#define PSBOut        P4DIR|=BIT4      //P4.4
#define RSTOut        P4DIR|=BIT5      //P4.5
#define PSB_H         P4OUT|=BIT4     //P4.4
#define RST_H         P4OUT|=BIT5     //P4.5

#define CPU_F ((double)16000000)
#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))

uint i=0;
/***********************************************************
*名    称:LCD_Write_cmd()
*功    能:写一个命令到LCD12864
*入口参数:cmd:待写入的命令,无符号字节形式
*出口参数:无
*说    明:写入命令时,RW=0,RS=0 扩展成24位串行发送
*格    式:11111 RW0 RS 0   xxxx0000    xxxx0000
*          |最高的字节  |命令的bit7~4|命令的bit3~0|
***********************************************************/
void Write_Cmd(uchar cmd)
{
        uchar lcdtemp = 0;

        LCD_RS_L;
        LCD_RW_H;
        LCD_DataIn;
        do                       //判忙
        {
                LCD_EN_H;
                _NOP();
                lcdtemp = LCD2MCU_Data;
                LCD_EN_L;

        }
        while(lcdtemp & 0x80);

        LCD_DataOut;
        LCD_RW_L;
//        MCU2LCD_Data = cmd;
        P7OUT=(cmd&0x2f);
//        P2OUT=((cmd&0xc0)>>2);
        if(cmd&0x10)
                P6OUT|=BIT4;
        else
                P6OUT&=~BIT4;
        if(cmd&0x40)
                P6OUT|=BIT6;
        else
                P6OUT&=~BIT6;
        if(cmd&0x80)
                P6OUT|=BIT7;
        else
                P6OUT&=~BIT7;
        LCD_EN_H;
        _NOP();
        LCD_EN_L;
}
/***********************************************************
*名    称:LCD_Write_Byte()
*功    能:向LCD12864写入一个字节数据
*入口参数:byte:待写入的字符,无符号形式
*出口参数:无
*范    例:LCD_Write_Byte('F') //写入字符'F'
***********************************************************/
void  Write_Data(uchar dat)
{
        uchar lcdtemp = 0;

        LCD_RS_L;
        LCD_RW_H;
        LCD_DataIn;
        do                       //判忙
        {
                LCD_EN_H;
                _NOP();
                lcdtemp = LCD2MCU_Data;
                LCD_EN_L;
        }
        while(lcdtemp & 0x80);

        LCD_DataOut;
        LCD_RS_H;
        LCD_RW_L;

//        MCU2LCD_Data = dat;
        P7OUT=(dat&0x2f);
//        P2OUT=((dat&0xc0)>>2);
        if(dat&0x10)
                P6OUT|=BIT4;
        else
                P6OUT&=~BIT4;
        if(dat&0x40)
                P6OUT|=BIT6;
        else
                P6OUT&=~BIT6;
        if(dat&0x80)
                P6OUT|=BIT7;
        else
                P6OUT&=~BIT7;
        LCD_EN_H;
        _NOP();
        LCD_EN_L;
}
void lcd_dis(const uchar *ptr)
{
        uchar i,j;
//        lcd_com(0x34);

        for(i=0;i<32;i++)
  {
        Write_Cmd(0x80+i);    //先写入水平坐标值
        Write_Cmd(0x80);      //写入垂直坐标值
    for(j=16;j>0;j--)   //再写入两个8位元的数据
    Write_Cmd(*ptr++);
    delay_ms(10);
  }
    for(i=0;i<32;i++)
  {
    Write_Cmd(0x80+i);
    Write_Cmd(0x88);
    for(j=16;j>0;j--)
    Write_Data(*ptr++);
    delay_ms(10);
  }
}
void T_display(uchar *p) //图片数据提取函数
{
        uchar x,y,a,b,c;
        //write_com(0x34); //关闭绘图功能
        x=0x88;//设置水平坐标X
        y=0x80;//设置垂直坐标Y
        for(c=0;c<2;c++)
        {
                for(a=0;a<32;a++)
                {
                        Write_Cmd(y+a);
                        Write_Cmd(x);
                        for(b=0;b<16;b++)
                        Write_Data(*p++); //写入8位数据
                }
                x=0x80;//转换半屏
        }
        //write_com(0x36); //打开绘图功能
        //write_com(0x30);
}
/***********************************************************
*名    称:LCD_pos()
*功    能:设置液晶的显示位置
*入口参数:x:第几行,1~4对应第1行~第4行
*          y:第几列,0~15对应第1列~第16列
*出口参数:无
*范    例:LCD_pos(2,3) //第二行,第四列
***********************************************************/
void lcd_pos(uchar x,uchar y)
{
  uchar pos;
  switch(x)
  {
    case 0:pos=0x80+y;break;
    case 1:pos=0x90+y;break;
    case 2:pos=0x88+y;break;
    case 3:pos=0x98+y;break;
    default:pos=0x80+y;
  }
  Write_Cmd(pos);
}
/*******************************************
        函数名称:Clear_GDRAM
功    能:清除液晶GDRAM中的随机数据
参    数:无
返回值  :无
********************************************/
void Clear_GDRAM(void)
{
        uchar i,j,k;

        Write_Cmd(0x34);        //打开扩展指令集
        i = 0x80;
        for(j = 0;j < 32;j++)
        {
                Write_Cmd(i++);
                Write_Cmd(0x80);
                for(k = 0;k < 16;k++)
                {
                        Write_Data(0x00);
                }
        }
        i = 0x80;
        for(j = 0;j < 32;j++)
        {
                Write_Cmd(i++);
                Write_Cmd(0x88);
                for(k = 0;k < 16;k++)
                {
                        Write_Data(0x00);
                }
        }
        Write_Cmd(0x30);        //回到基本指令集
}
/*******************************************
函数名称:Draw_PM
功    能:在整个液晶屏幕上画图
参    数:无
返回值  :无
********************************************/
/*void Draw_PM(const uchar *ptr)
{
        uchar i,j,k;

        Write_Cmd(0x34);        //打开扩展指令集
        i = 0x80;
        for(j = 0;j < 32;j++)
        {
                Write_Cmd(i++);
                Write_Cmd(0x80);
                for(k = 0;k < 16;k++)
                {
                        Write_Data(*ptr++);
                }
        }
        i = 0x80;
        for(j = 0;j < 32;j++)
        {
                Write_Cmd(i++);
                Write_Cmd(0x88);
                for(k = 0;k < 16;k++)
                {
                        Write_Data(*ptr++);
                }
        }
        Write_Cmd(0x36);        //打开绘图显示
        Write_Cmd(0x30);        //回到基本指令集
}*/
/*******************************************
函数名称:Draw_TX
功    能:显示一个16*16大小的图形
参    数:Yaddr--Y地址
                  Xaddr--X地址
                  dp--指向图形数据存放地址的指针
绘图的坐标X以字节为单位,Y以位为单位
初始坐标 0x80,0x80
绘图时需要将YX的坐标连续写入RAM,写入期间绘图必须关闭
返回值  :无
********************************************/
void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp)
{
        uchar j;
        uchar k=0;

        Write_Cmd(0x01);  //清屏,只能清除DDRAM
        Write_Cmd(0x34);  //使用扩展指令集,关闭绘图显示
        for(j=0;j<16;j++)
        {
                Write_Cmd(Yaddr++);       //Y地址
                Write_Cmd(Xaddr);    //X地址
                Write_Data(dp[k++]);
                Write_Data(dp[k++]);
        }
        Write_Cmd(0x36);  //打开绘图显示
        Write_Cmd(0x30);  //回到基本指令集模式
}
/****************************************************/
//LCD12864初始化
void LCD_init(void)
{
        PSB_H;
        delay_ms(200);
        RST_H;
        delay_ms(200);
        Write_Cmd(0x30);//功能设定
        delay_ms(200);
        Write_Cmd(0x0C);//整体显示ON
        delay_ms(200);
        Write_Cmd(0x01);//清除显示
        delay_ms(200);
        Write_Cmd(0x02);//地址归为
        delay_ms(200);
        Write_Cmd(0x80);//设定显示的起始地址
}
void IO_init(void)
{
          P2SEL&=~(BIT0 + BIT1 + BIT3);//P2.0,P2.1,P2.2 为I/O端口
          P2DIR = BIT0 + BIT1 + BIT3;

          P4SEL&=~(BIT4 + BIT5);
          P4DIR = BIT4 + BIT5;
}
void DCO_12M()
{
          UCSCTL3 |= SELREF_2;                      // Set DCO FLL reference = REFO
          UCSCTL4 |= SELA_2;                        // Set ACLK = REFO

          __bis_SR_register(SCG0);                  // Disable the FLL control loop
          UCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODx
          UCSCTL1 = DCORSEL_5;                      // Select DCO range 24MHz operation
          UCSCTL2 = FLLD_1 + 374;                   // Set DCO Multiplier for 12MHz
                                                    // (N + 1) * FLLRef = Fdco
                                                    // (374 + 1) * 32768 = 12MHz
                                                    // Set FLL Div = fDCOCLK/2
          __bic_SR_register(SCG0);                  // Enable the FLL control loop

          // Worst-case settling time for the DCO when the DCO range bits have been
          // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
          // UG for optimization.
          // 32 x 32 x 12 MHz / 32,768 Hz = 375000 = MCLK cycles for DCO to settle
          __delay_cycles(375000);

          // Loop until XT1,XT2 & DCO fault flag is cleared
          do
          {
            UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
                                                    // Clear XT2,XT1,DCO fault flags
            SFRIFG1 &= ~OFIFG;                      // Clear fault flags
          }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag
}

void main()
{
        WDTCTL = WDTPW + WDTHOLD;
        IO_init();
        DCO_12M();
        LCD_init();//LCD初始化
        while(1)
        {
        Write_Cmd(0x36);
        lcd_dis(tiBug);
        delay_ms(200);
        lcd_dis(tiBug1);
        delay_ms(200);
        lcd_dis(tiBug2);
        delay_ms(200);
        lcd_dis(tiBug3);
        delay_ms(200);
        lcd_dis(tiBug4);
        }
}


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
lising
1楼-- · 2019-03-24 10:25
学习学习,支持!
dz840912
2楼-- · 2019-03-24 14:14
< :TI_MSP430_内容页_SA7 --> 学习,厉害!!!!!!!!!!!!!!
elvike
3楼-- · 2019-03-24 14:40
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章