查看: 12022|回复: 15

请求大侠技术支持,为什么1602不显示???msp430g2553

[复制链接]

该用户从未签到

发表于 2012-9-12 22:00:53 | 显示全部楼层 |阅读模式
分享到:
第一种方法:为什么不显示???
#include "msp430g2553.h"
#define  lcden_out  P2DIR|=BIT2
#define  lcden_in  P2DIR&=~BIT2
#define  lcden_h  P2OUT|=BIT2
#define  lcden_l  P2OUT&=~BIT2
#define  rw_out  P2DIR|=BIT1
#define  rw_in  P2DIR&=~BIT1
#define  rw_h  P2OUT|=BIT1
#define  rw_l  P2OUT&=~BIT1
#define  rs_out  P2DIR|=BIT0
#define  rs_in  P2DIR&=~BIT0
#define  rs_h  P2OUT|=BIT0
#define  rs_l  P2OUT&=~BIT0
#define data P1OUT
#define uchar  unsigned char
void delay(uchar);
void write_com(uchar com) ;
void write_date(uchar date) ;
void display_string(uchar *p,uchar com) ;
void main(void)
{  
lcden_out;
lcden_l;  
write_com(0x38);  
write_com(0x0c);  
write_com(0x06);  
write_com(0x01);  
display_string("   welcome      ",0x80);         
display_string("wen das dax xcvb",0xc0);
}  
void delay(uchar z)
{
  int x,y;
  for(x=100;x>0;x--)
    for(y=z;y>0;y--);
}

void write_com(uchar com)
{  
         lcden_out;
         rs_out;
         rw_out;
         P2DIR=0XFF;

         rs_l;
         rw_l;
  lcden_l;  
         data=com;
  delay(1);  
  lcden_h;  
  delay(1);  
  lcden_l;  
}  
void write_date(uchar date)
{  
          lcden_out;
          rs_out;
         P2DIR=0XFF;   

          rs_h;  
          rw_l;
  lcden_l;  
         data=date;
  delay(1);  
  lcden_h;  
  delay(1);  
  lcden_l;  
}
void display_string(uchar *p,uchar com)
{  
char i;   
write_com(com);   
for(i=0;i<16;i++)   
{
  write_date(p[i]);   
}
}
第二种方法:为什么1602不显示


