当前位置: 首页 > news >正文

做国外网站 国外人能看到吗怎样策划一个营销型网站

做国外网站 国外人能看到吗,怎样策划一个营销型网站,wordpress 描述字段,简单详细搭建网站教程51单片机控制1602LCD显示屏输出自定义字符二 1.概述 1602LCD除了内置的字符外还提供自定义字符功能,当内置的字符中没有我们想要输出的字符时,我们就可以自己创造字符让他显示,下面介绍1602如何创建自定义字符。 2.1602LCD创建字符原理 自…

51单片机控制1602LCD显示屏输出自定义字符二

1.概述

1602LCD除了内置的字符外还提供自定义字符功能,当内置的字符中没有我们想要输出的字符时,我们就可以自己创造字符让他显示,下面介绍1602如何创建自定义字符。

2.1602LCD创建字符原理

自定义字符涉及到三个存储器,弄清楚他们的作用后就可以自定义字符。下面详细介绍三个存储器对自定义字符产生的作用。

自定义字符输出原理
程序指定CGROM地址——>CGROM查找地址关联的CGRAM地址——>CGRAM查找该地对应的自定义字符——>输出到1602LCD屏幕。

CGROM

CGROM是1602内置字符的存储器,在里面固化了常用的字符,当我们输出字母数字字符时,1602芯片在CGROM中查找字符对应的地址,然后将该地址输出,在LCD显示字符。
假如我们输出的字符在CGROM中没有内置,这个时候我们可以自己定义需要输出的字符。CGROM为我我们预留了8个CGRAM位置,用来输出自定义的字符。也就是说我们最多可以存储8个自定义字符。
在这里插入图片描述

内置指令表

查看内置指令表CGRAM地址有6位,D0~D5六位是CGRAM存放自定义字符地址,D6为1所以它的起始地址是从0x40开始。
在这里插入图片描述

CGRAM地址表

D0~D5是如何存放自定义字符,就要看下面CGRAM地址表格。CGRAM Address将6位地址划分为两类,左边(5,4,3)为高三位对应字符存放地址。3位从001 ~ 111组合后刚好是8个地址存放8个自定义字符。

右边(2,1,0) 为低三位对应自定义字符的8个字节,表中CGRAM data是构造一个字符内容,该字符每行是8位一个字节,有8行组成,每个字符是需要8个在字节存储,因此地址中的低3位从001 ~ 111组合后刚好是8个地址存放一个字符。

例如我们构造一个大写的 字符,它的数组是

// 数组中每个元素代表字符的一行,一共8行。
//LCD显示的字符是5x8点阵,因此一行只有5位,0x1f:1表示第5位为1,f表示后面4位为1
unsigned char str[] = {0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,};

在这里插入图片描述

CGRAM 与CGROM对应关系

了解了CGRAM内置指令和地址表就可以构造自定义的字符存放到CGRAM中,下一步就是将CGRAM地址中的字符与CGROM地址进行关联,这样LCD就可以从CGROM地址中找到CGRAM地址,通过CGRAM地址找到字符。

1602LCD已经将CGRAM和CGROM地址进行的关联,他们的关系如下图。
例如 CGRAM第一个字符的位置是(0x40-0x47) 对应CGROM地址是0X00,当程序中输出内容的地址是0x00就会找到CGRAM第一个字符输出到1602LCD屏幕上。

在这里插入图片描述

3.1602LCD创建字符实例

下面的实例中创建了LCDWriteCGRAM函数,实现创建自定义字符功能。

  • 首先设置自定义字符存放在CGRAM的位置:LCD1602_WriteCMD(0x40);
  • 将自定义字符内容存入CGRAM:for(i=0;i<8;i++){LCD1602_WriteData(str[i]);}
  • 设置LCD显示字符位置 :LCD1602_WriteCMD(0x80| 0x05);
  • 指定输出字符的CGROM地址:LCD1602_WriteData(0x00);
