/*****************************************************************************************************************************************
*Author:JYW
*Time:2019_02_12
*Describe:学而习之
**************************************************************************************************************************************/
时序,根据字面意思就是时间和顺序
s ms us ns 之间都是1000的倍数。
以一般的51单片机的11059200来说,时钟周期就是其倒数,就是
单位是ns,一个机器周期就是
大约就是1ms;
在MDK下的89C51,时钟配置为11059200:
unsigned char temp;
计算得到是2.17us,即执行一行的时间大约是2us,以unsigned char 的temp测试了一下一行代码执行所需要的时间;
#include<reg52.h>
#define Lcd1602_DB P0
sbit Lcd1602_RS = P1^0;
sbit Lcd1602_RW = P1^1;
sbit Lcd1602_E = P1^5;
/*等待1602准备好即STA7为0*/
void LcdYorN()
{
unsigned char buf;
Lcd1602_DB = 0x00;
Lcd1602_RS = 0;
Lcd1602_RW = 1;
do{
Lcd1602_E = 1;
buf = Lcd1602_DB;
Lcd1602_E = 0;
}while(buf & 0x80);
}//对1602进行检测确保STA7为0;
//向1602液晶中写入命令
void LcdWriteCmd(unsigned char cmd)
{
LcdYorN();
Lcd1602_RS = 0;
Lcd1602_RW= 0;
Lcd1602_DB= cmd;
Lcd1602_E= 1;//高脉冲
Lcd1602_E= 0;
}
//向1602中写入数据
void LcdWriteDat(unsigned char dat)
{
LcdYorN();
Lcd1602_RS = 1;
Lcd1602_RW= 0;
Lcd1602_DB= dat;
Lcd1602_E=1;
Lcd1602_E=0;
}
//设置显示的位置((一个位置)(x,y)对应坐标
void LcdStartAdr(unsigned char x,unsigned char y)
{
unsigned char addr;
if(y == 0)
{ addr = 0x00 + x;}
else
{ addr = 0x40+x;}
LcdWriteCmd(addr | 0x80);
//设置地址;
}
//(x,y)指的是显示的开始位置
//str字符串指针,len显示的长度
void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str, unsigned char len)
{
LcdStartAdr(x, y);
while(len--)
{
LcdWriteDat(*str++);
//先取数值然后地址加1;
}
}
//1602初始化
void LcdInit()
{
LcdWriteCmd(0x38);
LcdWriteCmd(0x0C);//开显示关光标
LcdWriteCmd(0x06);//文字不动地址加1
LcdWriteCmd(0x01);//清屏
}
*str++:指的是首先取数值,然后地址加1;
16进制的字符码:
数据指针的设置,也就是说当写的代码显示第一行的话,但是液晶第一行的16个显示的位置还有剩余,当再进行显示并且
要在第二行显示时,要重新设置数据地址指针。
下面的代码就是分两行显示;
整屏移动指令:
每执行一次指令就仅仅只整屏移动1个字符;
整屏左移16次;