/*********************************************************************
*
* LCD1602显示之高四位相连的方法
*
* 描述:4线数据宽度,操作Lcd1602
* 在LCD1602屏幕上第一行显示 Hello!LCD1602
* 第二行显示 MSP430G2553
* 硬件电路:MSP430g2553
* 硬件连接:
* MSP430与LCD连接信息
* LCD1602,4位接口,即使用D4-D7数据口,D0-D3不接入MCU
* PIN1 --> 地
* PIN2 --> VCC(一定要接+5V)
* PIN3 -->仿真时悬空,实际电路 2K电阻-->地 (一定要接好,否则没有任何显示)
* PIN4 --> RS --> P1.6
* PIN5 --> R/W --> GND
* PIN6 --> EN --> P1.7
* PIN7 --> D0不接
* PIN8 --> D1不接
* PIN9 --> D2不接
* PIN10 --> D3不接
* PIN11 --> D4 --> P2.1
* PIN12 --> D5 --> P2.2
* PIN13 --> D6 --> P2.3
* PIN14 --> D7 --> P2.4
* PIN15 --> VCC
* PIN16 --> 地
* 调试器:MSP430G2553系列JTAG仿真器
* 调试软件: IAR 编译
*****************************************************************/
#include <intrinsics.h>
#include <msp430g2253.h>
#include <msp430.h>
/*******************************************************************************
                                                     端口定义
******************************************************************************/
#define LCD_EN_PORT P1OUT    //以下2个要设为同一个口
#define LCD_EN_DDR P1DIR
#define LCD_RS_PORT P1OUT    //以下2个要设为同一个口
#define LCD_RS_DDR P1DIR
#define LCD_DATA_PORT P2OUT  //以下3个要设为同一个口
#define LCD_DATA_DDR P2DIR   //一定要用高4位
#define LCD_RS BIT6
#define LCD_EN BIT7
#define LCD_DATA    BIT7|BIT6|BIT5|BIT4   //4位数据线连接模式
/*******************************************************************************
                           预定义函数
******************************************************************************/
void LCD_init(void);//液晶初始化函数
void LCD_init_first(void);//LCD1602液晶初始化函数
void LCD_en_write1(void);  //上升沿使能
void LCD_en_write2(void);  //下降沿使能
void LCD_write_command(unsigned char command);//写指令函数
void LCD_write_data(unsigned char data);//写数据函数
void LCD_set_xy (unsigned char x, unsigned char y);//地址函数
void LCD_write_string(unsigned char X,unsigned char Y, unsigned char *s);//写字符串函数
void LCD_write_char(unsigned char X,unsigned char Y, unsigned char data);//写字符函数
void delay_1ms(void);
void delay_nus(unsigned int n);
void delay_nms(unsigned int n);
unsigned char LCDBuf1[]={"Hello!LCD1602"};   //第一行要显示的内容
unsigned char LCDBuf2[]={"MSP430G2553"};     //第二行要显示的内容
/*******************************************************************************
                                  主函数
******************************************************************************/
void main()
{
WDTCTL = WDTPW + WDTHOLD;     // 关闭看门狗
LCD_init_first();// LCD液晶操作函数
LCD_init();//液晶初始化函数
delay_nms(100);
LCD_write_string(0,0,LCDBuf1);//第一行起
delay_nms(10);
LCD_write_string(0,1,LCDBuf2);//第二行起
}
/*******************************************************************************
            LCD液晶操作函数
******************************************************************************/
void LCD_init_first(void)         //LCD1602液晶初始化函数(热启动)
{
        delay_nms(500);
     LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出2.7,2.6,2.5,2.4
     LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出1.7
     LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出1.6
        delay_nms(50);
        LCD_write_command(0x30);//
        delay_nms(50);
        LCD_write_command(0x30);
        delay_nms(5);
        LCD_write_command(0x30);
        delay_nms(500);
}
/*******************************************************************************
*
*             LCD1602液晶初始化函数
*
******************************************************************************/
void LCD_init(void)
{
delay_nms(500);
LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出2.7,2.6,2.5,2.4
LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出1.7
LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出1.6
delay_nms(500);
LCD_write_command(0x28);  //4位数据接口
delay_nms(50);
LCD_write_command(0x28);  //4位数据接口
delay_nms(50);
LCD_write_command(0x28);  //4位数据接口
delay_nms(50);
LCD_en_write2();
delay_nms(50);
LCD_write_command(0x28); //4位数据接口
delay_nms(500);
LCD_write_command(0x01); //清屏
LCD_write_command(0x0c); //显示开,关光标,不闪烁
    LCD_write_command(0x06); //设定输入方式,增量不移位
delay_nms(50);

}
/******************************************************************************
*
*             液晶使能上升沿
*
**************************************** *************************************/
void LCD_en_write1(void)
{
    LCD_EN_PORT&=~LCD_EN;//P1OUT &=~BIT7;清零
    delay_nus(10);
    LCD_EN_PORT|=LCD_EN;//P1OUT |=BIT7;置一
}
/*******************************************************************************
*
*             液晶使能下降沿
*
******************************************************************************/
void LCD_en_write2(void)
{
   LCD_EN_PORT|=LCD_EN;//P1OUT |=BIT7;//置一
   delay_nus(10);
   LCD_EN_PORT&=~LCD_EN;//P1OUT &=~BIT7;//清零
}
/*******************************************************************************
*
*               写指令函数
*
******************************************************************************/
void LCD_write_command(unsigned char command)
{
   delay_nus(16);
   P2SEL=0x00;//P2引脚为I/o端口
   LCD_RS_PORT&=~LCD_RS; //RS=0,P1OUT &=~BIT6;清零
   LCD_en_write1();//液晶使能上升沿
   LCD_DATA_PORT&=0X0f; //P2高四位清零
   LCD_DATA_PORT|=command&0xf0; //P2写高四位
   delay_nus(16);
   LCD_en_write2();//液晶使能下降沿
   command=command<<4; //低四位移到高四位
   LCD_en_write1();//液晶使能上升沿
   LCD_DATA_PORT&=0x0f; //清高四位
   LCD_DATA_PORT|=command&0xf0; //写低四位
   LCD_en_write2();//液晶使能下降沿
}
/*******************************************************************************
*
*               写数据函数
*
******************************************************************************/
void LCD_write_data(unsigned char data)
{
   delay_nus(16);
   P2SEL=0x00;//P2引脚为I/o端口
   LCD_RS_PORT|=LCD_RS;      //RS=1,P1OUT |=BIT6;置一
   LCD_en_write1();          //E上升沿使能
   LCD_DATA_PORT&=0X0f;      //清高四位
   LCD_DATA_PORT|=data&0xf0; //写高四位
   delay_nus(16);
   LCD_en_write2();//E下降沿使能
   data=data<<4;             //低四位移到高四位
   LCD_en_write1(); //E上升沿使能
   LCD_DATA_PORT&=0X0f;      //清高四位
   LCD_DATA_PORT|=data&0xf0; //写低四位
   LCD_en_write2();//E下降沿使能
}
/*******************************************************************************
*
*               写地址函数
*
******************************************************************************/
void LCD_set_xy( unsigned char x, unsigned char y )
{
   unsigned char address;
   if (y == 0) address = 0x80 + x;//y==0时地址在第一行的第x处
   else address = 0xc0 + x;//y!=0时地址在第二行的第x处
   LCD_write_command( address);//在地址x处写
}
/*******************************************************************************
*
*LCD在任意位置写字符串,列x=0~15,行y=0,1
*第一行y等于0而第二行等于1,x为所在行的距首的位置,s为字符串
*
******************************************************************************/
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
{
LCD_set_xy( X, Y ); //写地址
    while (*s)          //写显示字符
    {
      LCD_write_data( *s );
      s++;
    }
}
/*******************************************************************************
*
*     LCD在任意位置写字符,列x=0~15,行y=0,1
*
******************************************************************************/
void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data)
{
   LCD_set_xy( X, Y ); //写地址
   LCD_write_data( data);
}
/*****************************************
*
*               1us延时函数
*
****************************************/
void delay_1us(void)
{
   asm("nop");
}
/*****************************************
*
*               N us延时函数
*
****************************************/
void delay_nus(unsigned int n)
{
   unsigned int i;
   for (i=0;i<n;i++)
   delay_1us();
}
/*****************************************
*
*               1ms延时函数
*
****************************************/
void delay_1ms(void)
{
   unsigned int i;
   for (i=0;i<1140;i++);
}
/*****************************************
*
*               N ms延时函数
*
****************************************/
void delay_nms(unsigned int n)
{
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1ms();
}





