51驱动1602液晶显示器的程序

发布者:CrystalBreeze最新更新时间:2017-01-03 来源: eefocus关键字:51驱动  液晶显示器 手机看文章 扫描二维码
随时随地手机看文章

//1602.h

#include


//数据类型定义

typedef unsigned char uchar;

typedef unsigned int uint;


//1602指令定义

//屏幕初始化

#define SCREEN_INIT 0x38 //屏幕设置:16*2行,5*7点阵,8位数据接口

//光标及屏幕显示设置

#define SHOW_SCREEN 0x0C //屏幕显示

#define HIDE_SCREEN 0x08 //屏幕不显示

#define SHOW_CURSOR 0x02 //显示光标

#define FLASH_CURSOR    0x01 //光标闪烁

//地址指针及滚动设置

#define DPTR_INC    0x06 //读/写一个字节地址指针+1,光标+1

#define DPTR_DEC    0x04 //读/写一个字节地址指针-1,光标-1

#define SCREEN_SCR  0x01 //写一个字符,整屏左移/右移

//ADDR设置

#define ADDR_LINE1  0x80 //第一行

#define ADDR_LINE2  0xC0 //第二行

#define LINE1_END   0x10

#define LINE2_END   0x50

//忙碌状态

#define BUSY        0x80

//清屏

#define CLR_SCR     0x01 //清屏

//DPTR清零

#define CLR_DPTR    0x02 //数据指针清零

复制代码

复制代码

//1602.c

#include

#include


#include "1602.h"


//女孩不哭

//2012-10-25

//ts=sts=sw=4


//以下是端口定义,自行修改

sbit RS = P0^0; //数据/指令选择

sbit RW = P0^1; //读/写控制

sbit E = P0^2;  //使能

#define DATA P2 //数据端口 P[0~7] -> DATA[0~7] 


/*

    函数:微秒延时

    参数:

        us[uchar]:微秒

    返回:(无)

*/

void delay_us(uchar us)

{

    for(; us>0; us--)

        _nop_();

}


/*

    函数:10毫秒延时

    参数:

        ms10[uint]:10毫秒

    返回:(无)

*/

void delay_10ms(uint ms10)

{

    uchar x,y,z;

    while(ms10--){

        for(x=5; x>0; x--);

        for(y=4; y>0; y--);

        for(z=248; z>0; z--);

    }

}

/*

    函数:读取1602状态

    参数:(无)

    返回:(无)

    说明:最高位为忙碌状态位,1代表忙碌

*/

uchar read_state(void)

{

    DATA = 0xff;

    RW = 1;

    RS = 0;

    E = 1;

    return DATA;

}


/*

    函数:执行一条命令

    参数:

        cmd[uchar]:命令

    返回:(无)

*/

void do_cmd(uchar cmd)

{

    while(read_state()&BUSY)

        _nop_();

    RS = 0;

    RW = 0;

    DATA = cmd;    

    E = 1;

    delay_us(50);

    E = 0;

    delay_us(50);

}


/*

    函数:1602初始化

    参数:(无)

    返回:(无)

*/

void init_lcd(void)

{

    do_cmd(CLR_SCR);//清屏

    do_cmd(SCREEN_INIT);//显示模式设置

    do_cmd(SHOW_SCREEN|SHOW_CURSOR/*|FLASH_CURSOR*/);

    do_cmd(DPTR_INC);

}


/*

    函数:写一个字节到显存

    参数:

        ch[uchar]:显示字符ASCII码

    返回:(无)

*/

void write(uchar ch)

{

    uchar addr;

    while(read_state()&BUSY)

        ;

    //换行处理

    addr = read_state()&~BUSY;

    if(addr == LINE1_END)

        do_cmd(ADDR_LINE2);

    else if(addr == LINE2_END)

        do_cmd(ADDR_LINE1);

    RW = 0;

    RS = 1;

    DATA = ch;

    E = 1;

    delay_us(50);

    E = 0;

    delay_us(50);

}


