分享

两天的时间终于有点眉目了

 户外驴行 2012-03-22
以下是液晶屏的工作原理及其编程
下面是一个简单的字符显示程序
//改程序将实现简单的静态数据
 
 
 
 
//注意:
//每次进行读写操作之前,必须进行读写检测
#include <reg52.h>
#include <intrins.h>          //包含了空操作_nop_
#define uchar unsigned char
#define Data P0
//管脚的声明
sbit RS = P2^1;
sbit RW = P1^5;
sbit E = P1^6;
//用到的函数声明
void Delay(uchar);          //延时函数
void Init();                //初始化函数
void Busy();               //忙时检测
void WriteCommand(uchar);   //写指令
void WriteData(uchar);      //写数据
void Display(uchar);             //显示信息
 

void main()
{
    Init();
 Display(0x04);        //将显示地址指定为第一行第五列
                       //显示Apple
 WriteData('A');
 WriteData('p');
 WriteData('p');
 WriteData('l');
 WriteData('e');
 while(1);
}
void Delay(uchar i)
{
    uchar j;
 for(; i > 0; i --)
     for(j = 155; j > 0; j --);    //最少延时1ms
}

void Busy()
{
    Data = 0xff;
 RS = 0;        //根据规定:RS = 0, RW = 1可读取状态
 RW = 1;
 E = 1;      //允许读写
 _nop_();
 _nop_();
 _nop_();    //空操作三个机器周期,给硬件反应时间
 //进行忙时检测
 while(Data & 0x80);   //检测到忙时,继续检测【Data&0x80 = 1表示忙】
    E = 0;
}
//写命令函数
void WriteCommand(uchar i)
{
    Delay(5);     //操作前进行短暂的延时
 Busy();       //在闲时才能写指令
 RS = 0;      //根据规定,RS = 0; RW = 0;才能写入指令
 RW = 0;
 E = 0;       //写指令时,E应为高脉冲,就是让E从0到1发生整跳变,所以在这给E制0
 _nop_();
 _nop_();     //两个空操作给硬件一定的反映时间
 Data = i;    //写指令
 _nop_();
 _nop_();
 _nop_();
 E = 1;       //E制高电平
 _nop_();
 _nop_();
 _nop_();
 E = 0;        //当E从高电平变为低电平时,液晶模块开始执行指令
}
//写数据函数
void WriteData(uchar j)
{
    Delay(5);        //操作前进行短暂的延时
 Busy();        //闲时检测
 RS = 1;        //根据规定:RS = 1;RW = 0才能写入数据
 RW = 0;
 E = 0;          //在写指令/数据时,E应为高脉冲,也就是要让E从0到1发生跳变,所以在这里给E赋0
 _nop_();
 _nop_();     //两个空操作给硬件一定的反映时间
 Data = j;    //写指令
 _nop_();
 _nop_();
 _nop_();
 E = 1;       //E制高电平
 _nop_();
 _nop_();
 _nop_();
 E = 0;        //当E从高电平变为低电平时,液晶模块开始执行指令
}

void Init()
{
    Delay(15);         //延时15ms,首次写指令时应给LCD一段较长的反应时间
 WriteCommand(0x01);   //【清屏设置】
 Delay(5);          //延时5ms
    WriteCommand(0x06);   //【输入方式设置】光标从左向右移动,内容不移动
 Delay(5);          //延时5ms
 WriteCommand(0x0f);   //【显示开关设置】显示开,有光标,字符闪烁
 Delay(5);          //延时5ms
 WriteCommand(0x38);   //【功能设置命令】8位数据,双行显示,选择5*7点阵
 Delay(5);          //延时5ms
}
void Display(uchar addr)
{
    addr += 0x80;           //第一行显示地址的确定方法
    WriteCommand(addr);
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多