找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1294|回复: 0
打印 上一主题 下一主题
收起左侧

用HC89S105C8单片机驱动串行LCD1602 附程序

[复制链接]
跳转到指定楼层
楼主
驱动串行LCD1602
    手头有一块HC89S105C8开发板, 打算做一个电容测试器. 首先需要连接和驱动1602LCD显示屏, 由于开发板上的引出端口并不连续, 如图01所示, 如果用8位数据线的话, 接线将十分不方便. 因此使用了带PCF8574驱动的1602显示屏.
    考虑到HC89S105系列单片机端口具有多种输入输出配置方式的特点, 本程序的开发关键在于端口的配置处理上.

   1. 配置时, 首先需要定义IIC通讯端口:
    sbitIIC_SDA = P1^7;
    sbitIIC_SCL = P3^0;

   2. 然后, 配置端口的输入输出定义:
    //端口输入输出控制定义
    #defineSetSclOut  P3M0 = P3M0 & Bin(11110000)   | Bin(00001000)     //IIC_SCL(P3_0)端口为推挽输出
    #defineSetSdaOut  P1M3 = P1M3 & Bin(00001111)   | Bin(10000000)     //IIC_SDA(P1_7)端口为推挽输出
    #defineSetSdaOutOD    P1M3 = P1M3 &Bin(00001111)   | Bin(10100000)     //IIC_SDA(P1_7)端口为带上拉开漏输出
    由于SDA数据线在发送数据后需要读取应答脉冲, 所以还需要设置输入方向
    #defineSetSdaIn    P3M1 = P3M1 &Bin(00001111)   | Bin(01100000)     //IIC_SDA(P3_1)端口为带上拉输入

    3.在控制程序中, 需要设置端口为输出方向时, 只要直接输入以下指令即可:
    SetSclOut;
    SetSdaOut;SetSdaOutOD;

   4. SDA数据线在发送数据后需要读取应答脉冲时, 设置为:
    SetSdaIn;
    读取完成后, 再重新设置到输出方式:
    SetSdaOut;SetSdaOutOD;

    程序中, 为了使显示数据美观和符合习惯, 还设置了显示数据高位无效零消除程序:
//-------------------------------------------------------------------
//按指定位置(,)显示一个Int数字
void LCD_DispInt(unsigned char Col,unsigned char Row, unsigned int Numb)
{
       unsignedchar i;

       BreakInt(Numb);
/*
       //全部显示方式
       for(i= 0; i < 5; i++)
       {
              LCD_DispChar(Col+i,Row, One[ i]+48);
       }
*/
       //无效零消除模式
       if(One[0]==0)
                     LCD_DispChar(Col+0,Row, ' ');
       else  LCD_DispChar(Col+0, Row, One[0]+48);

       if(One[0]==0&& One[1]==0)
                     LCD_DispChar(Col+1,Row, ' ');
       else  LCD_DispChar(Col+1, Row, One[1]+48);

       if(One[0]==0&& One[1]==0 && One[2]==0)
                     LCD_DispChar(Col+2,Row, ' ');
       else  LCD_DispChar(Col+2, Row, One[2]+48);

       if(One[0]==0&& One[1]==0 && One[2]==0 && One[3]==0)
                     LCD_DispChar(Col+3,Row, ' ');
       else  LCD_DispChar(Col+3, Row, One[3]+48);

       LCD_DispChar(Col+4,Row, One[4]+48);
}

//----------------------------------------------------------------------------
//分解Int数为单个整数数组
void BreakInt(unsigned int iNum)
{
       One[0]= (unsigned char)(iNum / 10000);
       iNum= iNum % 10000;
       One[1]= (unsigned char)(iNum / 1000);
       iNum= iNum % 1000;
       One[2]= (unsigned char)(iNum / 100);
       iNum= iNum % 100;
       One[3]= (unsigned char)(iNum / 10);
       One[4]= (unsigned char)(iNum % 10);
}

    这样, 当显示数值的最高位等于零时, 显示屏就自动消除了.

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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