找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2279|回复: 6
收起左侧

LCD12864的底层驱动程序解读,读不懂,哪位大佬帮帮忙

[复制链接]
ID:326864 发表于 2020-4-15 17:01 | 显示全部楼层 |阅读模式
10黑币
  1. #ifndef _LCD12864_H_
  2. #define _LCD12864_H_
  3. #define uchar unsigned char  //宏定义
  4. #define uint unsigned int

  5. sbit LCD12864_CS=P2^5;                //串口时为CS                                         //12864控制I/O口
  6. sbit LCD12864_SID=P2^6;           //串口为SID
  7. sbit LCD12864_CLK=P2^7;           //串口为时钟CLK


  8. /**********************************************************
  9. #:函数名:SendWrite(uchar dat)
  10. #:函数功能:发送8位数据给LCD12864
  11. #:函数参数:dat位发送的数据变量
  12. ***********************************************************/
  13. void SendWrite(uchar dat)
  14. {
  15.         uchar i;
  16.         for(i=0;i<8;i++)
  17.         {
  18.                 LCD12864_CLK=0;
  19.                 dat=dat<<1;
  20.                 LCD12864_SID=CY;
  21.                 LCD12864_CLK=1;
  22.                 LCD12864_CLK=0;
  23.         }
  24. }

  25. /**********************************************************
  26. #:函数名:uchar LCD12864_Read(void)
  27. #:函数功能:读取LCD12864中的数据
  28. #:函数参数:函数返回读取的数据内容
  29. ***********************************************************/
  30. uchar LCD12864_Read(void)
  31. {
  32.         uchar i,dat1,dat2;
  33.         dat1=dat2=0;
  34.         for(i=0;i<8;i++)
  35.         {
  36.                 dat1=dat1<<1;
  37.                 LCD12864_CLK = 0;
  38.                 LCD12864_CLK = 1;               
  39.                 LCD12864_CLK = 0;
  40.                 if(LCD12864_SID) dat1++;
  41.         }
  42.         for(i=0;i<8;i++)
  43.         {
  44.                 dat2=dat2<<1;
  45.                 LCD12864_CLK = 0;
  46.                 LCD12864_CLK = 1;
  47.                 LCD12864_CLK = 0;
  48.                 if(LCD12864_SID) dat2++;
  49.         }
  50.         return ((0xf0&dat1)+(0x0f&dat2));
  51. }
  52. /**********************************************************
  53. #:函数名:LCD12864_Busy( void )
  54. #:函数功能:判忙函数
  55. #:函数参数:无
  56. ***********************************************************/
  57. void LCD12864_Busy( void )
  58. {
  59.         do SendWrite(0xfc);     //11111,RW(1),RS(0),0
  60.         while(0x80&LCD12864_Read());
  61. }

  62. /**********************************************************
  63. #:函数名:void LCD12864_write(bit cmd,uchar dat)
  64. #:函数功能:向屏发送命令/数据 带发送数据
  65. #:函数参数:cmd标志发送数据、命令,0为命令,1位数据;   dat 位数据内容
  66. ***********************************************************/
  67. void LCD12864_write(bit cmd,uchar dat)  
  68. {
  69.         LCD12864_CS = 1;
  70.         LCD12864_Busy();
  71.         if(cmd==0) SendWrite(0xf8);
  72.         else SendWrite(0xfa);          //11111,RW(0),RS(1),0
  73.         SendWrite(0xf0&dat);
  74.         SendWrite(0xf0&dat<<4);
  75.         LCD12864_CS = 0;
  76. }
  77. /**********************************************************
  78. #:函数名:void LCD12864_writebyte(uchar *prointer)
  79. #:函数功能:指针发送显示数据
  80. #:函数参数:prointer位指针内容
  81. ***********************************************************/
  82. void LCD12864_writebyte(uchar *prointer)                       
  83. {
  84.     while(*prointer!='\0')
  85.     {
  86.         LCD12864_write(1,*prointer);
  87.         prointer++;
  88.     }
  89. }

  90. /******************************************************************
  91.                          lcd初始化函数
  92. *******************************************************************/
  93. void LCD12864_init(void)
  94. {
  95.      LCD12864_write(0,0x30);
  96.      LCD12864_write(0,0x03);
  97.      LCD12864_write(0,0x0c);
  98.      LCD12864_write(0,0x01);
  99.      LCD12864_write(0,0x06);
  100. }

  101. /**********************************************************
  102. #:函数名:void LCD12864_pos(uchar x,y)
  103. #:函数功能:设置屏幕显示的位置
  104. #:函数参数:X,Y,为显示的坐标   X位行数据,Y位列数据
  105. ***********************************************************/
  106. void LCD12864_pos(uchar x,y)
  107. {
  108.         switch(x)
  109.         {
  110.                 case 0:
  111.                         x=0x80;break;
  112.                 case 1:
  113.                         x=0x90;break;
  114.                 case 2:
  115.                         x=0x88;break;
  116.                 case 3:
  117.                         x=0x98;break;
  118.                 default:
  119.                         x=0x80;
  120.         }
  121.         y=y&0x07;
  122.         LCD12864_write(0,0x30);
  123.         LCD12864_write(0,y+x);
  124.         LCD12864_write(0,y+x);

  125. }
  126. /**********************************************************
  127. #:函数名:void LCD12864_Qing( void )
  128. #:函数功能:清除屏幕显示的你内容
  129. #:函数参数:X,Y,为显示的坐标   X位行数据,Y位列数据
  130. ***********************************************************/
  131. void LCD12864_Qing( void )
  132. {
  133.         unsigned char i;
  134.         LCD12864_write(0,0x30);
  135.         LCD12864_write(0,0x80);
  136.         for(i=0;i<64;i++)
  137.         LCD12864_write(1,0x20);
  138.         LCD12864_pos(0,0);            
  139. }

  140. #endif
