1602LCD显示器的使用

发布者:数字狂想最新更新时间:2016-04-13 来源: eefocus关键字:1602LCD  显示器 手机看文章 扫描二维码
随时随地手机看文章
LCDE==P2.7    LCD使能

DB==P0        数据位
RD==P2.6      写模式选择
WR==P2.5      读写使能


指令码:                 二进制           十六进制

清屏:                10000000             0x80;

光标归位:             X1000000             0x40或0xC0

。。。。。。。。


读状态输入:RS=L,RW=H,E=H 输出:DB0~DB7=状态字
写指令输入:RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码输出:无
读数据输入:RS=H,RW=H,E=H 输出:DB0~DB7=数据
写数据输入:RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据输出:无

上次写的驱动:

#include

#include"LCD1602.h"

#include

#include

#include

#include

#include

sbit lcdrs =P3^0;//数据/命令选择端(H/L)

sbit lcdrw =P3^1;//读/写选择端(H/L)

sbit lcden =P3^2;//使能信号端

char  theDisplayLength=0,//保存应该在当前显示的位数

 cursorPosition=0;//保存光标所在显示屏的位置

char  startAddress=0,endAddress=0;//保存显示的起始和结束地址

 

char LCDBuffer[16]={""}; 

char ctrlStr[7]={".4f"};

 

void delayms(int xms)   //延时X毫秒

{

int i, j;

for(i=xms;i>0;i--)

for(j=121;j>0;j--);

}  

void write_com(char com)//写命令

{

lcdrs=0;

P0=com;

delayms(1);

lcden=1;

delayms(1);

lcden=0;   

}

 

void write_data(char mydata)////写数据

{

lcdrs=1;

P0=mydata;

delayms(1);

lcden=1;

delayms(1);

lcden=0;   

}

void initLCD()//初始化

{

   lcdrw=0;

   lcden=0;

   write_com(0x38); //设置16x2显示,5x7点阵,8位数据接口

   write_com(0x0e); //00001dcb,d=1开显示,c=1显示光标,b=1光标闪烁

   write_com(0x06); //000001ns,n=1字符后地址指针加一,且光标加                         

    //s=1写字符,正屏显示左移(n=1)

   write_com(0x80); //设置数据地址指针(0-27H,40-67H)

   write_com(0x01); //01,显示清屏:1,数据指针清零。2,所有显示清零

//02,显示回车:1,数据指针清零。

   startAddress=0;

   endAddress=-1;

}

void write_position(char position)//字符要显示在LCD哪个位置

{

lcdrs=0;

lcdrw=0;

lcden=0;

P0=position;

delayms(1);

lcden=1;

delayms(1);

lcden=0;

}

 

///功能函数部分

void displayOneCharacter(char mydata,char position)

{

write_position(position);

write_data(mydata);

}

 

void loadAndDisplay(bit judge)

{

if(judge==0)

{

   //显示上面的16个字符

displayOneCharacter(LCDBuffer[0],0x80);

displayOneCharacter(LCDBuffer[1],0x81);

displayOneCharacter(LCDBuffer[2],0x82);

displayOneCharacter(LCDBuffer[3],0x83);

displayOneCharacter(LCDBuffer[4],0x84);

displayOneCharacter(LCDBuffer[5],0x85);

displayOneCharacter(LCDBuffer[6],0x86);

displayOneCharacter(LCDBuffer[7],0x87);

displayOneCharacter(LCDBuffer[8],0x88);

displayOneCharacter(LCDBuffer[9],0x89);

displayOneCharacter(LCDBuffer[10],0x8A);

displayOneCharacter(LCDBuffer[11],0x8B);

displayOneCharacter(LCDBuffer[12],0x8C);

displayOneCharacter(LCDBuffer[13],0x8D);

displayOneCharacter(LCDBuffer[14],0x8E);

displayOneCharacter(LCDBuffer[15],0x8F);

}

if(judge==1)

{

   //显示下面的16个字符

   displayOneCharacter(LCDBuffer[0],0xC0);

displayOneCharacter(LCDBuffer[1],0xC1);

displayOneCharacter(LCDBuffer[2],0xC2);

displayOneCharacter(LCDBuffer[3],0xC3);

displayOneCharacter(LCDBuffer[4],0xC4);

displayOneCharacter(LCDBuffer[5],0xC5);

displayOneCharacter(LCDBuffer[6],0xC6);

displayOneCharacter(LCDBuffer[7],0xC7);

displayOneCharacter(LCDBuffer[8],0xC8);

displayOneCharacter(LCDBuffer[9],0xC9);

displayOneCharacter(LCDBuffer[10],0xCA);

displayOneCharacter(LCDBuffer[11],0xCB);

displayOneCharacter(LCDBuffer[12],0xCC);

displayOneCharacter(LCDBuffer[13],0xCD);

displayOneCharacter(LCDBuffer[14],0xCE);

displayOneCharacter(LCDBuffer[15],0xCF);

}

}

