[Cortex-M0技术交流] [2012助学第一期]hzy41y学习笔记之一(4数据线驱动LCD802)

[复制链接]
3260|10
 楼主| hzy41y 发表于 2012-6-6 10:27 | 显示全部楼层 |阅读模式
1.功能说明:
    基于助学板,采用PA口4条数据线实现对JHD802A的简单驱动。

2.程序说明。


//***基于助学板采用PA口4条数据线实现对JHD802A的简单驱动***//
//作者:hzy41y
//最后更新日期2012年06月06日10:10
/* NUC120              JHD802A
--------|           |-----------|
        |     4     |        VDD|-------+5V
    GPA7|-----------| DB7       |
    GPA6|-----------| DB6       |   
    GPA5|-----------| DB5       |
    GPA4|-----------| DB4       |
        |           |        VSS|________0V
    PC14|-----------| RS        |   |
    PC15|-----------| R/W       |   |
    PC6 |-----------| E         |   |
        |           |        VEE|___|
--------|           |-----------|
JHD802A接口
1    2    3   4    5   6   7    8    9   10   11   12   13   14
VSS  VCC  VEE  RS  R/W  E  DB0  DB1  DB2  DB3  DB4  DB5  DB6  DB7

*/
#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"

#define RS_Set DrvGPIO_SetBit(E_GPC,14)
#define RW_Set DrvGPIO_SetBit(E_GPC,15)
#define E_Set DrvGPIO_SetBit(E_GPC,6)
#define RS_Clr DrvGPIO_ClrBit(E_GPC,14)
#define RW_Clr DrvGPIO_ClrBit(E_GPC,15)
#define E_Clr DrvGPIO_ClrBit(E_GPC,6)
#define LED_Clr DrvGPIO_ClrBit(E_GPA,2)
#define LED_Set DrvGPIO_SetBit(E_GPA,2)

void GPIO_Configuration(void)
{ DrvGPIO_Open( E_GPC, 6, E_IO_QUASI ); //标准数字双向口
  DrvGPIO_Open( E_GPC, 14, E_IO_QUASI );
  DrvGPIO_Open( E_GPC, 15, E_IO_QUASI );
  DrvGPIO_Open( E_GPA, 2, E_IO_OUTPUT );
  DrvGPIO_Open( E_GPA, 4, E_IO_QUASI );
  DrvGPIO_Open( E_GPA, 5, E_IO_QUASI );
  DrvGPIO_Open( E_GPA, 6, E_IO_QUASI );
  DrvGPIO_Open( E_GPA, 7, E_IO_QUASI );
}

//*****************延时子函数(12MHZ,1MS)********************//
void delay_ms(uint32_t count)
{   uint32_t i,j;
    for(i=count;i>0;i--)
    for(j=2395;j>0;j--);
}

//******************读802忙标志位BF*************************//
uint8_t read802()
{ uint8_t i;
   RS_Clr; RW_Set; E_Set;
delay_ms(1);
   i=DrvGPIO_GetBit(E_GPA,7);  //第一次读出的是LCD的高四位数据
   E_Clr; // E=0;
   return i;
}


//**************写指令到802A指令寄存器IR*******************//
void WriteIR802(uint8_t i){
  while(read802());//读802忙标志位BF
   
  RW_Clr; RS_Clr; E_Clr;
  DrvGPIO_SetPortBits(E_GPA, i);  // 第一次写入LCD的高四位数据
  E_Set;
  delay_ms(1);
  E_Clr;
  DrvGPIO_SetPortBits(E_GPA, i<<4);  //第二次写入LCD的低四位数据
  E_Set;
  delay_ms(1);
  E_Clr;
}
//****************写1字节数据到--DR**********************//
void WriteDR(uint8_t x){
    while(read802());//读802忙标志位BF
    RS_Set; RW_Clr; E_Clr;
    GPIOA->DOUT =x;         //第一次写入LCD的高四位数据
E_Set;
delay_ms(1);
E_Clr;
    GPIOA->DOUT =x<<4;      //第二次写入LCD的低四位数据
E_Set;
delay_ms(1);
E_Clr;  
}  
//*******************初始化802A*************************//
void init802(void){
   WriteIR802(0x28);//写指令:功能设置4位数据总线;显示2行;字符点阵字体5*8.
   WriteIR802(0x01);   //写指令:清除屏幕
   WriteIR802(0x06);   //写指令:输入方式设置AC自动加1.
   WriteIR802(0x0c);   //写指令:开显示
}

