msp430f149使用FYD12864-0402C无法显示

2019-08-04 18:44发布

小弟使用谢兴红写专讲149的书。msp430f149驱动12864-0402C的液晶无**常显示。
程序:
              #include <msp430x14x.h>
#define   uint  unsigned int
#define   uchar unsigned char
/******************************************define  lcd******/
#define LCD_CS   BIT5
#define LCD_DAT  BIT7
#define LCD_SCK  BIT6
#define  WR  BIT2
#define  RS  BIT1
/************************************************************/
uchar charge=0;
uchar SYNCH=0xfe;  //LCD显示同步字
static uchar adc_flag=0;
static uchar time_flag=0;
static uchar count=0;
uint AD_TEMP=0;
float AD=0;
void int_clk()
{
    uchar i;
    BCSCTL1&=~XT2OFF;  //打开XT振荡器
    BCSCTL2|=SELM1+SELS;//MCLK 8M and SMCLK 1M  
    do
{
        IFG1 &= ~OFIFG;                 //清除振荡错误标志
        for(i = 0; i < 100; i++)
   _NOP();   //延时等待
        }
    while ((IFG1 & OFIFG) != 0); //如果标志为1继续循环等待
    IFG1&=~OFIFG;
}
void get_clk()
{
  P1DIR|=LCD_SCK;  
   _NOP();
  P1OUT&=~LCD_SCK;  
  _NOP();
  _NOP();
  _NOP();
  _NOP();
  _NOP();  
  P1OUT|=LCD_SCK;
  _NOP();
  _NOP();
  _NOP();
  _NOP();
  _NOP();
  _NOP();
  _NOP();   
}
void inport(uchar com,uchar dat)//com=1,rs=1,com=0,rs=0;
{
  uchar i,temp;
  P1DIR|=LCD_DAT;
  P1DIR|=LCD_CS;
  P1OUT|=LCD_CS;
  temp=SYNCH;
  temp&=~WR;
  if(com)      temp|=RS;
  else         temp&=~RS;
  for(i=0;i<=7;i++)
    {
      if(temp<<i&0x80)    P1OUT|=LCD_DAT;
      else             P1OUT&=~LCD_DAT;
      get_clk();
    }
  temp=dat&0xf0;
for(i=0;i<=7;i++)
    {
      if(temp<<i&0x80)    P1OUT|=LCD_DAT;
      else             P1OUT&=~LCD_DAT;
      get_clk();
    }
    temp=dat&0x0f;
    temp=temp<<4;
for(i=0;i<=7;i++)
    {
      if(temp<<i&0x80)    P1OUT|=LCD_DAT;
      else             P1OUT&=~LCD_DAT;
      get_clk();
    }
P1OUT|=LCD_DAT;
P1OUT&=~LCD_CS;
}
print_string(uchar add,uchar *pt)
{
  uchar i;
  inport(0x00,add);
  for(i=0;;i++)
{
    if(*pt==' ') break;
    inport(0x01,*pt);
    pt++;
}
}
print_han(uchar h_neima,uchar l_neima)
{
inport(0x01,h_neima);
inport(0x01,l_neima);
}
print_float(float data)
{
    uint temp;
    uchar a1,a2,a3,a4;
    temp=data*1000;
    a1=temp/1000;
    a2=(temp-a1*1000)/100;
    temp=(temp-a1*1000)-a2*100;
    a3=temp/10;
    a4=temp%10;
    inport(0x01,a1+0x30);  
    inport(0x01,'.');  
    inport(0x01,a2+0x30);  
    inport(0x01,a3+0x30);  
    inport(0x01,a4+0x30);  
}
void int_lcd()
{
  inport(0x00,0x30);
  inport(0x00,0x01);
  inport(0x00,0x02);
  inport(0x00,0x0c);
  inport(0x00,0x06);
}
int_adc()
{  
  P6SEL|=0x01;                              //选择AD通道
  ADC12CTL0|=ADC12ON+SHT0_2+REF2_5V+REFON;           // //采样保持时间为16个ADC12CLK
  ADC12CTL1|=ADC12SSEL1+ADC12SSEL1;                                              //参考电压开启,选择2.5V
  ADC12MCTL0=0x10;                        // ref+=REF2_5V, channel = A0
  ADC12IE|=0x01;                            // 使能转换中断
  ADC12CTL0|=ENC;                          // 使能AD转换器
}
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
while((ADC12CTL1&0X01)==1);//等待转换完
  adc_flag=1;
  AD_TEMP=ADC12MEM0;//设置ADC转换完标志,并且读取ADC值
}
void int_timer()
{
  TACTL|=TASSEL1+TACLR+ID0+ID1;//选择SMCLK作为定时器的时钟,8分频
  TACTL|=MC0+TAIE;//增加模式,并且使能中断
  TACCR0=9999;//中断周期为10ms  
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
  switch(TAIV)
  {
    case 2:break;
    case 4:break;
    case 10:if(adc_flag==0){ADC12CTL0 |= ADC12SC;ADC12CTL0 &= ~ADC12SC;}break;//10ms中断标志加1
    default:break;
  }   
}
int main( void )
{  
  WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
  int_clk();  //系统时钟初始化
  int_adc();//初始化串口   
  int_lcd(); //初始化LCD
  int_timer(); //初始化TIMER
  _EINT();  //使能中断
  while(1)
  {
    while(adc_flag==1)
    {   
        AD+=AD_TEMP;
        count++;
        if(count==100)
        {
        AD=AD/100;  
        AD=(AD*2.5/4096);      
        inport(0x00,0x80);  
        print_han(0xb5,0xe7);
        print_han(0xd1,0xb9);//电压
        inport(0x01,':');      
        print_float(AD);
        inport(0x01,'V');//显示电压值
         AD=0;
         count=0;
         AD_TEMP=0;//变量清零
       }
        adc_flag=0;//清中断标志        
      
    }
  }
}

硬件:
  因为3.3V系统,在液晶的驱动电压上我选择了在SID CS  SC上加三极管做电平转换。
谢新红的书硬件是用的P6,我用接口的是P1.5、P1.6、P1.7
请问:
    程序中的#define  WR  BIT2#define  RS  BIT1有什么意义?硬件上无此接口。
   求大神指导。。。。。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
黄小俊
1楼-- · 2019-08-04 21:53
dirtwillfly
2楼-- · 2019-08-04 22:45
 精彩回答 2  元偷偷看……
lcdclass
3楼-- · 2019-08-05 00:09
需要这样复杂吗, 用msp430 直接与RSI12864 通信, 硬件只需要接三根线, 软件提供库函数,直接调用。
显示模式: STN 蓝模负显
VA  尺寸: 72.0mm*40.0mm
分 辨 率: 128*64 Dots
显示视角: 6:00
图片存储: 内建FLASH Memory,用于存储界面图片
2D  绘图: 支持2D(点、线、圆、矩形)图形绘制
字    库: 支持多国语言字库(如ASCII、中、日、韩……)
背光亮度: 支持软件可调
对 比 度: 支持软件可调
键    盘: 支持4*8键盘扫描功能,直接将键值发送给控制端
ID  识别: 支持ID识别功能,可实现一机多控
工作温度: -20~70℃
存储温度: -30~80℃
工作电压: 5.0V
通信接口: RS232 or UART(TTL:5.0V)
dirtwillfly
4楼-- · 2019-08-05 01:59
楼主的问题解决了吗?

一周热门 更多>