void setCursorPosition(char position) //移动光标位置

{

  char i;

write_com(0x02);//光标归位

for(i=0;i

    {

write_com(0x14);//右移

    }

}

 

//下面的代码用于动态显示字符的,主要的东西在上面

void moveLeftOneStep(void)//左右移动

{

if(cursorPosition==0)//表明要通过翻页左移

{

if(startAddress!=0)//表明还可左移一次 剩下情况没法移动

{

startAddress--;//确定显示的结束位置

if(expressLength-startAddress>=16)//表明显示满了

{

endAddress=startAddress+15;

return;

}

else//表明后面还有几个空要填满

{  

endAddress=expressLength-1;

}

}

else//表明无需翻页

{

cursorPosition--;

}

}

 

void moveRightOneStep(void)

{

if(startAddress+cursorPosition==endAddress+1)

return;

if(cursorPosition==15)//表明要考虑是否进行翻页

{

if(startAddress+16

//表明 startAddress+15得到的是LCD最后一位对应express的地址 再加1表示长度

{

startAddress++;

endAddress=startAddress+15;

displayExpress();

}

else if(startAddress+16==expressLength)//表明当前已是最后一个字符

{

startAddress++;

endAddress=startAddress+14;//光标处应该是空

displayExpress();

}

else//表明光标处并没有显示字符

{

return;

}

}

else//表明无需翻页

{

if(cursorPosition==endAddress+1)//已到最后一个位置,光标不能再动了

{

return;

}

cursorPosition++;

endAddress=expressLength-1;

setCursorPosition(cursorPosition);

}

}

 

void moveLeft(void)//startAddress+cursorPosition是光标对应express中的地址

{

if(startAddress+cursorPosition==0)//跳转到最后

{

if(expressLength>15)

{

endAddress=expressLength-1;

startAddress=endAddress-14;

}

cursorPosition=endAddress-startAddress+2;

}

if(startAddress+cursorPosition-1>=0&&express[startAddress+cursorPosition-1]=='n')//tan,sin,ln

{

if(startAddress+cursorPosition-6>=0&&express[startAddress+cursorPosition-6]=='a'&&express[startAddress+cursorPosition-6+1]=='r') //arctan,arcsin……

{

moveLeftOneStep();

moveLeftOneStep();

moveLeftOneStep();

moveLeftOneStep();

moveLeftOneStep();

moveLeftOneStep();

}

else if(express[startAddress+cursorPosition-2]=='l')//表明为ln

{

moveLeftOneStep();

moveLeftOneStep();

}

else //表明为sin或tan

{

moveLeftOneStep();

moveLeftOneStep();

moveLeftOneStep();

}

}

else if(startAddress+cursorPosition-1>=0&&startAddress+cursorPosition-1>=0&&express[startAddress+cursorPosition-1]=='g')//lg

{

moveLeftOneStep();

moveLeftOneStep();

}

else if(startAddress+cursorPosition-1>=0&&express[startAddress+cursorPosition-1]=='s')

{

if(startAddress+cursorPosition-6>=0&&express[startAddress+cursorPosition-6]=='a'&&express[startAddress+cursorPosition-6+1]=='r') //arctan,arcsin……

{

moveLeftOneStep();

moveLeftOneStep();

moveLeftOneStep();

moveLeftOneStep();

moveLeftOneStep();

moveLeftOneStep();

}

else

{

moveLeftOneStep();

moveLeftOneStep();

moveLeftOneStep();

}

}

else//表明为单个字符

{

moveLeftOneStep();

}

}

 

void moveRight(void)

{

if(endAddress-startAddress+1==cursorPosition)//表明光标到了最后

{  

if(expressLength>15)

{

endAddress=15;

startAddress=0;

}

cursorPosition=0;

}

else if(express[startAddress+cursorPosition]=='s'||express[startAddress+cursorPosition]=='t'||express[startAddress+cursorPosition]=='c')//sin,tan

{

moveRightOneStep();

moveRightOneStep();

moveRightOneStep();

}

else if(express[startAddress+cursorPosition]=='a')//arctan,arcsin之类的

{

moveRightOneStep();

moveRightOneStep();

moveRightOneStep();

moveRightOneStep();

moveRightOneStep();

moveRightOneStep();

}

else if(express[startAddress+cursorPosition]=='l')//lg,ln

{

moveRightOneStep();

moveRightOneStep();

}

else//表明为单字符

moveRightOneStep();

}

 

void displayExpress(void)//从startAddress显示到endAddress

{

char i;

write_position(0x80);//从这里开始显示

for(i=startAddress;i<=endAddress;i++)

{

write_data(express[i]);

}

for(i=endAddress+1;i<16+startAddress;i++)//后面的写空格

{

write_data(' ');

}

}

 

void insertOneAndDisplay(void)

{

expressLength++;

if(cursorPosition>=0&&cursorPosition<15)//表明是在和前面当中插入的  startAddress可以不变

{

//查看当前显示状态

if(endAddress-startAddress==15)//表明当前已经满显了

{

endAddress--;

}

else//表明未满显

{

endAddress++;

}

cursorPosition++;

}

else if(cursorPosition==15)//表明光标在显示器第16个显示单元处 此时 startAddress得变  

{

if(endAddress-startAddress==15)//表明当前已经满显未满显的情况已在isModifyInput中处理

{

startAddress++;

endAddress++;

}

}

}

 

 

void deleteOneAndDisplay(void)

{

moveExpressForward(cursorPosition+startAddress,1);

expressLength--;

if(cursorPosition==0)

{

startAddress--;

//确定endAddress的位置

if(expressLength-startAddress>=16)//表明显示满了

{

endAddress=startAddress+15;

}

else//表明后面还有几个空要填满

{

endAddress=expressLength-1;

}

}

else

{

cursorPosition--;//光标位置要--

   //确定endAddress的位置

if(expressLength-startAddress>=16)//表明显示满了

{

endAddress=startAddress+15;

}

else//表明后面还有几个空要填满

{

endAddress=expressLength-1;

}

}

}

 

void deleteAndDisplay(void)

{

if(startAddress==0&&cursorPosition==0)//表明没法删除了

{

return;

}

if(express[cursorPosition-1+startAddress]=='s')//表明为cos

{

if(cursorPosition-6+startAddress>=0&&express[cursorPosition-6+startAddress]=='a')

{

deleteOneAndDisplay();

deleteOneAndDisplay();

deleteOneAndDisplay();

deleteOneAndDisplay();

deleteOneAndDisplay();

deleteOneAndDisplay();

}

else

{

deleteOneAndDisplay();

deleteOneAndDisplay();

deleteOneAndDisplay();

}

}

else if(express[cursorPosition-1+startAddress]=='n')//表明为sin tan  或者ln

{

if(express[cursorPosition-2+startAddress]=='l')//表明为ln

{

deleteOneAndDisplay();

deleteOneAndDisplay();

}

  else if(cursorPosition-6+startAddress>=0&&express[cursorPosition-6+startAddress]=='a')//表明为arcsin或者acrtan运算

{

deleteOneAndDisplay();

deleteOneAndDisplay();

deleteOneAndDisplay();

deleteOneAndDisplay();

deleteOneAndDisplay();

deleteOneAndDisplay();

}

else//表明为sin、tan

{

deleteOneAndDisplay();

deleteOneAndDisplay();

deleteOneAndDisplay();

}

else if(express[cursorPosition-1+startAddress]=='g')

{

deleteOneAndDisplay();

deleteOneAndDisplay();

}

else//表明删除一个

{

deleteOneAndDisplay();

}

}

 

void displayInputExpress(void)//输入时调用的

{

if(keyCode=='=')

{

return;

}

if(cursorPosition==15&&startAddress+1<=100)

{

startAddress++;

endAddress=14+startAddress;

return;

}

else //仅能提供第一次输入时的显示

{

endAddress=expressLength-1;

cursorPosition++;

return;

}

warning("error 1");

}

 

 

void displayModifyExpress(void)

{

if(keyCode=='=')

{

return;

}

if(keyCode==129||keyCode==130||keyCode==131)//表明为三个字符要输入

{

insertOneAndDisplay();

insertOneAndDisplay();

insertOneAndDisplay();

}

else if(keyCode==139||keyCode==140)

{

insertOneAndDisplay();

insertOneAndDisplay();

}

else if(keyCode>=141&&keyCode<=142)

{

insertOneAndDisplay();

insertOneAndDisplay();

insertOneAndDisplay();

insertOneAndDisplay();

insertOneAndDisplay();

insertOneAndDisplay();

}

else

{

insertOneAndDisplay();

}

}

void dispaly_dataA(void);

void dispaly_dataA(void)

{

if(dataA>=pow(10,36))

{

warning("Answer Over Flow!");

dataA=0;

dispaly_dataA();

}

else

{

sprintf(LCDBuffer,"g",dataA);

loadAndDisplay(1);

}

}

 

void warning(char *p)

{

sprintf(LCDBuffer,"s",p);

loadAndDisplay(0);

delayms(500);

sprintf(LCDBuffer,"s"," ");//清屏

loadAndDisplay(0);

displayExpress();

}

 

void moveLogo(void)//把字符向前移动

{

  unsigned char i,temp;

temp=LCDBuffer[0];

for(i=0;i<15;i++)

{

LCDBuffer[i]= LCDBuffer[i+1];//前移动

}

LCDBuffer[15]=temp;

}

 

void showLogo(void)

{

  char i;

  strcpy(LCDBuffer,"    HuaQiang_PCB");//上次参加比赛时用的Logo

for(i=0;i<19;i++)

{

loadAndDisplay(0);

moveLogo();

delayms(100);

}

}

关键字:1602LCD  显示器 引用地址:1602LCD显示器的使用

上一篇:设定1602字符的显示位置
下一篇:STC89C52单片机UART AD DA测试实验

推荐阅读最新更新时间:2024-03-16 14:50

宝马下一代车型将装备iNEXT曲面屏显示器
汽车科技的发展,很重要的一项就是汽车显示器的革新,从采用最早发光二极管到黑白点阵屏幕到阴极射线管屏幕显示器,随后又出现单色液晶显示器,彩色液晶显示器, 再到数字化LED显示屏。而现在汽车内的屏幕已经成为各厂家“卖弄”科技感的重要配置,汽车屏幕越来越大,色彩表现效果也越来越好,用户使用率比也越来越高。 在1979年阿斯顿·马丁为楔形轿车(wedge-shaped sedan)其配置了LED显示屏来显示仪表板,该款设备最初是为F-15战机设计的,但由于造价太贵,后来小型阴极射线管屏幕显示器(TV-style),1987年丰田皇冠推出了附带导航系统的彩色显示屏,1986年,别克Riviera车型成为是首款采用触摸屏的量
[汽车电子]
宝马下一代车型将装备iNEXT曲面屏<font color='red'>显示器</font>
NanoPhotonica取得OLED平面显示器的技术突破
  佛罗里达州奥兰多——先进材料开发商NanoPhoton ic a在Q LED (量子点发光二极管) 显示 技术方面取得切实可行的重大突破,即将用于显示器的量产。   与新近推出的 OLED显示 器相比,该公司的S-QLED技术能带来更佳的画质和更低的功耗,同时大幅降低成本,显著延长显示器的使用寿命。NanoPhotonica的材料及设计解决方案在各类型显示器中都具有成本效益,包括智慧手机、大型设备(例如电视机)等各种显示器。          NanoPhotonica目前正在与几家领先的显示器生产商合作,推广采用该公司这项专有技术的产品。一些独立实验室之前已经验证了此类产品的主要效能优势。   该公司执行长Chris
[电源管理]
日本电装:未来客舱的舒适性设计
开发驾驶舱的关键是将驾驶员与车辆环境连接起来。也就是说,驾驶舱必须充当驾驶员与车辆之间的人机界面(简称HMI)。 具体而言,车辆必须在行驶时告知驾驶员其状况。HMI用于提供此类信息,包括速度和剩余汽油或电池容量。 驾驶员通过执行各种操作或切换模式来随意驾驶车辆。需要一个接口将开关和控件的操作传达给车辆。HMI有助于增强联网汽车的出行体验,并使车辆更加方便舒适。 我们必须设计一个座舱,以便HMI易于使用,我们集中在两个要点上。首先,HMI必须是创新的,高度可见的和生动的。其次,HMI必须是智能且有用的,它让我更详细地解释我们的创新和智能功能。 功能布局的概念 一个创新的、高度可见的、生动的人机界面
[汽车电子]
日本电装:未来客舱的舒适性设计
JDI因管理层为达成目标施压,存在财务造假
近日,日本显示器公司 JDI 发布了针对财务贪污案的第三方调查报告,显示 JDI 在日本东京交易所上市的 2014 年 3-6 月财季开始到 2019 年 4~9 月财季,存在财务造假,通过高估计入库存等方式将盈利上调了 16 亿日元(约合人民币 1 亿元)。 此次调查因去年 11 月份的 5 亿日元贪污案而起,涉嫌贪污被刑事起诉的前财务人员表示是按照管理层指使进行了不合法的会计调整,为此 JDI 才邀请外部第三方机构进行稽核。 根据调查报告结论,虽然是负责人主导进行了会计造假,但背景为管理层为达成目标施压。后续,JDI 计划为防止再次发生同类事件并建立管理体系,成立管理结构改善委员会。JDI 社长表示:长期以来的亏损和
[嵌入式]
JDI因管理层为达成目标施压,存在财务造假
科学家开发新类型液晶显示器 5英寸屏幕成本仅5美元
  来自中国与香港的工程师开发出一种特殊类型的 液晶显示器 ( LCD ),主打薄巧、灵活、轻便、坚韧。 该团队表示,你每天早上都要翻阅的报纸文本可以上传到这种纸质显示器中,且更新速度就跟新闻周期一样快。下面就随嵌入式小编一起来了解一下相关内容吧。   团队开发的显示器有两项关键革新,第一是光学可重写 液晶显示器 (Optically rewritable  LCD s)的发展。 和传统 液晶显示器 一样,可重写液晶显示器结构类似三明治,在两块夹板之间填充液晶,不同在于传统液晶显示器对光线偏折方向的旋转可透过静电场控制,而光学可重写液晶显示器使用特定的分子涂覆板,消除对电极的需求, 显示器的厚度也能有更多选择。   通常光学可
[嵌入式]
新型显示产业超越发展三年行动计划近日将发布
    4月8日,工信部电子信息司在深圳组织召开2018年全国电子信息行业工作座谈会,会上,部电子信息司副司长吴胜武对我国新型显示产业、智能光伏产业、集成电路产业和“芯火”创新计划的工作进展进行解读,并介绍了下一步工作计划和部署。   据中国电子报4月9日消息,吴胜武表示,我国新型显示产业近年来发展迅速,规模持续扩大,TFT-LCD出货跃居全球第一,大尺寸面板生产能力进一步提升,AMOLED量产进程不断推进,企业经营能力明显增强。高端产品供给实现突破,固定资产投资稳步增长,但是产能规模迅速扩张与创新能力储备不足之间存在不平衡,产业资源分散与集聚发展需求之间存在不平衡,配套能力、技术储备和前瞻布局发展仍然不充分。   为引导
[手机便携]
德国弗劳恩霍夫研究所开发可用视线操作的头戴式显示器
    德国弗劳恩霍夫应用研究促进协会(通称弗劳恩霍夫研究所)的德累斯顿有机材料与电子设备中心(Fraunhofer Institute COMEDD)宣布,该中心正在开发的新型头戴式显示器(HMD:Head Mounted Display)“Interactive OLED data eyeglasses”在德国的国际展会“CeBIT 2013”上获得了“Innovation Award IT 2013”的硬件类大奖。          此次开发的HMD(上)和有机EL的微显示器(下)     这款HMD在眼镜镜片位置配置了利用小型半透明有机EL的微型显示器兼摄像元件,用户可同时看到周围的景色和影像。弗劳恩霍夫研究
[家用电子]
移动装置火爆推动显示器分辨率持续上升
随着移动装置在高度信息内容与多媒体功能需求日益增加,平板显示器的分辨率不断往高密度推动。而面板厂商发展超高分辨率,如电视机的4k x 2k以及平板电脑的QXGA (2048 x 1546),其平均像素密度,衡量平板显示器每英寸像素(PPI),预计未来几年将持续增长。 根据DisplaySearch最新一季全球平板显示器研究调查报告Quarterly Worldwide Flat Panel Display Forecast Report中指出,在大尺寸液晶面板中(大于9.1寸)平均每英寸像素(PPI)将从2010年的88ppi,到2015年将成长至98ppi。而中小尺寸液晶面板(小于9.0寸)平均每英寸像素(PPI)在同期将从18
[手机便携]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved