找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

第12章 指针的基础与1602液晶的初步认识

查看数: 17936 | 评论数: 11 | 收藏 8
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2013-9-28 15:03

正文摘要:

图12-3 液晶下拉电阻    如果不加这个下拉电阻,刚开始讲点亮LED小灯的时候,我们就得写一句:LCD1602_E=0,可能很多初学者容易弄不明白,所以我们才加了这样一个电路。但是在实际开发过程中,就不必 ...

回复

ID:339500 发表于 2018-8-2 02:23
为什么不直接出个新版讲解单片机视频呢,主页推荐的郭天祥的视频第一模糊,第二视频播放速度和声音速度延迟8S左右,虽然我可以通过下载视频通过软件吧延迟拟补回来但是真的太麻烦了,而且郭视频也需要新一代更新更新呀
ID:93625 发表于 2018-7-12 13:21
学习内容越来越难了,努力中
ID:281447 发表于 2018-3-20 16:23
液晶屏“读数据”操作,应该是R/W = H吧?
ID:262591 发表于 2018-1-16 11:59
最近在学指针,非常棒的文章。因为读的比较仔细,所以看到流水灯例程时发现个小错误,应该是P1=~buf
ID:220927 发表于 2018-1-4 12:09
指针的使用最为灵活也最麻烦,这降解真心好,理解好的画用的非常好
ID:155764 发表于 2017-11-1 10:36
绝世好贴!
ID:95509 发表于 2017-10-12 16:32
耐心学习!谢谢楼主
ID:225339 发表于 2017-8-27 14:30
仔细看了这篇教程 我也在开发板上试了 是存在问题的  就是 字符的 重复显示 我改了一下  现在 编译通过且成功 特地分享
/*问题 1602重复显示*/
#include<reg52.h>
#define LCD1602_DB  P0                //1602 IO口
sbit LCD1602_RD=P1^2;        // 数据命令选择端  H DATA  L CMD
sbit LCD1602_RW=P1^3;   //  读写端    H  READ  L WRITE                                                                                                                     
sbit LCD1602_E=P1^4;        //   使能
void readbusy();      //判忙 1忙 0空
void write_data(unsigned char dat);
void write_cmd(unsigned char cmd);
void LCD1602_INIT();
unsigned char code word1[]={"cjb study 1602"};
void LCDShowstr(unsigned char addr_start,unsigned char *p);   //x  y表示坐标 p表示指针变量 即数组word的首地址
void main()
{

        LCD1602_INIT();
        LCDShowstr(0x80,word1);
        while(1){}
}
void LCD1602_INIT()                  //1602INIT
{
        write_cmd(0x38);           //显示模式设置  1602 固定命令
        write_cmd(0x0c);                //开显示器 关闭光标   0000 1DCB   D=1开显示 C=1显示光标 B=1 光标闪烁
        write_cmd(0x06);                 //文字不动  地址自动加1   0000 01NS N=1 写入一个字符后 地址自动加1 S=0 写入一个字符 整屏不移动
        write_cmd(0x01);                //清屏
}
/*1602每次的写入都要确保其处于不忙的状态  状态字的最高位D7代表其是否忙碌1 禁止写入 0 应许写入*/
void readbusy()
{
        unsigned char sta;
        LCD1602_DB=0XFF;    //P0置位,判断D7是不是1602拉低的
        LCD1602_RD=0;
        LCD1602_RW=1;    //读D7状态           RD  RW 不能写错
        do{
        LCD1602_E=1;      //使能
        sta=LCD1602_DB;
        }while(sta&0x80);                //等到sta 首位为0 时 退出循环  此时1602处于空闲状态
        LCD1602_E=0;                  //读完了关闭使能  液晶输出数据对总线的干扰
}
void write_data(unsigned char dat)                 //写数据
{
    readbusy();
        LCD1602_RD=1;                           //参考时序图
        LCD1602_RW=0;
        LCD1602_DB=dat;
        LCD1602_E=1;
        LCD1602_E=0;
}
void write_cmd(unsigned char cmd)        //写命令
{
    readbusy();
        LCD1602_RD=0;                                   //参考时序图
        LCD1602_RW=0;
    LCD1602_DB=cmd;
        LCD1602_E=1;
        LCD1602_E=0;
}
void LCDShowstr(unsigned char addr_start,unsigned char *p)
{
        write_cmd(addr_start);
        while(*p!='\0')
        {
                write_data(*p++);
        }
}
至于问题出在哪里 我认为 是坐标哪里有问题  希望大神求解
ID:74245 发表于 2015-11-19 08:11
真的写得很好,很适合初学者。
ID:74433 发表于 2015-3-24 21:18
讲的很详细透彻
ID:69833 发表于 2014-12-16 18:58
挺好挺好,学会了不少东西

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

Powered by 单片机教程网

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