复制代码
怎么个意思,啊

最佳答案

查看完整内容

1、两个 for(i=0;i
回复

使用道具 举报

ID:282850 发表于 2020-4-15 17:01 | 显示全部楼层
1、两个 for(i=0;i<8;i++): 从return ((0xf0&dat1)+(0x0f&dat2));看dat1是高4位,dat2是低4位有效,返回还是uchar,原则上一个 for(i=0;i<8;i++)就可以的,如果程序用不了,建议改成一个for。另外要看芯片手册,大部分一个for。
2、clk还要先低后高再低:串行的时序要求,时钟上升沿读、写。
3、y=y&0x07;是取低三位,0x07是b0000 0111。
4、LCD12864_write(0,y+x);0是指令,1是数据,#:函数参数:cmd标志发送数据、命令,0为命令,1位数据; LCD12864_write函数定义已说明清楚了 。
回复

使用道具 举报

ID:584814 发表于 2020-4-15 19:04 | 显示全部楼层
如果是哪一句不清楚可以直说,如果全部不清楚就报名培训。
回复

使用道具 举报

ID:326864 发表于 2020-4-16 14:49 | 显示全部楼层
man1234567 发表于 2020-4-15 19:04
如果是哪一句不清楚可以直说,如果全部不清楚就报名培训。

你好,前面的读数据的时候为什么要有两个 for(i=0;i<8;i++),clk还要先低后高再低?LCD12864_write(0,0x03);这个指令好像没有,y=y&0x07;这个是取低三位吗? LCD12864_write(0,y+x);这个是什么意思,还有括号里前面的0代表什么意思,如果写成1的话是什么意思。
回复

使用道具 举报

ID:311846 发表于 2020-4-17 09:35 | 显示全部楼层
我感觉你是全部看不懂,你可以先去看看显示屏的手册,然后研究下他的通信协议,结合单片机,慢慢熬吧!
回复

使用道具 举报

ID:326864 发表于 2020-4-17 12:54 | 显示全部楼层
f556 发表于 2020-4-15 17:01
1、两个 for(i=0;i

谢谢大佬
回复

使用道具 举报

ID:326864 发表于 2020-4-17 12:55 | 显示全部楼层
权威人物 发表于 2020-4-17 09:35
我感觉你是全部看不懂,你可以先去看看显示屏的手册,然后研究下他的通信协议,结合单片机,慢慢熬吧!

主要是没接触过过12864
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表