unsigned char code str[] = {0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00};
void LCDWriteCGRAM(){//构造自定义字符unsigned char i;//自定义字符存放在CGRAM的第一个位置0x40-0x47LCD1602_WriteCMD(0x40);//存放自定义字符内容for(i=0;i<8;i++){LCD1602_WriteData(str[i]);}//显示字符LCD1602_WriteCMD(0x80| 0x05);//CGRAM第一个位置对应CGROM的0x00地址LCD1602_WriteData(0x00);}
完整代码
#include <STC12C2052AD.H>
typedef unsigned char uint8;
// 定义引脚
#define	LCD1602_DB0_DB7	P1			// 定义LCD1602的数据总线
sbit LCD1602_RS = P3 ^ 2;					// 定义LCD1602的RS控制线
sbit LCD1602_RW = P3 ^ 3;					// 定义LCD1602的RW控制线
sbit LCD1602_E  = P3 ^ 4;					// 定义LCD1602的E控制线
sbit LCD1602_Busy = P1 ^ 7;					// 定义LCD1602的测忙线(与LCD1602_DB0_DB7关联)// 定义指令集
/*设置显示模式*/
#define LCD_MODE_PIN8 0x38	// 8位数据线,两行显示
#define LCD_MODE_PIN4 0x28	// 4位数据线,两个显示
#define LCD_SCREEN_CLR 0x01	// 清屏
#define LCD_CURSOR_RET 0x02	// 光标复位
#define LCD_CURSOR_RIGHT 0x06	// 光标右移,显示不移动
#define LCD_CURSOR_LEFT 0x04	// 光标左移,显示不移动
#define LCD_DIS_MODE_LEFT 0x07 	// AC自增,画面左移
#define LCD_DIS_MODE_RIGHT 0X05	// AC自增,画面右移/*光标开关控制*/
#define LCD_DIS_CUR_BLK_ON 0x0f	// 显示开,光标开,光标闪烁
#define LCD_DIS_CUR_ON 0x0e	// 显示开,光标开,光标不闪烁
#define LCD_DIS_ON 0x0c	// 显示开,光标关,光标不闪烁
#define LCD_DIS_OFF 0x08	// 显示关,光标关,光标不闪烁/*光标、显示移动*/
#define LCD_CUR_MOVE_LEFT 0x10	// 光标左移
#define LCD_CUR_MOVE_RIGHT 0x14	// 光标右移
#define LCD_DIS_MOVE_LEFT 0x18	// 显示左移
#define LCD_DIS_MOVE_RIGHT 0x1c	// 显示右移/**
LCD1602忙碌状态不会接收新指令,因此在发送新指令前先检测是否忙碌。
判断LCD1602_Busy变量的值为低电平则为不忙。
*/
void LCD1602_TestBusy(void){LCD1602_DB0_DB7 = 0xff;	//将数据引脚置为高电平LCD1602_RS = 0; // 指令状态LCD1602_RW = 1;	// 读状态LCD1602_E = 1;	// 打开LCD显示器读指令while(LCD1602_Busy);	//读取LCD1602_Busy(P1.7)为低电平则结束循环LCD1602_E = 0;	// 关闭LCD显示器读指令
}/********************************************************************************************
// 写指令程序 //
// 向LCD1602写命令 本函数需要1个指令集的入口参数 //
/********************************************************************************************/
void LCD1602_WriteCMD(uint8 LCD1602_command) { LCD1602_TestBusy();//输入的命令赋值给LCD1602_DB0_DB7LCD1602_DB0_DB7 = LCD1602_command;LCD1602_RS = 0;LCD1602_RW = 0;LCD1602_E = 1;LCD1602_E = 0;
}
/********************************************************************************************
// 写数据程序 //
// 向LCD1602写数据 //
/********************************************************************************************/
void LCD1602_WriteData(uint8 LCD1602_data){ LCD1602_TestBusy();LCD1602_DB0_DB7 = LCD1602_data;LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_E = 1;LCD1602_E = 0;
}// LCD1602初始化
void LCD1602_Init(void){LCD1602_WriteCMD(LCD_MODE_PIN8);	// 显示模式设置:显示2行,每个字符为5*7个像素LCD1602_WriteCMD(LCD_DIS_ON); 	// 显示开及光标设置:显示开,光标关LCD1602_WriteCMD(LCD_CURSOR_RIGHT);		//显示光标移动设置:文字不动,光标右移LCD1602_WriteCMD(LCD_SCREEN_CLR);	// 显示清屏
}/*
输出字符串
x:数据地址
y:输出的行位置,第一行和第二行
str:输入字符串
*/
void print(uint8 x, uint8 y, uint8 *str){if(0 == y){LCD1602_WriteCMD(0x80 | x);}else{// 第二行起始位置是0x40LCD1602_WriteCMD(0x80 | (0x40+x));}while(*str != '\0'){LCD1602_WriteData(*str++);}}unsigned char code str[] = {0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00};
void LCDWriteCGRAM(){//构造自定义字符unsigned char i;//自定义字符存放在CGRAM的第一个位置0x40-0x47LCD1602_WriteCMD(0x40);//存放自定义字符内容for(i=0;i<8;i++){LCD1602_WriteData(str[i]);}//显示字符LCD1602_WriteCMD(0x80| 0x05);//CGRAM第一个位置对应CGROM的0x00地址LCD1602_WriteData(0x00);}void main(){unsigned char str1[] = "Beyound Self";LCD1602_Init();// 显示自定义内容LCDWriteCGRAM();print(0x00,1,str1);while(1);}
优化自定义字符函数

上面创建的LCDWriteCGRAM函数有缺陷,每当需要改变字符存放CGRAM位置或者修改LCD显示位置都需要修改这个函数,因此对他进行优化,将变化的内容提取为参数。成为一个工具函数,每次只需要传入参数就可以输出不同的字符。

LCDSetChar函数封装了自定义内容功能,该函数设计思想如下

  • 首先定义参数包含字符在LCD显示的位置,CGROM位置,字符内容
    • x:LCD显示字符位置
    • y:设置字符在LCD显示的行
    • pos:设置CGRAM位置
    • str:字符内容
  • 构造自定义字符包含两个部分
    • 设置字符在CGRAM存储位置
    • 设置字符内容
  • 设置字符显示
    • 设置字符在LCD哪个位置显示
    • 设置LCD显示哪个字符
/*
x:LCD显示字符位置
y:设置字符在LCD显示的行
pos:设置CGRAM位置
str:字符内容
*/
void LCDSetChar(unsigned char x, unsigned char y, unsigned char pos, unsigned char *str){unsigned char i;// 1.构造自定义字符,确定CGRAM位置for(i=0;i<8;i++){/*确定CGRAM位置0x40是CGRAM第一个起始位置,pos是设置第几个位置,一共8个。*/LCD1602_WriteCMD(0x40+pos*8+i );// 构造自定义字符LCD1602_WriteData(*(str+i));}// 2.显示字符// 设置字符在LCD显示的位置if(0 == y){LCD1602_WriteCMD(0x80 | x);}else{// 第二行起始位置是0x40LCD1602_WriteCMD(0x80 | (0x40+x));}// LCD显示字符内容,该地址是CGROMLCD1602_WriteData(0x00+pos);
}
完整代码
#include <STC12C2052AD.H>
typedef unsigned char uint8;
// 定义引脚
#define	LCD1602_DB0_DB7	P1			// 定义LCD1602的数据总线
sbit LCD1602_RS = P3 ^ 2;					// 定义LCD1602的RS控制线
sbit LCD1602_RW = P3 ^ 3;					// 定义LCD1602的RW控制线
sbit LCD1602_E  = P3 ^ 4;					// 定义LCD1602的E控制线
sbit LCD1602_Busy = P1 ^ 7;					// 定义LCD1602的测忙线(与LCD1602_DB0_DB7关联)// 定义指令集
/*设置显示模式*/
#define LCD_MODE_PIN8 0x38	// 8位数据线,两行显示
#define LCD_MODE_PIN4 0x28	// 4位数据线,两个显示
#define LCD_SCREEN_CLR 0x01	// 清屏
#define LCD_CURSOR_RET 0x02	// 光标复位
#define LCD_CURSOR_RIGHT 0x06	// 光标右移,显示不移动
#define LCD_CURSOR_LEFT 0x04	// 光标左移,显示不移动
#define LCD_DIS_MODE_LEFT 0x07 	// AC自增,画面左移
#define LCD_DIS_MODE_RIGHT 0X05	// AC自增,画面右移/*光标开关控制*/
#define LCD_DIS_CUR_BLK_ON 0x0f	// 显示开,光标开,光标闪烁
#define LCD_DIS_CUR_ON 0x0e	// 显示开,光标开,光标不闪烁
#define LCD_DIS_ON 0x0c	// 显示开,光标关,光标不闪烁
#define LCD_DIS_OFF 0x08	// 显示关,光标关,光标不闪烁/*光标、显示移动*/
#define LCD_CUR_MOVE_LEFT 0x10	// 光标左移
#define LCD_CUR_MOVE_RIGHT 0x14	// 光标右移
#define LCD_DIS_MOVE_LEFT 0x18	// 显示左移
#define LCD_DIS_MOVE_RIGHT 0x1c	// 显示右移/**
LCD1602忙碌状态不会接收新指令,因此在发送新指令前先检测是否忙碌。
判断LCD1602_Busy变量的值为低电平则为不忙。
*/
void LCD1602_TestBusy(void){LCD1602_DB0_DB7 = 0xff;	//将数据引脚置为高电平LCD1602_RS = 0; // 指令状态LCD1602_RW = 1;	// 读状态LCD1602_E = 1;	// 打开LCD显示器读指令while(LCD1602_Busy);	//读取LCD1602_Busy(P1.7)为低电平则结束循环LCD1602_E = 0;	// 关闭LCD显示器读指令
}/********************************************************************************************
// 写指令程序 //
// 向LCD1602写命令 本函数需要1个指令集的入口参数 //
/********************************************************************************************/
void LCD1602_WriteCMD(uint8 LCD1602_command) { LCD1602_TestBusy();//输入的命令赋值给LCD1602_DB0_DB7LCD1602_DB0_DB7 = LCD1602_command;LCD1602_RS = 0;LCD1602_RW = 0;LCD1602_E = 1;LCD1602_E = 0;
}
/********************************************************************************************
// 写数据程序 //
// 向LCD1602写数据 //
/********************************************************************************************/
void LCD1602_WriteData(uint8 LCD1602_data){ LCD1602_TestBusy();LCD1602_DB0_DB7 = LCD1602_data;LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_E = 1;LCD1602_E = 0;
}// LCD1602初始化
void LCD1602_Init(void){LCD1602_WriteCMD(LCD_MODE_PIN8);	// 显示模式设置:显示2行,每个字符为5*7个像素LCD1602_WriteCMD(LCD_DIS_ON); 	// 显示开及光标设置:显示开,光标关LCD1602_WriteCMD(LCD_CURSOR_RIGHT);		//显示光标移动设置:文字不动,光标右移LCD1602_WriteCMD(LCD_SCREEN_CLR);	// 显示清屏
}/*
输出字符串
x:数据地址
y:输出的行位置,第一行和第二行
str:输入字符串
*/
void print(uint8 x, uint8 y, uint8 *str){if(0 == y){LCD1602_WriteCMD(0x80 | x);}else{// 第二行起始位置是0x40LCD1602_WriteCMD(0x80 | (0x40+x));}while(*str != '\0'){LCD1602_WriteData(*str++);}}/*
x:LCD显示字符位置
y:设置字符在LCD显示的行
pos:设置CGRAM位置
str:字符内容
*/
void LCDSetChar(unsigned char x, unsigned char y, unsigned char pos, unsigned char *str){unsigned char i;// 1.构造自定义字符,确定CGRAM位置for(i=0;i<8;i++){/*确定CGRAM位置0x40是CGRAM第一个起始位置,pos是设置第几个位置,一共8个。*/LCD1602_WriteCMD(0x40+pos*8+i );// 构造自定义字符LCD1602_WriteData(*(str+i));}// 2.显示字符// 设置字符在LCD显示的位置if(0 == y){LCD1602_WriteCMD(0x80 | x);}else{// 第二行起始位置是0x40LCD1602_WriteCMD(0x80 | (0x40+x));}// LCD显示字符内容,该地址是CGROMLCD1602_WriteData(0x00+pos);
}void main(){unsigned char str1[] = "Beyound Self";unsigned char code c1[] = {0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00};LCD1602_Init();// 显示自定义内容LCDSetChar(3,0,0,c1);print(0x00,1,str1);while(1);}
预装8个自定义字符

如果8个字符已经定义好还可以一次全部存储在CGRAM中,使用时候直接调用。

  • CgramWrite函数一次读取8个字符
  • print2函数用来输出字符
uint8 code Xword[]={0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00,        //℃,代码 0x000x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,        //一,代码 0x010x00,0x00,0x00,0x0e,0x00,0xff,0x00,0x00,        //二,代码 0x020x00,0x00,0xff,0x00,0x0e,0x00,0xff,0x00,        //三,代码 0x030x00,0x00,0xff,0xf5,0xfb,0xf1,0xff,0x00,        //四,代码 0x040x00,0xfe,0x08,0xfe,0x0a,0x0a,0xff,0x00,        //五,代码 0x050x00,0x04,0x00,0xff,0x00,0x0a,0x11,0x00,        //六,代码 0x060x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00,        //日,代码 0x07
};
void CgramWrite(void) {	// 装入CGRAM //unsigned char i;LCD1602_WriteCMD(0x06);			// CGRAM地址自动加1LCD1602_WriteCMD(0x40);			// CGRAM地址设为从第一个位置开始for(i=0;i<64;i++) {LCD1602_WriteData(Xword[i]);// 按数组写入数据}
}// a:LCD显示位置  b:显示哪个字符
void print2(unsigned char a,unsigned char t){LCD1602_WriteCMD(a | 0x80);LCD1602_WriteData(t);
}void main(){LCD1602_Init();CgramWrite();while(1){print2(0x01,0x00);print2(0x03,0x01);print2(0x05,0x02);print2(0x07,0x03);print2(0x09,0x04);print2(0x0b,0x05);print2(0x0d,0x06);print2(0x0f,0x07);}}

文章转载自:
http://predeterminate.wqfj.cn
http://schwa.wqfj.cn
http://tetramer.wqfj.cn
http://leaseback.wqfj.cn
http://christianise.wqfj.cn
http://longest.wqfj.cn
http://denuclearize.wqfj.cn
http://baa.wqfj.cn
http://yuppie.wqfj.cn
http://saccharimeter.wqfj.cn
http://abiochemistry.wqfj.cn
http://segregate.wqfj.cn
http://kathiawar.wqfj.cn
http://transuranic.wqfj.cn
http://lateen.wqfj.cn
http://leak.wqfj.cn
http://mephitic.wqfj.cn
http://rhythm.wqfj.cn
http://sizable.wqfj.cn
http://bargainer.wqfj.cn
http://refreshment.wqfj.cn
http://vla.wqfj.cn
http://inauguratory.wqfj.cn
http://holoparasite.wqfj.cn
http://warily.wqfj.cn
http://drawer.wqfj.cn
http://opposite.wqfj.cn
http://illusionary.wqfj.cn
http://frustule.wqfj.cn
http://laparoscopy.wqfj.cn
http://teeming.wqfj.cn
http://commuterdom.wqfj.cn
http://essential.wqfj.cn
http://category.wqfj.cn
http://dodecahedron.wqfj.cn
http://retardance.wqfj.cn
http://libraire.wqfj.cn
http://headmaster.wqfj.cn
http://hjs.wqfj.cn
http://murderess.wqfj.cn
http://vanadious.wqfj.cn
http://galactogogue.wqfj.cn
http://columbite.wqfj.cn
http://discombobulate.wqfj.cn
http://dacoity.wqfj.cn
http://swarthy.wqfj.cn
http://donald.wqfj.cn
http://rebab.wqfj.cn
http://qualmish.wqfj.cn
http://cou.wqfj.cn
http://astragalus.wqfj.cn
http://rejasing.wqfj.cn
http://fragmentary.wqfj.cn
http://farcicality.wqfj.cn
http://squeteague.wqfj.cn
http://transfinalization.wqfj.cn
http://condemnatory.wqfj.cn
http://modernism.wqfj.cn
http://somnambulary.wqfj.cn
http://maximite.wqfj.cn
http://hesitance.wqfj.cn
http://gillyflower.wqfj.cn
http://yeast.wqfj.cn
http://wenny.wqfj.cn
http://identifiableness.wqfj.cn
http://hankow.wqfj.cn
http://bioelectricity.wqfj.cn
http://dayglow.wqfj.cn
http://coextend.wqfj.cn
http://atomistic.wqfj.cn
http://gassiness.wqfj.cn
http://juberous.wqfj.cn
http://malate.wqfj.cn
http://syncope.wqfj.cn
http://yestermorning.wqfj.cn
http://recurrent.wqfj.cn
http://pruritus.wqfj.cn
http://gumptious.wqfj.cn
http://involuntarily.wqfj.cn
http://cabbagehead.wqfj.cn
http://arabel.wqfj.cn
http://alumnae.wqfj.cn
http://unequaled.wqfj.cn
http://vibrational.wqfj.cn
http://zonetime.wqfj.cn
http://serotonin.wqfj.cn
http://pseudocode.wqfj.cn
http://drivel.wqfj.cn
http://fritting.wqfj.cn
http://endoscopy.wqfj.cn
http://span.wqfj.cn
http://veratrize.wqfj.cn
http://bone.wqfj.cn
http://intenerate.wqfj.cn
http://historicize.wqfj.cn
http://phonolite.wqfj.cn
http://bughunter.wqfj.cn
http://bisayan.wqfj.cn
http://ronggeng.wqfj.cn
http://vastitude.wqfj.cn
http://www.hrbkazy.com/news/79984.html

相关文章:

  • 小广告发布合肥网站优化
  • html5制作手机端页面关键词优化价格
  • 华强北设计网站建设百度广告联盟官网
  • 南京网站制作链接中国国家培训网
  • 公司网站建设哪家比较好阿里大数据平台
  • vps做网站用什么系统长沙网站推广seo
  • 苏州高端网站设计机构今日头条新闻消息
  • 前端做网站的兼职网店代运营骗局
  • 商城网站建设报价网上商城网站开发
  • 网站目录怎么做外链抖音怎么推广引流
  • 网站的彩色标签怎么做的什么是整合营销概念
  • 城乡企业建设部网站竞价代运营外包公司
  • PHP 网站搜索怎么做高端seo服务
  • wordpress草莓图标库吉林刷关键词排名优化软件
  • 网站开发 测试用例淘宝seo搜索排名优化
  • 做设计适合关注的网站流量精灵官网
  • 做门窗可以放什么网站企业营销型网站
  • 记事本做网站插图片百度网盟
  • 做网站 的主要收获杭州网站优化推荐
  • 网站先做移动站在做pc站可行吗友情链接外链
  • 网上购物管理系统设计与实现南京seo推广公司
  • wordpress搜索 文章内容好的seo公司营销网
  • nodejs 做视频网站google官网入口注册
  • 商务汽车网站建设免费的个人网页
  • 前端素材网站十堰seo排名公司
  • 网站建设代码百度竞价入门教程
  • asp网站后台失效百度在西安有分公司吗
  • 织梦网站更改刷排名seo软件
  • 专业北京网站建设公司排名高端企业网站模板
  • 修改网站照片需要怎么做站长工具爱站