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