void write_str(uchar line, uchar pos, uchar* str)

{

    uchar addr;

    uchar* ptr;

    if(line!=1 && line!=2)

        return;//只能是第1,2行

    if(pos>16)

        return;//只能是第 1~16 个字符

    //pos=0表示从当前位置开始写,忽略行

    if(pos){

        addr = (line==1?ADDR_LINE1:ADDR_LINE2)+pos-1;

        do_cmd(addr);

    }

    for(ptr=str; *ptr; ptr++){

        write(*ptr);

        delay_10ms(80);

    }

}


#if 0

void main(void)

{   

    uchar str[16] = {0};

    uchar x;

    delay_10ms(10);

    init_lcd();

    write_str(1,1,"012345671");

    delay_10ms(200);

    write_str(2,1,"AbCdEfGhIjK");

    delay_10ms(200);

    write_str(1,1,"Nv Hai Bu Ku!");

    delay_10ms(200);

    do_cmd(CLR_SCR);

    do_cmd(SHOW_SCREEN|FLASH_CURSOR);

    write_str(1,1,"this is a very very very long string!");

    for(x=0; x<4; x++){

        do_cmd(HIDE_SCREEN);

        delay_10ms(300);

        do_cmd(SHOW_SCREEN);

        delay_10ms(300);

    }

    do_cmd(SHOW_SCREEN);

    delay_10ms(200);

    do_cmd(CLR_SCR);

    write_str(1,1,"Screen will now Scroll....");

    delay_10ms(300);

    do_cmd(DPTR_INC|SCREEN_SCR);

    write_str(1,0,"Screen Scrolling");

    do_cmd(DPTR_DEC|SCREEN_SCR);

    write_str(1,0,"Screen Scrolling");

    do_cmd(DPTR_INC);

    delay_10ms(200);

    do_cmd(CLR_SCR);

    for(x=0x20; x<0xdf; x++){

        write(x);

        delay_10ms(80);

    }

    delay_10ms(200);

    do_cmd(CLR_SCR);

    write_str(2,1," ... what??");

    for(;;){

    }

}

#endif


关键字:51驱动  液晶显示器 引用地址:51驱动1602液晶显示器的程序

上一篇:8051单片机学习笔记/概要/总结/备忘
下一篇:ADS7843/XPT2046触摸屏芯片8051单片机驱动程序

推荐阅读最新更新时间:2024-03-16 15:28