回复

使用道具 举报

  • TA的每日心情
    擦汗
    2013-4-4 08:56
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2012-9-12 22:09:43 | 显示全部楼层
    这个我测试可以,你对比一下。。。。。

    1602.rar

    100.57 KB, 下载次数: 290

    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2013-10-17 16:10
  • 签到天数: 37 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2012-9-12 22:12:01 | 显示全部楼层
    #define data P1OUT
    void write_date(uchar date)
    {  
              lcden_out;
              rs_out;
             P2DIR=0XFF;   

              rs_h;  
              rw_l;
      lcden_l;  
             data=date;
      delay(1);  
      lcden_h;  
      delay(1);  
      lcden_l;  
    }

    注意看我标红色地方
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2012-9-12 23:20:18 | 显示全部楼层
    darkhotch 发表于 2012-9-12 22:12
    #define data P1OUT
    void write_date(uchar date)
    {  

    我没有发现有什么区别???请教!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2012-9-12 23:28:45 | 显示全部楼层
    hanchengjian 发表于 2012-9-12 22:09
    这个我测试可以,你对比一下。。。。。

    但是在你这个程序里P2.6和P2.7口是否存在哪?msp430g2553里我没有发现有这两个口那?谢谢!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2013-4-4 08:56
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2012-9-13 06:57:52 | 显示全部楼层
    2010独步天下 发表于 2012-9-12 23:28
    但是在你这个程序里P2.6和P2.7口是否存在哪?msp430g2553里我没有发现有这两个口那?谢谢! ...

    不存在。。。你改下管脚。。。改成P2.0,P2.1,P2,.2
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2012-9-13 12:16:14 | 显示全部楼层
    hanchengjian 发表于 2012-9-13 06:57
    不存在。。。你改下管脚。。。改成P2.0,P2.1,P2,.2

    delay_1ms();                      //这4行不要改,否则仿真没显示
    //        LCD_write_command(0x38);  //8位数据接口时,使用这行,否则仿真没显示
            LCD_write_command(0x33);  //4位数据接口时,使用这行,否则仿真没显示
            delay_1ms();                     //
    //        LCD_write_command(0x38);  //8位数据接口时,使用这行,否则仿真没显示
            LCD_write_command(0x32);  //4位数据接口时,使用这行,否则仿真没显示
            delay_1ms();       
    //        LCD_write_command(0x38); //8位数据接口时,使用这行,否则仿真没显示


            delay_1ms();
    //        LCD_write_command(0x38); //8位数据接口
            LCD_write_command(0x2c); //4位数据接口

            delay_1ms();
    什么意思??为什么是0x38和0x33以及0x32?他们代表什么意思啊
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2013-4-4 08:56
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2012-9-13 16:02:48 | 显示全部楼层
    2010独步天下 发表于 2012-9-13 12:16
    delay_1ms();                      //这4行不要改,否则仿真没显示
    //        LCD_write_command(0x38);  //8位数据接口时,使 ...

    1602的各项指令:就是你告诉1602要使用它的什么功能:

    我粘贴一下它的指令表:


    RW、RS的组合一共有四种情况,分别对应四种操作:RS=0、RW=0——表示向LCM写入指令
    RS=0、RW=1——表示读取Busy标志
    RS=1、RW=0——表示向LCM写入数据
    RS=1、RW=1——表示从LCM读取数据
    三、LCD在使用的过程中,可以在RS=0、RW=0的情况下,向LCD写入一个字节的控制指令。使用的控制指令一共八个类别。
    有的类别又有几条不同的指令。具体的情况罗列在下:


    ①01H:清除DDRAM的所有单元,光标被移动到屏幕左上角。
    ②02H:DDRAM所有单元的内容不变,光标移至左上角。
    ③输入方式设置(EnterModeSet),这些指令规定了两个方面:一是写入一个DDRAM单元后,地址指针如何改变(加一还是减一);二是屏幕上的内容是否滚动。
    04H:写入DDRAM后,地址指针减一(光标左移一位),比如第一个字符写入8FH,则下一个字符会写入8EH;屏幕上的内容不滚动。
    05H:写入DDRAM后,地址指针减一,同上一种情况;每一个字符写入以后,屏幕上的内容向右滚动一个字符位,光标显示的位置不动。
    06H:写入DDRAM后,地址指针加一(光标右移一位),比如第一个字符写入80H,则下一个字符会写入81H;屏幕上的内容也是不滚动。这应该是最常用的一种显示方式。07H:写入DDRAM后,地址指针加一,同上一种情况;每一个字符写入以后,屏幕上的内容向左滚动一个字符位,光标显示的位置不移动。
    ④屏幕开关、光标开关、闪烁开关。
    08H、09H、0AH、0BH:关闭显示屏,实质上是不把DDRAM中的内容对应显示在屏幕上,对DDRAM的操作还是在进行的,执行这条指令,接着对 DDRAM进行写入,屏幕上没有任何内容,但是接着执行下面的某条指令,就能看到刚才屏幕关闭期间,对DDRAM操作的效果了。
    0cH:打开显示屏,不显示光标,光标所在位置的字符不闪烁。
    0dH:打开显示屏,不显示光标,光标所在位置的字符闪烁。
    0eH:打开显示屏,显示光标,光标所在位置的字符不闪烁。
    0fH:打开显示屏,显示光标,光标所在位置的字符闪烁。
    关于光标的位置:光标所在的位置指示了下一个被写入的字符所处的位置,假如在写入下一个字符前没有通过指令设置DDRAM的地址,那么这个字符就应该显示在光标指定的地方。
    ⑤设置光标移动(本质就是AC的增加还是减少)、整体画面是否滚动。
    10H:每输入一次该指令,AC就减一,对应了光标向左移动一格。整体的画面不滚动。
    14H:每输入一次该指令,AC就加一,对应了光标向右移动一格。整体的画面不滚动。
    18H:每输入一次该指令,整体的画面就向左滚动一个字符位。
    1CH:每输入一次该指令,整体的画面就向右滚动一个字符位。画面在滚动的时候,每行的首尾是连在一起的,也就是每行的第一个字符,若左移25次,就会显示在该行的最后一格。在画面滚动的过程中,AC的值也是变化的。
    ⑥显示模式设定指令,设定了显示几行,显示什么样的点阵字符,数据总线占用几位。
    20H:4位总线,单行显示,显示5×7的点阵字符。
    24H:4位总线,单行显示,显示5×10的点阵字符。
    28H:4位总线,双行显示,显示5×7的点阵字符。
    2CH:4位总线,双行显示,显示5×10的点阵字符。
    30H:8位总线,单行显示,显示5×7的点阵字符。
    34H:8位总线,单行显示,显示5×10的点阵字符。
    38H:8位总线,双行显示,显示5×7的点阵字符。这是最常用的一种模式。3CH:8位总线,双行显示,显示5×10的点阵字符。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2012-9-13 16:57:15 | 显示全部楼层
    hanchengjian 发表于 2012-9-13 16:02
    1602的各项指令:就是你告诉1602要使用它的什么功能:

    我粘贴一下它的指令表:

    谢谢呀!!!!!!!!!!!!!!!!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2013-4-4 08:56
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2012-9-13 17:16:23 | 显示全部楼层
    2010独步天下 发表于 2012-9-13 16:57
    谢谢呀!!!!!!!!!!!!!!!!!!

    客气
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-23 21:55 , Processed in 0.197591 second(s), 34 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.