drive_1602.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "drive_1602.h"
  2. #include <stdarg.h> // 标准头文件
  3. #include "stdio.h"
  4. #include "string.h"
  5. #define lcddata P1
  6. sbit rs=P2^7;
  7. sbit en=P2^6;
  8. void delay_1ms(unsigned int xms)//延时函数,有参函数
  9. {
  10. unsigned char i, j;
  11. while(xms--)
  12. {
  13. _nop_();
  14. _nop_();
  15. _nop_();
  16. i = 11;
  17. j = 190;
  18. do
  19. {
  20. while (--j);
  21. } while (--i);
  22. }
  23. }
  24. //****液晶写入指令函数****//
  25. void Write_1602_com(unsigned char com)
  26. {
  27. // rw=0;
  28. rs=0;//数据/指令选择置为指令
  29. lcddata=com;//送入数据
  30. delay_1ms(1);
  31. en=1;//拉高使能端,为制造有效的下降沿做准备
  32. delay_1ms(1);
  33. en=0;//en由高变低,产生下降沿,液晶执行命令
  34. }
  35. //***液晶写入数据函数****//
  36. void Write_1602_date(unsigned char date)
  37. {
  38. // rw=0;
  39. rs=1;//数据/指令选择置为数据
  40. lcddata=date;//送入数据
  41. delay_1ms(1);
  42. en=1; //en置高电平,为制造下降沿做准备
  43. delay_1ms(1);
  44. en=0; //en由高变低,产生下降沿,液晶执行命令
  45. }
  46. /************ 写字符数据函数 *****************
  47. //功能:在lcd1602指定位置上显示字符;
  48. //参数
  49. //p: 指向待显示数据指针
  50. //x: X坐标
  51. //y: Y坐标
  52. //************ *********** *****************/
  53. void WriteLcd1602_String(char x,char y,char *p)
  54. {
  55. char i=0;
  56. if(y == 0)
  57. {
  58. Write_1602_com(0x80 + x);
  59. }
  60. else
  61. {
  62. Write_1602_com(0xC0 + x);
  63. }
  64. while(*p != 0)
  65. {
  66. Write_1602_date(*p);
  67. p++;
  68. }
  69. }
  70. //***液晶初始化函数****//
  71. void lcd1602_init()
  72. {
  73. Write_1602_com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
  74. delay_1ms(1);
  75. Write_1602_com(0x0c);//开显示不显示光标
  76. delay_1ms(1);
  77. Write_1602_com(0x06);//整屏不移动,光标自动右移
  78. delay_1ms(1);
  79. Write_1602_com(0x01);//清显示
  80. delay_1ms(1);
  81. Write_1602_com(0x80);
  82. delay_1ms(1);
  83. }
  84. void LCD1602_Write_address(unsigned char x,unsigned char y)
  85. {
  86. x&=0x0f; //列地址限制在0-15间
  87. y&=0x01; //行地址限制在0-1间
  88. if(y==0) //如果是第一行
  89. Write_1602_com(x|0x80); //将列地址写入
  90. else //如果是第二行
  91. Write_1602_com((x+0x40)|0x80); //将列地址写入
  92. }
  93. void LCD1602_Disp(unsigned char x,unsigned char y,unsigned char buf)
  94. {
  95. LCD1602_Write_address(x,y); //先将地址信息写入
  96. Write_1602_date(buf); //再写入要显示的数据
  97. }