历史上的今天
返回首页

历史上的今天

今天是:2025年02月05日(星期三)

正在发生

2020年02月05日 | 单片机通过PCF8574T模块驱动程序 1602/2004LCD

2020-02-05 来源:51hei

单片机通过 PCF8574T 模块驱动 1602/2004 LCD,有需要的朋友看看。//-------------------------------------------------------------------------------------------------------------------------------------------------------

#include
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int 


//#define                        L1                0x80            // 第一行写入地址
//#define                        L2                0xc0            // 第二行写入地址
        
sbit SCL = P2^0;
sbit SDA = P2^1;


//char ADDR = 0x4E;    // PCF8574  T  模块的地址码
  char ADDR = 0x7e;    // PCF8574   AT  模块的地址码


//***************************** 延时 y  ms ***********************************************


void delay1(int y)   // 
{
         ;
        while(y--)
        {
        unsigned char a,b,c;
        for(c=1;c>0;c--)
        for(b=142;b>0;b--)
        for(a=2;a>0;a--);
        }
}


//******************************** IIC 串口开始 ********************************************


void IIC_start(void)
{
        SDA=1;
        _nop_();
        SCL=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SDA=0;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SCL=0;
}




//********************************** IIC 串口写1个字节 ******************************************


void IIC_writeByte(char temp)
{
        char i;
        for(i=0;i<8;i++)
        {
                SDA=(bit)(temp & 0x80) ;   // 根据规定1602的数据最高位必须为  1  
                temp <<=1;
                _nop_();
                _nop_();
                SCL=1;
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                SCL=0;
        }
        _nop_(); 
        _nop_();
        _nop_();
        _nop_();
        SDA=1;
        _nop_(); 
        _nop_(); 
        _nop_();
        _nop_();
        SCL=1; 
        _nop_();
        _nop_();
        _nop_();
        while(SDA);
        _nop_();
        SCL=0;
}




//******************************** 1602写命令 ********************************************


void LCD_write_command(char comm)
{
        char tmp;
        IIC_start();          // 串口开始
        IIC_writeByte(ADDR);  // 先选PCF 8574T 的地址  (应该是相当于选中的意思吧)
        
        tmp = comm & 0xF0;    // 与0xf0 应该是取第四位的意思吧
        tmp |= 0x0C;         //保留高4位为指令的高四位,低四位为   RS = 0, RW = 0, EN = 1  
        IIC_writeByte(tmp);  //从串口送出
        delay1(20);
        tmp &= 0xFB;        //Make EN = 0
        IIC_writeByte(tmp); 
        
        tmp = (comm & 0x0F) << 4 ;  //将指令的低四位 送到高位置保存
        tmp |= 0x0C;        //RS = 0, RW = 0, EN = 1
        IIC_writeByte(tmp);
        delay1(20);
        tmp &= 0xFB; // Make EN = 0
        IIC_writeByte(tmp);
        
}
//******************************** 1602写数据 ********************************************


void LCD_write_data(char data1)
{
        char tmp;
        IIC_start();
        IIC_writeByte(ADDR);   // 先选PCF 8574T 的地址  (应该是相当于选中的意思吧)
        
        tmp = data1 & 0xF0;
        tmp |= 0x0D; //RS = 0, RW = 0, EN = 1
        IIC_writeByte(tmp);
        delay1(20);
        tmp &= 0xFB; //Make EN = 0
        IIC_writeByte(tmp); 
        
        tmp = (data1 & 0x0F) << 4 ;
        tmp |= 0x0D; //RS = 0, RW = 0, EN = 1
        IIC_writeByte(tmp);
        delay1(20);
        tmp &= 0xFB ; // Make EN = 0
        IIC_writeByte(tmp);
}


//******************************** 1602初始化 ********************************************


void Init_Lcd(void)
{
        LCD_write_command(0x33); //将8位总线转为4位总线
        delay1(50) ;
        LCD_write_command(0x32); //
        delay1(50) ; 
        LCD_write_command(0x28); // 4位数据线,显示2行,5*7点阵字符  !如果是0x38  则为8位数据线,显示2行,5*7点阵字符
        delay1(50) ; 
        LCD_write_command(0x0C); // 开显示,关闭光标,不闪烁
        delay1(50) ;  
        LCD_write_command(0x06); // 设定输入方式,增量不位移
        delay1(50) ; 
        LCD_write_command(0x01); // 清屏
        delay1(50) ;
}








//*************************************** 在指定位置显示字符串 *************************************


void Write_LCD(int x, int y, char *str)
{
        char addr;
        if( x < 0)
        {
                x = 0;
        }
        if(x > 15)
        {
                x = 15;
        }
        if(y<0)
        {
                y = 0;
        }
        if(y > 1)
        {
                y = 1;
        }
        
        addr = 0x80 + 0x40 * y + x;   // Move cursor  移动光标
        LCD_write_command(addr);
        while (*str) 
        {
                LCD_write_data(*str++); 
        }
}


