请问msp430f149可以直接驱动 LCD1602A 吗?

2019-03-24 10:29发布

各位朋友,请问msp430f149可以直接驱动LCD1602A吗?为啥我的程序驱动不了lcd1602啊?把程序烧进去后,LCD1602有时可以显示鬼影,但只能显示右半部分,左半部分显示不出来,好奇怪啊。调节对比度要显示的字符还是显示不出来啊。。。
  1. #include<msp430x14x.h>    //包含单片机寄存器的头文件

  2. #define CPU_F ((double)8000000)
  3. #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  4. #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

  5. #define DataDir P3DIR
  6. #define DataPort P3OUT
  7. #define DataIn P3IN
  8. #define Busy 0x80
  9. #define CtrlDir P2DIR
  10. #define RS_L P2OUT&=(~BIT7)
  11. #define RS_H P2OUT|=BIT7
  12. #define RW_L P2OUT&=(~BIT6)
  13. #define RW_H P2OUT|=BIT6
  14. #define EN_L P2OUT&=(~BIT5)
  15. #define EN_H P2OUT|=BIT5
  16. #define BG_H P5OUT|=BIT2

  17. unsigned char *s="0123456789";

  18. /*****************************************************
  19. 函数功能:判断液晶模块的忙碌状态
  20. 返回值:result。result=1,忙碌;result=0,不忙
  21. ***************************************************/
  22. unsigned char BusyTest(void)
  23.   {
  24.     unsigned char result;
  25.     DataDir&=0x00;
  26.     RS_L;       //根据规定,RS为低电平,RW为高电平时,可以读状态
  27.     RW_H;
  28.     EN_H;        //E=1,才允许读写
  29.     delay_us(2);
  30.    if((DataIn & Busy)!=0)
  31.    {
  32.      result=1;
  33.    }
  34.    EN_L;
  35.    DataDir|=0xff;
  36.    return result;
  37.   }
  38. /*****************************************************
  39. 函数功能:将模式设置指令或显示地址写入液晶模块
  40. 入口参数:dictate
  41. ***************************************************/
  42. void WriteInstruction (unsigned char dictate)
  43. {  
  44.          //while(BusyTest()==1); //如果忙就等待
  45.          RS_L;                  //根据规定,RS和R/W同时为低电平时,可以写入指令
  46.          delay_us(50);
  47.          RW_L;
  48.          delay_us(50);
  49.          EN_L;                   //E置低电平(根据表8-6,写指令时,E为高脉冲,
  50.                           // 就是让E从0到1发生正跳变,所以应先置"0"
  51.         delay_us(50);          //空操作两个机器周期,给硬件反应时间
  52.          DataPort=dictate;            //将数据送入P0口,即写入指令或地址
  53.         delay_us(50);                //空操作四个机器周期,给硬件反应时间
  54.          EN_H;                   //E置高电平
  55.         delay_us(50);               //空操作四个机器周期,给硬件反应时间
  56.         EN_L;                  //当E由高电平跳变成低电平时,液晶模块开始执行命令
  57. }

  58. /*****************************************************
  59. 函数功能:将数据(字符的标准ASCII码)写入液晶模块
  60. 入口参数:y(为字符常量)
  61. ***************************************************/
  62. void WriteData(unsigned char y)
  63. {
  64.          // while(BusyTest()==1); //如果忙就等待  
  65.           RS_H;           //RS为高电平,RW为低电平时,可以写入数据
  66.           delay_us(50);
  67.           RW_L;
  68.           delay_us(50);
  69.           EN_L;            //E置低电平(根据表8-6,写指令时,E为高脉冲,
  70.                        // 就是让E从0到1发生正跳变,所以应先置"0"
  71.           delay_us(50);
  72.           DataPort=y;           //将数据送入P0口,即将数据写入液晶模块
  73.           delay_us(50);       //空操作四个机器周期,给硬件反应时间
  74.           EN_H;          //E置高电平
  75.           delay_us(50);        //空操作四个机器周期,给硬件反应时间
  76.          EN_L;            //当E由高电平跳变成低电平时,液晶模块开始执行命令
  77. }
  78. /*****************************************************
  79. 函数功能:对LCD的显示模式进行初始化设置
  80. ***************************************************/
  81. void LcdInitiate(void)
  82. {
  83.   P5DIR=0xff;
  84.   CtrlDir|=0xe0;
  85.   DataDir=0xff;
  86.    BG_H;
  87.   delay_ms(15);             //延时15ms,首次写指令时应给LCD一段较长的反应时间
  88.    WriteInstruction(0x38);  //显示模式设置:16×2显示,5×7点阵,8位数据接口
  89.         delay_ms(5);   //延时5ms 
  90.         WriteInstruction(0x38);
  91.         delay_ms(5);
  92.         WriteInstruction(0x38);
  93.         delay_ms(5);
  94.         WriteInstruction(0x38);
  95.         delay_ms(5);
  96.         WriteInstruction(0x0f);  //显示模式设置:显示开,有光标,光标闪烁
  97.         delay_ms(5);
  98.         WriteInstruction(0x06);  //显示模式设置:光标右移,字符不移
  99.         delay_ms(5);
  100.         WriteInstruction(0x01);  //清屏幕指令,将以前的显示内容清除
  101.         delay_ms(80);
  102. }
  103. /*******************************************
  104. 函数名称:LocateXY
  105. 功    能:向液晶输入显示字符位置的坐标信息
  106. 参    数:x--位置的列坐标
  107.           y--位置的行坐标
  108. 返回值  :无
  109. ********************************************/
  110. void LocateXY(unsigned char x,unsigned char y)
  111. {
  112.     unsigned char temp;

  113.     temp = x&0x0f;
  114.     y &= 0x01;
  115.     if(y)   temp |= 0x40;  //如果在第2行
  116.     temp |= 0x80;

  117.    WriteInstruction(temp);
  118. }
  119. /*******************************************
  120. 函数名称:Disp1Char
  121. 功    能:在某个位置显示一个字符
  122. 参    数:x--位置的列坐标
  123.           y--位置的行坐标
  124.           data--显示的字符数据
  125. 返回值  :无
  126. ********************************************/
  127. void Disp1Char(unsigned char x,unsigned char y,unsigned char data)
  128. {
  129.     LocateXY( x, y );                        
  130.     WriteData( data );               
  131. }
  132. /*******************************************
  133. 函数名称:DispNchar
  134. 功    能:让液晶从某个位置起连续显示N个字符
  135. 参    数:x--位置的列坐标
  136.           y--位置的行坐标
  137.           n--字符个数
  138.           ptr--指向字符存放位置的指针
  139. 返回值  :无
  140. ********************************************/
  141. void DispNChar(unsigned char x,unsigned char y, unsigned char n,unsigned char *ptr)
  142. {
  143.     unsigned char i;
  144.     for (i=0;i<n;i++)
  145.     {
  146.         Disp1Char(x++,y,ptr[i]);
  147.         if (x == 0x0f)
  148.         {
  149.            x = 0;
  150.            y ^= 1;
  151.         }
  152.     }
  153. }
  154. /***********************************************
  155. 函数名称:DispStr
  156. 功    能:让液晶从某个位置起连续显示一个字符串
  157. 参    数:x--位置的列坐标
  158.           y--位置的行坐标
  159.           ptr--指向字符串存放位置的指针
  160. 返回值  :无
  161. ***********************************************/
  162. void DispStr(unsigned char x,unsigned char y,unsigned char *ptr)
  163. {
  164.     unsigned char *temp;
  165.     unsigned char i,n = 0;

  166.     temp = ptr;
  167.     while(*ptr++ != '')   n++;    //计算字符串有效字符的个数

  168.     for (i=0;i<n;i++)
  169.     {
  170.         Disp1Char(x++,y,temp[i]);
  171.         if (x == 0x0f)
  172.         {
  173.            x  = 0;
  174.            y ^= 1;
  175.         }
  176.     }
  177. }
  178. /********************************************************************
  179. * 名称 : L1602_char(uchar hang,uchar lie,char sign)
  180. * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
  181.                  L1602_char(1,5,'b')
  182. * 输入 : 行,列,需要输入1602的数据
  183. * 输出 : 无
  184. ***********************************************************************
  185. void L1602_char(unsigned char hang,unsigned char lie,char sign)
  186. {
  187.         unsigned char a;
  188.         if(hang == 1) a = 0x80;
  189.         if(hang == 2) a = 0xc0;
  190.         a = a + lie - 1;
  191.         WriteInstruction(a);
  192.         WriteData(sign);
  193. }
  194. ********************************************************************
  195. * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
  196. * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
  197.                   L1602_string(1,5,"ab cd ef;")
  198. * 输入 : 行,列,需要输入1602的数据
  199. * 输出 : 无
  200. ***********************************************************************
  201. void L1602_string(unsigned char hang,unsigned char lie,unsigned char *p)
  202. {
  203.         unsigned char a;
  204.         if(hang == 1) a = 0x80;
  205.         if(hang == 2) a = 0xc0;
  206.         a = a + lie - 1;
  207.         WriteInstruction(a);
  208.         while(1)
  209.         {
  210.                 if(*p == '') break;
  211.                 WriteData(*p);
  212.                 p++;
  213.         }
  214. }*/

  215. void clock_set()
  216. {
  217.    unsigned int i;
  218.    BCSCTL1 &=~XT2OFF;
  219.    do
  220.     {
  221.       IFG1 &= ~OFIFG;       //clear invalidation flag
  222.       for (i=0xff;i>0;i--);
  223.     }
  224.    while ((IFG1 & OFIFG));//FLAG is exist
  225.    BCSCTL2 |=SELM_2+SELS;     //MCLK=LFXT2
  226. }


  227. void main(void)            //主函数
  228. {
  229.    P4DIR=P4DIR | BIT0;

  230.   WDTCTL=WDTPW + WDTHOLD;   // STOP WATCHDOG
  231.   clock_set();
  232.   LcdInitiate();         //调用LCD初始化函数
  233.   DispStr(5,0,s);
  234.   //Disp1Char(5,1,'A');
  235.   while(1)
  236.   {
  237.     //Disp1Char(5,1,'A');
  238.     P4OUT^=0x01;
  239.     delay_ms(500);
  240.    //L1602_string(1,1,"0123456789");
  241.   }
  242. }
复制代码

0条回答

一周热门 更多>

相关问题

    相关文章