OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5176|回复: 4

关于12864串行显示为什么要加协议

[复制链接]

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-5-14
在线时间
0 小时
发表于 2013-5-16 17:34:38 | 显示全部楼层 |阅读模式

之前看书上的有关12864的程序,是在程序开始前用数组定义的要显示的内容,没有加下面的代码。可是今天看51与12864串行显示的程序是加了下面几行代码。我看了12864的资料,讲了一些串口的知识,是4位4位的接收。可是我还是不很明白为什么要加这几行代码?不是很懂,求解?
/********************************************************************
* 名称 : sendbyte()
* 功能 : 按照液晶的串口通信协议,发送数据
* 输入 : zdata
* 输出 : 无
***********************************************************************/
void sendbyte(unsigned char zdata)
{
 unsigned int i;
 for(i=0; i<8; i++)
 {
  if((zdata << i) & 0x80)
  {
   SID = 1;
  }
  else
  {
   SID = 0;
  }
  SCLK = 0;
  SCLK = 1;
 }
}

/********************************************************************
* 名称 : write_com()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void write_com(unsigned char cmdcode)
{
 CS = 1;
 sendbyte(0xf8);
 sendbyte(cmdcode & 0xf0);
 sendbyte((cmdcode << 4) & 0xf0);
 delay(2);
}

/********************************************************************
* 名称 : write_data()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void write_data(unsigned char Dispdata)
{
 CS = 1;
 sendbyte(0xfa);
 sendbyte(Dispdata & 0xf0);
 sendbyte((Dispdata << 4) & 0xf0);
 delay(2);
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-5-16 18:31:10 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-5-14
在线时间
0 小时
 楼主| 发表于 2013-5-16 20:39:41 | 显示全部楼层
回复【2楼】xouou_53320:
---------------------------------
我不明白12864串行显示为什么要加这个协议。下面的代码是按照读写操作时序写的。为什么上面和下面的写指令(write_com)和写数据(write_data)两个函数不一样。还有就是上面的程序为什么要加一个void sendbyte(unsigned char zdata)函数

uchar code dis1[] = {"好的随后"};                       
uchar code dis2[] = {"的收费额是否发生的迪瑟尔"};             
uchar code dis3[] = {"发的发生的多少 "};              
uchar code dis4[] = {"gdsueyiuosf "};      
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
void lcd_pos(uchar X,uchar Y);  //确定显示位置
/*******************************************************************/
/*                                                                 */
/*  延时函数                                                       */
/*                                                                 */
/*******************************************************************/
void delay(int ms)
{……}  
/*******************************************************************/
/*                                                                 */
/*写指令数据到LCD                                                  */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
/*                                                                 */
/*******************************************************************/
void write_com(uchar com)
{                          
   
   delay(12);
    LCD_RS = 0;
    LCD_EN = 0;
    _nop_();
    _nop_(); 
    2 = com;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
delayNOP();
    LCD_EN = 0;  
}
/*******************************************************************/
/*                                                                 */
/*写显示数据到LCD                                                  */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
/*                                                                 */
/*******************************************************************/
void write_data(uchar data)
{                          
   delay(12);
    LCD_RS = 1;
   // LCD_RW = 0;
    LCD_EN = 0;
    2 = data;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0; 
}
/*******************************************************************/
/*                                                                 */
/*  LCD初始化设定                                                  */
/*                                                                 */
/*******************************************************************/
void lcd_init()

    delay(10);
    wtite_com(0x34);      //扩充指令操作
    delay(10);
   // write_com(0x30);      //基本指令操作
    //delay(5);
    write_com(0x0c);      //显示开,关光标
    delay(10);
    wtite_com(0x01);      //清除LCD的显示内容
    delay(120);
}
回复 支持 反对

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-5-16 20:54:24 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-5-14
在线时间
0 小时
 楼主| 发表于 2013-5-16 21:42:19 | 显示全部楼层
回复【4楼】xouou_53320:
---------------------------------
谢谢你了,你后面那句话提醒了我("并行串行能一样吗"),我将串行和并行弄混了,很感谢你了。我第一次发的是串行读写,第二次贴的代码是并行读写。弄混了。现在没问题了。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 11:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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