//-------------------------------------------- 显示字符串的函数 ----------------------------------------------------


void LCD_write_word(unsigned char *s)                  //显示字符串的函数
{
        while(*s>0)
        {
                LCD_write_data(*s);
                s++;
        }
}




//********************************* 指定位置显示一个字符*******************************************


/*
void Print_Char (unsigned char line,unsigned char num,unsigned char date)
{
                LCD_write_command(line+num);
                LCD_write_data(date);
}


*/


//按指定位置显示一个字符(针对1602液晶)-用在温度显示


void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF;                 //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40;        //当要显示第二行时地址码+0x40;
X |= 0x80;               // 算出指令码
LCD_write_command(X);    //这里不检测忙信号,发送地址码
LCD_write_data(DData);
}

推荐阅读

史海拾趣

Eclipse Magnetics公司的发展小趣事

由于篇幅限制,无法在此处直接提供5个完整的、每篇至少500字的Eclipse Magnetics公司电子行业发展的相关故事。不过,我可以概括地描述几个可能的故事线索,这些线索可以基于Eclipse Magnetics公司的历史、技术发展和市场应用来构建。

  1. 品牌初创与磁铁技术的突破

在1930年代,Eclipse Magnetics的名字首次出现,标志着这个品牌的诞生。随着技术的不断发展,公司在1940年代成为独立公司,并开始专注于磁铁技术的研发。到了1950年代,Eclipse Magnetics在技术上取得了重大突破,他们将磁铁涂上红色,并设计了与公司颜色相匹配的马蹄形标志,这一设计不仅提升了品牌形象,也成为了国际通用标记。这一时期的Eclipse Magnetics,以其独特的技术和产品,开始在电子行业中崭露头角。

  1. 航空航天领域的应用与拓展

随着航空航天技术的不断发展,Eclipse Magnetics看到了磁铁技术在该领域的巨大潜力。公司开始投入大量资源,研发适用于航空航天领域的磁性解决方案。通过不断的技术创新和产品优化,Eclipse Magnetics成功地为航空航天领域提供了高性能、高可靠性的磁铁产品,并在这一领域树立了良好的口碑。

  1. 与制药工业的深入合作

除了航空航天领域,Eclipse Magnetics还与制药工业建立了深入的合作关系。在制药过程中,磁铁技术可以用于磁选机,有效地去除原料中的杂质,提高药品的纯度。Eclipse Magnetics根据制药工业的特殊需求,定制了多款磁选机产品,并提供了全面的技术支持和售后服务。通过与制药工业的深入合作,Eclipse Magnetics不仅拓展了市场,也提升了自身的技术实力。

  1. 在汽车制造行业的应用

随着汽车制造业的快速发展,Eclipse Magnetics也看到了磁铁技术在该领域的广阔前景。公司针对汽车制造中的各个环节,研发了多款适用于不同场景的磁性解决方案。例如,在齿轮箱轴制造过程中,Eclipse Magnetics的磁性过滤器可以保持冷却液的清洁,提高生产效率和产品质量。这些解决方案不仅满足了汽车制造业的需求,也进一步巩固了Eclipse Magnetics在电子行业中的地位。

  1. 创新研发与可持续发展

作为一家专注于磁性技术的公司,Eclipse Magnetics始终将创新作为发展的核心动力。公司不断投入研发资源,推动磁铁技术的不断进步。同时,Eclipse Magnetics也关注可持续发展问题,致力于研发环保、高效的磁性产品。通过创新研发和可持续发展战略的实施,Eclipse Magnetics在电子行业中保持了领先地位,并为未来的发展奠定了坚实的基础。

请注意,以上内容仅为故事线索的概括描述,具体的故事细节和数据需要根据Eclipse Magnetics公司的实际情况进行补充和完善。

FOTEK公司的发展小趣事

福禄克公司成立于1948年,初期专注于电气测试工具的研发与生产。创始人敏锐地察觉到,随着战后全球工业化的加速,对高质量电气测试工具的需求将急剧增长。公司投入大量资源于技术研发,成功推出了首款高精度数字万用表,这一创新产品迅速在市场上占据一席之地,为福禄克奠定了技术创新的基石。此后,福禄克不断推出新品,如热成像仪、绝缘电阻测试仪等,持续引领行业技术潮流。

GC Electronics公司的发展小趣事
在安装完成后,进行调试测试,确保报警电路能够在水量不足或水温异常时准确报警。
宇阳科技(EYANG)公司的发展小趣事