int main (void)      
{ UNLOCKREG();          //  芯片注册解锁
  SYSCLK->PWRCON.XTL12M_EN = 1;      //  设定12M外部晶振
  DrvSYS_Delay(5000);        //  等待时钟就绪
  GPIO_Configuration();
  init802();
  WriteIR802(0x80);  //设定写入第一行0x00地址 地址只有7位,最高位为特殊位
  WriteDR('U');
  WriteDR('N');
WriteDR('C');
WriteDR('1');
WriteDR('2');
WriteDR('0');
WriteDR('_');
WriteIR802(0xc0);  //设定写入第二行0x43地址 地址只有7位,最高位为特殊位
WriteDR('J');
WriteDR('H');
WriteDR('D');
WriteDR('8');
WriteDR('0');
WriteDR('2');
WriteDR('A');
  while(1);
}




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| hzy41y 发表于 2012-6-6 10:30 | 显示全部楼层
不会在网叶中加入“复制代码 :'(”
 楼主| hzy41y 发表于 2012-6-6 10:43 | 显示全部楼层
原来这样加入代码:lol
  1. //***基于助学板采用PA口4条数据线实现对JHD802A的简单驱动***//
  2. //作者:hzy41y
  3. //最后更新日期2012年06月06日10:10
  4. /* NUC120 JHD802A
  5. NUC120              JHD802A
  6. --------|               |-----------|
  7.            |        4     |          VDD|-------+5V
  8.    GPA7|-----------| DB7         |
  9.    GPA6|-----------| DB6         |   
  10.    GPA5|-----------| DB5         |
  11.    GPA4|-----------| DB4         |
  12.            |               |          VSS|________0V
  13.     PC14|-----------| RS           |     |
  14.     PC15|-----------| R/W         |     |
  15.      PC6 |-----------| E             |     |
  16.            |                |          VEE|___|
  17. --------|                |-----------|
  18. JHD802A接口
  19. 1 2 3 4 5 6 7 8 9 10 11 12 13 14
  20. VSS VCC VEE RS R/W E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7

  21. */

  22. #include <stdio.h>
  23. #include "NUC1xx.h"
  24. #include "DrvGPIO.h"
  25. #include "DrvSYS.h"

  26. #define RS_Set DrvGPIO_SetBit(E_GPC,14)
  27. #define RW_Set DrvGPIO_SetBit(E_GPC,15)
  28. #define E_Set DrvGPIO_SetBit(E_GPC,6)
  29. #define RS_Clr DrvGPIO_ClrBit(E_GPC,14)
  30. #define RW_Clr DrvGPIO_ClrBit(E_GPC,15)
  31. #define E_Clr DrvGPIO_ClrBit(E_GPC,6)
  32. #define LED_Clr DrvGPIO_ClrBit(E_GPA,2)
  33. #define LED_Set DrvGPIO_SetBit(E_GPA,2)

  34. void GPIO_Configuration(void)
  35. { DrvGPIO_Open( E_GPC, 6, E_IO_QUASI ); //标准数字双向口
  36. DrvGPIO_Open( E_GPC, 14, E_IO_QUASI );
  37. DrvGPIO_Open( E_GPC, 15, E_IO_QUASI );
  38. DrvGPIO_Open( E_GPA, 2, E_IO_OUTPUT );
  39. DrvGPIO_Open( E_GPA, 4, E_IO_QUASI );
  40. DrvGPIO_Open( E_GPA, 5, E_IO_QUASI );
  41. DrvGPIO_Open( E_GPA, 6, E_IO_QUASI );
  42. DrvGPIO_Open( E_GPA, 7, E_IO_QUASI );
  43. }

  44. //*****************延时子函数(12MHZ,1MS)********************//
  45. void delay_ms(uint32_t count)
  46. { uint32_t i,j;
  47. for(i=count;i>0;i--)
  48. for(j=2395;j>0;j--);
  49. }

  50. //******************读802忙标志位BF*************************//
  51. uint8_t read802()
  52. { uint8_t i;
  53. RS_Clr; RW_Set; E_Set;
  54. delay_ms(1);
  55. i=DrvGPIO_GetBit(E_GPA,7); //第一次读出的是LCD的高四位数据
  56. E_Clr; // E=0;
  57. return i;
  58. }


  59. //**************写指令到802A指令寄存器IR*******************//
  60. void WriteIR802(uint8_t i){
  61. while(read802());//读802忙标志位BF

  62. RW_Clr; RS_Clr; E_Clr;
  63. DrvGPIO_SetPortBits(E_GPA, i); // 第一次写入LCD的高四位数据
  64. E_Set;
  65. delay_ms(1);
  66. E_Clr;
  67. DrvGPIO_SetPortBits(E_GPA, i<<4); //第二次写入LCD的低四位数据
  68. E_Set;
  69. delay_ms(1);
  70. E_Clr;
  71. }

  72. //****************写1字节数据到--DR**********************//
  73. void WriteDR(uint8_t x){
  74. while(read802());//读802忙标志位BF
  75. RS_Set; RW_Clr; E_Clr;
  76. GPIOA->DOUT =x; //第一次写入LCD的高四位数据
  77. E_Set;
  78. delay_ms(1);
  79. E_Clr;
  80. GPIOA->DOUT =x<<4; //第二次写入LCD的低四位数据
  81. E_Set;
  82. delay_ms(1);
  83. E_Clr;
  84. }

  85. //*******************初始化802A*************************//
  86. void init802(void){
  87. WriteIR802(0x28);//写指令:功能设置4位数据总线;显示2行;字符点阵字体5*8.
  88. WriteIR802(0x01); //写指令:清除屏幕
  89. WriteIR802(0x06); //写指令:输入方式设置AC自动加1.
  90. WriteIR802(0x0c); //写指令:开显示
  91. }


  92. int main (void)
  93. { UNLOCKREG(); // 芯片注册解锁
  94. SYSCLK->PWRCON.XTL12M_EN = 1; // 设定12M外部晶振
  95. DrvSYS_Delay(5000); // 等待时钟就绪
  96. GPIO_Configuration();
  97. init802();
  98. WriteIR802(0x80); //设定写入第一行0x00地址 地址只有7位,最高位为特殊位
  99. WriteDR('U');
  100. WriteDR('N');
  101. WriteDR('C');
  102. WriteDR('1');
  103. WriteDR('2');
  104. WriteDR('0');
  105. WriteDR('_');

  106. WriteIR802(0xc0); //设定写入第二行0x43地址 地址只有7位,最高位为特殊位
  107. WriteDR('J');
  108. WriteDR('H');
  109. WriteDR('D');
  110. WriteDR('8');
  111. WriteDR('0');
  112. WriteDR('2');
  113. WriteDR('A');
  114. while(1);
  115. }
jxc827 发表于 2012-6-6 20:35 | 显示全部楼层
怎么加的?我也不会呢,呵呵
hotpower 发表于 2012-6-8 07:43 | 显示全部楼层
收到助学板了?
hotpower 发表于 2012-6-8 11:19 | 显示全部楼层
继续努力,拿回订金
 楼主| hzy41y 发表于 2012-6-8 15:31 | 显示全部楼层
5月27日就收到了,在 《2012年度新唐Cortex-M0助学开发套件有约束条件赠送申报贴》的第94楼已上艳照了谢谢菜农。
qxc16b 发表于 2012-6-15 09:50 | 显示全部楼层
LCD1602可用四位数据驱动吗?
xwj 发表于 2012-6-15 09:53 | 显示全部楼层
当然可以
hotpower 发表于 2012-6-15 11:26 | 显示全部楼层
今晚返还订金
 楼主| hzy41y 发表于 2012-7-3 11:14 | 显示全部楼层
自顶一吓
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

75

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部