drive_12864.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #include "drive_12864.h"
  2. #include <stdarg.h> // 标准头文件
  3. #include "stdio.h"
  4. #include "delay.h"
  5. #define L128_RW GPIO_Pin_8 //
  6. #define L128_EN GPIO_Pin_9 //
  7. #define SET_EN GPIO_SetBits(GPIOA, L128_EN);
  8. #define CLR_EN GPIO_ResetBits(GPIOA, L128_EN);
  9. #define SET_RW GPIO_SetBits(GPIOA, L128_RW);
  10. #define CLR_RW GPIO_ResetBits(GPIOA, L128_RW);
  11. void LCD128GPIO_Init(void)
  12. {
  13. GPIO_InitTypeDef GPIO_InitStructure;
  14. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//配置时钟
  15. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
  16. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  17. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  18. GPIO_Init(GPIOA,&GPIO_InitStructure);
  19. }
  20. void Senbyte(unsigned char command)//向12864串行发送1byte数据
  21. {
  22. unsigned char i;
  23. for(i=0;i<8;i++)
  24. {
  25. if((command<<i)&0x80)
  26. {
  27. SET_RW;
  28. }
  29. else
  30. {
  31. CLR_RW;
  32. }
  33. CLR_EN;//sclk =0
  34. // delay_ms(5);
  35. SET_EN;//sclk=1
  36. }
  37. }
  38. void Write_lcd_com(unsigned char command)//向12864写指令函数
  39. {
  40. // SET_RW;
  41. Senbyte(0xf8);
  42. Senbyte(command&0xf0);
  43. Senbyte((command<<4)&0xF0);
  44. delay_us(100);
  45. }
  46. void Write_lcd_date(unsigned char date)//向12864写数据函数
  47. {
  48. // SET_RW;
  49. Senbyte(0xfa);
  50. Senbyte(date & 0xf0);
  51. Senbyte((date<<4) & 0xf0);
  52. delay_us(100);
  53. }
  54. void lcd128_Init(void)//12864初始化函数
  55. {
  56. LCD128GPIO_Init();
  57. delay_ms(100);
  58. Write_lcd_com(0x30);//设置8位数据口 基本指令模式
  59. delay_us(100);
  60. Write_lcd_com(0xc0);//整体显示开 游标关 反白关
  61. delay_us(100);
  62. Write_lcd_com(0x30); //设置8位数据接口,基本指令模式
  63. Write_lcd_com(0x20); //清DDRAM
  64. Write_lcd_com(0x06); //游标及显示右移一位
  65. Write_lcd_com(0x0c); //整体显示开,游标关,反白关
  66. Write_lcd_com(0x01); //写入空格清屏
  67. Write_lcd_com(0x80); //设置首次显示位置
  68. }
  69. /************ 写字符数据函数 *****************
  70. 功能:在带字库12864指定位置上显示字符;
  71. 参数
  72. p: 指向待显示数据指针
  73. x: X坐标
  74. y: Y坐标
  75. ************ *********** *****************/
  76. void WriteLcd128_String(char x,char y,char *p)
  77. {
  78. switch(y) // 设置显示地址
  79. {
  80. case 0:Write_lcd_com(0x80 + x); // 第一行
  81. break;
  82. case 1:Write_lcd_com(0x90 + x); // 第二行
  83. break;
  84. case 2:Write_lcd_com(0x88 + x); // 第三行
  85. break;
  86. case 3:Write_lcd_com(0x98 + x); // 第四行
  87. break;
  88. }
  89. while(*p != 0) // 循环显示字符,直到检测到结束字符
  90. {
  91. Write_lcd_date(*p);
  92. // delay(100);
  93. p++;
  94. }
  95. }
  96. void L128printf(char x,char y,char *p,...)
  97. {
  98. char LcdBuff[20];
  99. va_list ap;
  100. va_start(ap,p);
  101. vsprintf(LcdBuff,p,ap);
  102. va_end(ap);
  103. WriteLcd128_String(x,y,LcdBuff);
  104. }