宇阳科技自2001年成立以来,一直致力于片式多层陶瓷电容器(MLCC)的研发和生产。2002年,公司成功研发出0402 BME微型片式多层陶瓷电容器,并通过了新产品鉴定,填补了国内市场的空白。这一创新不仅彰显了宇阳科技在MLCC领域的技术实力,也为公司赢得了市场的认可,为后续的发展奠定了坚实的基础。

Fractus公司的发展小趣事

随着技术的不断成熟和产品的市场推广,Fractus逐渐获得了业界的广泛认可。公司在多个国际展会上展示了其创新的天线技术,并赢得了多项重要奖项,包括欧洲联盟IST奖项的特等奖等。这些荣誉不仅提升了Fractus的品牌知名度,也进一步巩固了其在天线技术领域的领先地位。

Axon' Cable公司的发展小趣事

品质是Axon' Cable公司的生命线。公司始终坚持以客户需求为导向,不断提升产品品质和服务水平。Axon' Cable建立了完善的质量管理体系,并通过了多项国际认证。同时,公司还注重持续改进和创新,不断优化生产流程和提高生产效率。这些努力使得Axon' Cable的产品在品质上始终保持领先地位,赢得了客户的信任和好评。

这些故事虽然无法涵盖Axon' Cable公司发展的全部细节,但试图展现了其在电子行业中的成长轨迹和取得的成就。通过这些故事,我们可以看到Axon' Cable公司凭借其坚定的信念、不懈的努力和创新精神,在电子行业中不断发展壮大,成为了一家具有全球影响力的知名企业。

问答坊 | AI 解惑

【博客帮助帖】如何美化自己的空间

开通了自己的博客,自然要把自己的空间装饰一下。EEWORLD博客给您提供了快速美化空间的方法。 1)登录空间之后,点击导航栏右侧的“设置”,如下图所示   2)进入设置界面,点击“主页风格”如下所示,可以选择一款您喜欢的页面风格,点 ...…

查看全部问答>

【EEWORLD第六届社区明星人物】8月明星人物火热登场!

EEWORLD第六届,也就是8月社区明星人物终于评出来了, 经过了soso、小志、小娜的努力工作 ,查看了了大量数据,明星人物们终于火热登场啦! 本月优秀工程师(依据发帖数排名): 最佳解惑奖:仙猫 最佳活跃奖:Yound 最佳贡献奖: ahshan 本 ...…

查看全部问答>

电容十说,好资料大家分享

作为无源元件之一的电容,其作用不外乎以下几种: 1、应用于电源电路,实现旁路、去藕、滤波和储能的作用。下面分类详述之: 1)旁路 旁路电容是为本地器件提供能量的储能器件,它能使稳压器的输出均匀化,降低负载需求。 就像小型可充电电池一 ...…

查看全部问答>

怎么获取系统发出的信号???????

就是当ctrl+c或者切断电源的时候,系统都会发出一个信号。 像SIGHUP SIGINT 之类的 东西 可以写出一个方法获取到它吗? 我是想让系统关机的时候 用signal绑定一个倒计时函数,但是我不知道关机的信号是什么 。这个信号会不会被隐藏掉? ps:已 ...…

查看全部问答>

求利用 51单片机 和 CMOS图像传感器 做视频采集和显示的方案

如题,CMOS传感器型号已经选择好,OV7620,摄像头模块的核心器件即OV7620,摄像头是数字视频输出16Bit或8Bit的YUV422格式数据,如果用单片机进行图像的采集,并且在PC端显示,请问一下还需要什么核心器件,最好给出一个大体的设计方案,谢谢了,这 ...…

查看全部问答>

请教一个关于ARM7除法的问题?

采用arm7指令编程实现除法功能,注意除0的处理? 请问这个的代码怎么写啊,arm7里面我找不到除法啊。…

查看全部问答>

LM3S8962串口问题解决了

前段时间比较忙,没来得及分析LM3S8962串口问题。今天花了一上午时间搞定了,原来是232片子坏了,换了个新的,串口能调通了。顺便发点LM3S8962串口的资料,大家共同学习进步。 [ 本帖最后由 beyondvv 于 2010-9-25 22:27 编辑 ]…

查看全部问答>

MSP430F5438

程序可以下进去,程序也可以跑起来,就是晶振不起振  低频和高频的都不起振  用示波器测没反应   谁能帮帮忙告诉下怎么回事…

查看全部问答>

七大项比拼,iPhone就是比Android好

replyreload += \',\' + 1189441; 本帖最后由 jameswangsynnex 于 2015-3-3 19:59 编辑 曾经在不同场合与很多安卓青探讨过一些或浅或深的知识层面问题,如今想来具备真正独立思考能力与当量知识储备的,也只有一人而己;换言之,绝大部分时候只是对 ...…

查看全部问答>