基于51单片机驱动S8330E C语言程序
//S8330E是日本精工的一个电源IC,需要软件调节电压输出值 #include reg52.h #include intrins.h sbit DIN = P1^0; sbit CLK = P1^1; sbit STB = P1^2; sbit Key = P3^4; sbit LED = P1^7; void Delay(unsigned int MS) { unsigned char us,usn; while(MS!=0) { usn = 2; //for 12M while(usn!=0) { us=0x
[单片机]
51单片机驱动能力上拉电阻分析
单片机输出低电平时,将允许外部器件,向单片机引脚内灌入电流,这个电流,称为 灌电流 ,外部电路称为 灌电流负载 ;单片机输出高电平时,则允许外部器件,从单片机的引脚,拉出电流,这个电流,称为 拉电流 ,外部电路称为 拉电流负载 。 这些电流一般是多少?最大限度是多少? 这就是常见的单片机输出 驱动能力 的问题。 早期的 51 系列单片机的带负载能力,是很小的,仅仅用 能带动多少个 TTL 输入端 来说明的。P1、P2 和 P3口,每个引脚可以都带动 3 个 TTL 输入端,只有 P0 口的能力强,它可以带动 8 个! 分析一下 TTL 的输入特性,就可以发现,51 单片机基本上就没有什么驱动能力。它的引脚,甚至不能带动当时的 LED
[单片机]
<font color='red'>51</font>单片机<font color='red'>驱动</font>能力上拉电阻分析
51单片机写LCD1602代码
#include at89x51.h #include stdio.h //------------- #define RW P1_0 #define RS P1_1 #define EN P1_2 #define BUS_LCD P2 #define BF P2_7 //---------------------------- void init(void); void init_lcd(void); void write_ins_lcd(unsigned char); void write_data_lcd(unsigned char,unsigned char); void ack_lcd(void)
[单片机]
51单片机开发系列之1602字符液晶显示
从51单片机入门,对流水灯有了一定的认识后,就可以进入学习显示类的外设驱动,因为学习时往往需要直接验证、跟踪结果,显示类的外设可以把代码运行情况以非常直观的方式反馈回来。因此,笔者此处首先分析讲解1602字符型液晶的使用。 1. 1602字符型液晶概述 1602字符型液晶能够同时显示16列2行共32个字符信息。其内部已经存储了不同的点阵字符图形,包括阿拉伯数字、英文大小写、常用符号等。每个点阵字符图形都有一个固定的代码,与我们使用的ASCII码是一致的。例如大写英文字母’A’的代码为0x41,只需在需要显示的地址位置写入数据0x41即可显示出字符’A’。可用于一些简单信息交互的设计。 2. 硬件原理图 1602需三根
[单片机]
<font color='red'>51</font>单片机开发系列之<font color='red'>1602</font>字符液晶显示
PIC18F452之1602自定义字符
显示自定义字符   步骤如下:     1. 先将自定义字符写入CGRAM ; 2. 再将CGRAM中的自定义字符送到DDRAM中显示   很简单的:看好了   查看LCD1602 的CGROM 字符代码表,可以发现 从00000000B~00000111B(00H~07H)地址的内容是没有定义的,它是留给用户自己定义的,用户可以通过先定义LCD1602的CGRAM中的内容,然后就可以同调用CGROM字符一样来调用自定义好的字符(这里提示一下,自定义的字符最多可写8个),那么如何设定CGRAM中的内容呢?   首先我们要把所要编写的字符对应于5X8点阵的“字模”提取出来,我们可以通过相关的软件来提取,也可以手工提取。说白了也就是将
[单片机]
新唐M051驱动LCD1602液晶屏程序
共享一个 新唐M051驱动LCd1602液晶屏显示的程序: #include "LCD1602.h" /*************************************************** * 大量宏定义,便于代码移植和阅读 ***************************************************/ #define LCD1602_LINE1 0 #define LCD1602_LINE2 1 #define LCD1602_LINE1_HEAD 0x80 #define LCD1602_LINE2_HEAD 0xC0 #define L
[单片机]
LCD1602液晶屏幕显示介绍
下面是protues仿真电路,屏幕中第二行能看清吧,后面再说怎么显示的,第一行是我自定义的汉字 确认 和 取消 的 取 (左右写反了),发现1602显示汉字也就自己弄着玩玩,派不上大场合,而且如果一个汉字占两个字符的话(就像下图显示的),最多只能自定义4个汉字。 先贴上程序,后面再分析。 #include reg51.h #include intrins.h #define uchar unsigned char #define uint unsigned int uchar code line1 = { welcome! }; uchar p = //自定义字模数组 { 0x00,0x0f,0x04,0x0
[单片机]
LCD<font color='red'>1602</font>液晶屏幕显示介绍
液晶显示器迈向新时代 LED将取代LCD背光
  即便你前后购买的两个LCD具有相当一致的性能参数,但屏幕的背后可能已经发生变化。面板尺寸在15英寸以下的显示器中,历经时间考验的LCD冷阴极荧光灯(CCFL)背光系统正在迅速地被发光二极管(LED)所取代。    这种转变类似于晶体管取代真空管,其原因有很多,并且这种转变产生了许多衍生物。转变的基础在于最近白光LED亮度的提高,使得白光LED能够实现对尺寸大于4~6英寸PDA级显示屏的LCD进行背光或端面照光(edgelighting)。当然,价格的下降也是导到这种转变的一个因素。     “CCFL最终将成为历史,”显示器领域的增值经销商(VAR)Apollo Display Systems公司的执行总监Richard
[家用电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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