[新手园地] 傻瓜菜鸟第十帖-LCD显示字母

[复制链接]
2824|2
 楼主| weshiluwei6 发表于 2011-10-29 23:39 | 显示全部楼层 |阅读模式
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /* */
  3. /* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved. */
  4. /* */
  5. /*---------------------------------------------------------------------------------------------------------*/
  6. #include <stdio.h>
  7. #include "NUC1xx.h"
  8. #include "NUC1xxM051Seriescfg.h"
  9. #include "Driver\DrvGPIO.h"
  10. #include "Driver\DrvSYS.h"



  11. #define LCD_POWER_ON DrvGPIO_ClrBit(E_GPE,5); //接LCD1602 VSSPin,需要强制输出0,做GND用
  12. #define LCD_VO_Adj DrvGPIO_ClrBit(E_GPC,14); //对比度调节

  13. char table1[]={"HOT250"};
  14. uint8_t i;
  15. /*************************************************************************************
  16. ** Function name: DelayMs
  17. ** Descriptions: 延时1ms子程序
  18. ** input parameters: 无
  19. ** output parameters: 无
  20. ** Returned value: 无
  21. *************************************************************************************/
  22. void DelayMs(uint32_t z)
  23. {
  24. uint32_t i,j;
  25. for(i=z;i>0;i--)
  26. for(j=2000;j>0;j--);

  27. }
  28. void delay_nus(unsigned int t)
  29. {
  30. unsigned int i=0;
  31. while(t--)
  32. {
  33. for(i=0;i<1;i++);
  34. }
  35. }

  36. void delay_nms(unsigned char n)
  37. {
  38. unsigned char i,j;
  39. unsigned int k;
  40. i=12; //主频多少i就多少
  41. //延时用这个很无奈,不同的系统有不同的方法
  42. //好在只有初始化时使用,对系统影响不大
  43. for(;i>0;i--)
  44. {
  45. for(j=0;j<n;j++)
  46. {
  47. for(k=0;k<980;k++);
  48. }
  49. }
  50. }
  51. void Init_GPIO(void)
  52. {
  53. /* D0~D7----PA0-PA7 */
  54. DrvGPIO_Open( E_GPA, 2, E_IO_OUTPUT );
  55. DrvGPIO_Open( E_GPA, 3, E_IO_OUTPUT );
  56. DrvGPIO_Open( E_GPA, 4, E_IO_OUTPUT );
  57. DrvGPIO_Open( E_GPA, 5,E_IO_OUTPUT);
  58. DrvGPIO_Open( E_GPA, 6, E_IO_OUTPUT);
  59. DrvGPIO_Open( E_GPA, 7, E_IO_OUTPUT );
  60. DrvGPIO_Open( E_GPA, 8, E_IO_OUTPUT );
  61. DrvGPIO_Open( E_GPA, 9, E_IO_OUTPUT );

  62. DrvGPIO_Open( E_GPC, 15, E_IO_OUTPUT); //RS
  63. DrvGPIO_Open( E_GPC, 6, E_IO_OUTPUT); //RW
  64. DrvGPIO_Open( E_GPC, 7, E_IO_OUTPUT ); //EN


  65. }



  66. void Init_System(void)
  67. {
  68. /* Unlock the locked registers before access */
  69. UNLOCKREG(x); //寄存器锁定键地址寄存器(RegLockAddr) :有些系统控制寄存器需要被保护起来,以防止误操作而影响芯片运行,
  70. //这些寄存器在上电复位到用户解锁定之前是锁定的。用户可以连续依次写入“59h”, “16h” “88h”到0x5000_0100解锁定.
  71. /* Enable the 12MHz oscillator oscillation */
  72. DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1); //SYSCLK->PWRCON.XTL12M_EN = 1;

  73. /* Waiting for 12M Xtal stable */
  74. //while (DrvSYS_GetChipClockSourceStatus(E_SYS_XTL12M) != 1); //SYSCLK->CLKSTATUS.XTL12M_STB
  75. /*eClkSrc - [in] E_SYS_XTL12M / E_SYS_XTL32K / E_SYS_OSC22M / E_SYS_OSC10K / E_SYS_PLL */
  76. // Note: Only some of NuMicro NUC100 Series support this function.

  77. DrvSYS_Delay(5000);
  78. LOCKREG(x);
  79. //向“0x5000_0100”写入任何值,就可以重锁保护寄存器
  80. }

  81. void write_com(uint8_t com)
  82. {
  83. //ChkBusy();
  84. /*RS----PB2 写指令 拉低 */
  85. DrvGPIO_ClrBit(E_GPC,15);


  86. //GPIOA->DOUT |= (com << 2);

  87. //DelayMs(1);
  88. delay_nms(1);
  89. DrvGPIO_SetPortBits(E_GPA,com<<2);
  90. /* EN---PB3 */
  91. DrvGPIO_SetBit(E_GPC,7);
  92. // DelayMs(4);

  93. delay_nms(1);
  94. DrvGPIO_ClrBit(E_GPC,7);
  95. //DelayMs(6);
  96. }

  97. void write_dat(uint8_t dat)
  98. {
  99. // ChkBusy();

  100. /*RS----PB14 写指令 拉高 */
  101. DrvGPIO_SetBit(E_GPC,15);

  102. // DrvGPIO_ClrBit(E_GPB,13);
  103. // delay_nus(2);
  104. //DrvGPIO_SetPortBits(E_GPA,dat<<2);
  105. //GPIOA->DOUT |= (dat<<2);

  106. //DelayMs(1);
  107. delay_nms(1);
  108. GPIOAs.DOUT.Regs = (dat << 2);
  109. /* EN---PB12 */
  110. DrvGPIO_SetBit(E_GPC,7);
  111. delay_nus(2);
  112. //DelayMs(4);
  113. DrvGPIO_ClrBit(E_GPC,7);
  114. //DelayMs(5);
  115. //DrvGPIO_ClrBit(E_GPB,14);
  116. }


  117. /*************************************************************************************
  118. ** Function name: Init_LCD
  119. ** Descriptions: LCD初始化程序
  120. ** input parameters: 无
  121. ** output parameters: 无
  122. ** 介绍 : RS----PB14
  123. RW----PB13
  124. EN----PB12
  125. D0~D7----PA0-PA7
  126. *************************************************************************************/

  127. void Init_LCD(void)
  128. {
  129. /* 只写数据 所以RW拉低*/
  130. DrvGPIO_ClrBit(E_GPC,6);
  131. //DelayMs(1);
  132. write_com(0x01);
  133. write_com(0x38);
  134. //DelayMs(5);

  135. write_com(0x0f); //开显示,显示光标,光标闪烁
  136. write_com(0x06);//当写一个字符后地址指针+1;且光标加1,当写一个字符整屏不移动
  137. DelayMs(10);
  138. }


  139. /*************************************************************************************
  140. ** Function name: main
  141. ** Descriptions: LED2跟随LED1的亮灭而灭亮测试程序
  142. ** 现 象:下载代码,运行程序,则LED1亮LED2灭 LED1灭LED2亮循环反复
  143. ** input parameters: 无
  144. ** output parameters: 无
  145. ** Returned value: 无
  146. *************************************************************************************/
  147. int main (void)
  148. {
  149. Init_System();
  150. Init_GPIO();
  151. Init_LCD();
  152. LCD_POWER_ON;
  153. LCD_VO_Adj;

  154. write_com(0x80+0x14);
  155. for(i=0;i<10;i++)
  156. {
  157. write_dat(table1[i]);
  158. write_com(0x18);
  159. DelayMs(400);
  160. }
  161. while(1);
  162. }


今天装了大叔的HOTISP新版本 很给力啊 不错不错啊



实现现象



显示不是很清晰  一是手机像素不高  二是 因为没有使用PWM调背光 或者用电位器调 而是直接拉低的 所以显示不是很清晰

本帖子中包含更多资源

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

×
plc_avr 发表于 2011-10-30 17:56 | 显示全部楼层
顶,水王加油!对比度太高了,呵呵。
 楼主| weshiluwei6 发表于 2011-10-30 20:20 | 显示全部楼层
这种是对比度太高啊  因为么有用电位器  嘿嘿 谢谢火哥 2# plc_avr
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:250水王,种菜浇水,要输就输给理想,要败就败给高手。不可浮躁

7

主题

1126

帖子

1

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