注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
Linasity的个人空间 https://home.eeworld.com.cn/space-uid-534124.html [收藏] [复制] [分享] [RSS]
日志

12864驱动程序总是停在查忙,求大神解答

已有 904 次阅读2014-7-14 19:08

之前写的驱动程序可以正常使用,今天需要用,程序拿出来结果发现程序没法用了,总是停在查询忙的循环里,不知道怎么回事,于是我把查忙的子程序注掉,12864还是没有显示,一行一行的查寄存器的值都正确。一下午搞的好不爽,但还是没有解决问题,于是跑来向各位大神求救。
  1. #define LCD_DATA_OUT       P4OUT          //数据口
  2. #define LCD_DATA_SEL       P4SEL
  3. #define LCD_DATA_DIR       P4DIR  
  4. #define LCD_DATA_IN        P4IN
  5. #define LCD_COM_SEL        P6SEL         //控制指令口
  6. #define LCD_COM_DIR        P6DIR
  7. #define LCD_COM_OUT        P6OUT

  8. #define LCD_RS_H      LCD_COM_OUT |= BIT3
  9. #define LCD_RS_L      LCD_COM_OUT &= ~BIT3

  10. #define LCD_RW_H      LCD_COM_OUT |= BIT2
  11. #define LCD_RW_L      LCD_COM_OUT &= ~BIT2

  12. #define LCD_EN_H      P7OUT |= BIT7
  13. #define LCD_EN_L      P7OUT &= ~BIT7

  14. #define LCD_COM_INIT      LCD_COM_SEL &= ~(BIT2 + BIT3);LCD_COM_DIR |= (BIT2 + BIT3);P7DIR |= BIT7

  15. #define LCD_DATA_INIT     LCD_DATA_SEL = 0X00;LCD_DATA_DIR = 0XFF


  16. /*******************************************************************************
  17. **函数名称:LCD_Busy()
  18. **函数功能:判断LCD的BF位是否忙,BF不忙时随时可以写入数据或指令
  19. **输 入 口:无
  20. **输 出 口:无
  21. **返 回 值:无
  22. **备    注:如果BF一直处于忙碌状态,i加到60000后会退出循环
  23. **日    期:2013.5.25
  24. *******************************************************************************/
  25. /*void LCD_Busy(void)
  26. {
  27.     //uchar busy = 0;
  28.     //uint i = 60000;
  29.     LCD_DATA_DIR = 0X00;             //数据口作为输入功能
  30.     _NOP();
  31.     LCD_RS_L;                        //读数据    rs=0   rw=1  
  32.     LCD_RW_H;
  33.     LCD_EN_H;                        //使能端高电平读出数据
  34.     while(LCD_DATA_IN & 0x80);    //判断最高位BF是否为1,为1时等待
  35.     LCD_DATA_DIR = 0XFF;             //数据口作为输出功能
  36.     LCD_EN_L;
  37. }*/
  38. /*******************************************************************************
  39. **函数名称:LCD_Write_dat()
  40. **函数功能:写LCD数据函数
  41. **输 入 口:dat:是写入的数据
  42. **输 出 口:无
  43. **返 回 值:无
  44. **备    注:EN下降沿写入一个数据
  45. **日    期:2013.5.25
  46. *******************************************************************************/
  47. void LCD_Write_dat(uchar dat)
  48. {
  49.    // LCD_Busy();
  50.     LCD_RS_H;                  //r0 = h,rw = 0 写数据
  51.     LCD_RW_L;
  52.     LCD_EN_H;
  53.     LCD_DATA_OUT = dat;        //en下降沿写入数据
  54.     LCD_EN_L;
  55. }
  56. /*******************************************************************************
  57. **函数名称:LCD_Write_com()
  58. **函数功能:写LCD指令函数
  59. **输 入 口:com:是写入的指令
  60. **输 出 口:无
  61. **返 回 值:无
  62. **备    注:EN下降沿写入一个指令
  63. **日    期:2013.5.25
  64. *******************************************************************************/
  65. void LCD_Write_com(uchar com)
  66. {
  67.    // LCD_Busy();
  68.     LCD_RS_L;                 //rs = 0,rw = 0 写com
  69.     LCD_RW_L;
  70.     LCD_EN_H;
  71.     LCD_DATA_OUT = com;       //en下降沿写入数据
  72.     LCD_EN_L;
  73. }
  74. /*******************************************************************************
  75. **函数名称:LCD_Write_str()
  76. **函数功能:在LCD上写入一串字符
  77. **输 入 口:add 要写入的地址   *s要写入的指针数组
  78. **输 出 口:无
  79. **返 回 值:无
  80. **备    注:strlen()是引用库函数string.h  ,可以求出数组的长度
  81. **日    期:2013.5.25
  82. *******************************************************************************/
  83. void LCD_Write_str(uchar add,uchar*s)
  84. {
  85.         //LCD_Busy();
  86.     uchar i;
  87.     uchar length = 0;
  88.     LCD_Write_com(add);
  89.     length = strlen(s);
  90.     LCD_RS_H;                  //r0 = h,rw = 0 写数据
  91.     LCD_RW_L;
  92.     //LCD_EN_H;
  93.     for(i=0;i
  94.     {
  95.             LCD_EN_H;
  96.             LCD_Write_dat(*s++);          //指针送完数据后自加一
  97.             LCD_EN_L;
  98.     }
  99. }

  100. void LCD_Init(void)
  101. {
  102.    
  103.     LCD_DATA_INIT;                  //数据IO口初始化
  104.     LCD_COM_INIT;                   //控制IO口初始化
  105.     LCD_Write_com(0x30);
  106.     __delay_cycles(1000);
  107.     LCD_Write_com(0x30);
  108.     __delay_cycles(1000);
  109.     LCD_Write_com(0x0F);
  110.     __delay_cycles(1000);
  111.     LCD_Write_com(0x01);
  112.     __delay_cycles(10000);
  113.     LCD_Write_com(0X80);
  114.     __delay_cycles(500000);
  115.     LCD_Write_dat('1');
  116.     LCD_Write_dat('0');
  117.     LCD_Write_dat('0');
  118.     //LCD_Write_str(0x88,"王智生");
  119. }
复制代码


  1. #include
  2. #include
  3. typedef unsigned char uchar;
  4. typedef unsigned int  uint;
  5. typedef unsigned long ulong;


  6. #include "LCD_File.h"
  7. #include "Clock_Init.h"


  8. main()
  9. {
  10.         WDTCTL = WDTPW + WDTHOLD;
  11.     //Clock_Init();
  12.     LCD_Init();
  13.     while(1);

  14. }
复制代码


本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章