编写51单片机实现液晶上字的循环显示和移动程序

编写51单片机实现液晶上字的循环显示和移动程序,第1张

#include "reg52h"

sbit LED=P1^0;//LED锁存器

sbit SEG=P1^1;//数码管段选锁存器

sbit DIG=P1^2;//数码管位选锁存器

unsigned char t;

sbit LCDRS=P2^7;//数据指令控制

sbit LCDRW=P2^6;//读写控制

sbit LCDEN=P2^5;//液晶屏使能控制

//延时函数,延时n1ms

void delay(unsigned char n)

{

int i,j;

for (i=0; i<n; i++)

for (j=0; j<100; j++)

;

}

//写命令

void Write_Cmd(unsigned char C)

{

LCDEN=1;//使能端,由高电平跳变成低电平时,液晶屏模块执行命令

LCDRS=0;//指令寄存器选择

P0=C;

delay(5);

LCDEN=0;

}

//写数据

void Write_Data(unsigned char D)

{

LCDEN=1;//使能端,由高电平跳变成低电平时,液晶屏模块执行命令

LCDRS=1;//选择数据寄存器

P0=D;

delay(5);

LCDEN=0;

}

//LCD初始化

void LCD_Init()

{

LCDRS=0;//指令寄存器选择

Write_Cmd(0x01);//清屏

Write_Cmd(0x38);//功能设置8位双行显示57点阵

Write_Cmd(0x0F);//开关显示设置

Write_Cmd(0x06);//输入方式设置,光标从左向右移动,内容不移动

}

void main()

{

unsigned char Code1[]="I LOVE MCU!";

unsigned char m;

//LED,数码管锁存器片选设置

LED=0;

DUAN=0;

WEI=0;

LCDRW=0;//写选择

LCD_Init();

Write_Cmd(0x80+0x01);//写入显示缓冲区起始地址为1行2列

for(m=0;m<11;m++)

{

Write_Data(Code1[m]);

delay(3);

}

while (1)

;

}//end of main

1602液晶的程序我有,要做数字锁的话其实用到液晶也不多。

因为你显示密码是时候不应该都是现实吗?

你只需把键盘写入的数据存在一个数组中,然后跟密码数组对比就好了。

还有就是值得注意的是数据类型问题。

输入的键值看你处理的方式而定,密码存放的格式,还有输出显示的是ascll码。注意转换。

下面附带一段51的1602LCD的C程序,自己仔细琢磨。

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

uchar table[16]="abcdefghijklmnyz";

uchar table1[16]="0123456789abcdef";

sbit lcden=P2^0;

sbit lcdrs=P2^1;

sbit dula=P2^6;

sbit wela=P2^7;

uchar num;

void delay(uint z)

{

uint x,y;

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

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

}

void write_com(uchar com)

{ wela=0;

lcdrs=0;

P0=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

void write_data(uchar date)

{ wela=0;

lcdrs=1;

P0=date;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

void init()

{

lcden=0;

write_com(0x38);

write_com(0x0e);

write_com(0x06);

write_com(0x01);

write_com(0x80);

}

void main()

{

init();

for(num=0;num<16;num++)

{

write_data(table[num]);

delay(20);

}

write_com(1);

write_com(0x80+0x40);

for(num=0;num<16;num++)

{

write_data(table1[num]);

delay(20);

}

while(1);

}

很显然这是一个滚动显示子程序,送进一个新字符时,把旧字符往前推

然后把ledbuf[ ]送往数码管或LCD即可实现滚动显示效果

ledbuf[ ]是显示用缓存

ledtab是存显示代码的表格

按一就只显示一,按二就只显示二,这是只能显示一个字符啊,也不叫显示一串字符吗?

其实,很简单,在给LCD1602送字符时,在带上显示的位置坐标参数吧,这个参数,你用一个变量,每送一个字符变量加1,下次,再显示就在下一个位置了,依次显示就行了。注意每一行只能显示16个字符啊,一行显示满了,要么换下一行,要么像字幕一样向左滚动显示。

你这程序发,谁能看清楚啊,太累了,就没心看了,谁也不会看的。这么点程序,完全可以发上来的。

#include <reg51h> //51寄存器文件

#include <intrinsh>

typedef unsigned char BYTE; //用BYTE代替unsigned char

typedef unsigned int WORD;//WORD代替unsigned int

typedef bit BOOL ;//用BOOL代替bit

sbit rs = P2^6; //复位端

sbit rw = P2^5; //写数据端

sbit ep = P2^7; //使能端

BYTE code dis1[] = {"welcome!,I'm Tom"};

//LCD侧忙函数

BOOL lcd_bz()

{

BOOL result;

rs = 0;

rw = 1;

ep = 1;

_nop_();

_nop_();

_nop_();

_nop_();

result = (BOOL)(P0 & 0x80); //检测P0最高位是否为1

ep = 0;

return result;//返回侧忙结果

}

// 写入指令数据到LCD

lcd_wcmd(BYTE cmd)

{

while(lcd_bz());

rs = 0;

rw = 0;

ep = 0;

_nop_();

_nop_();

P0 = cmd; //将8位指令通过P0口传给1602

_nop_();

_nop_();//用于产生一个脉冲宽度

_nop_();

_nop_();

ep = 1;

_nop_();

_nop_();

_nop_();

_nop_();

ep = 0;

}

//设定显示位置

lcd_pos(BYTE pos)

{

lcd_wcmd(pos | 0x80);

}

//写入字符显示数据到LCD

lcd_wdat(BYTE dat)

{

while(lcd_bz());

rs = 1;

rw = 0;

ep = 0;

P0 = dat;//将8位数据通过P0口传给1602

_nop_();

_nop_();

_nop_(); //用于产生一个脉冲宽度

_nop_();

ep = 1;

_nop_();

_nop_();

_nop_();

_nop_();

ep = 0;

}

//LCD初始化设定

lcd_init()

{

lcd_wcmd(0x38); ////162显示,57点阵,8位数据

lcd_wcmd(0x0c); //显示开,关光标

lcd_wcmd(0x06); //移动光标

lcd_wcmd(0x01); //清除LCD的显示内容

}

main()

{

BYTE i;

lcd_init(); //初始化LCD

lcd_pos(4); //设置显示位置为第一行的第5个字符

i = 0;

while(dis1[i] != '\0')

{ //显示字符"welcome!"

lcd_wdat(dis1[i]);

i++;

}

while(1);

}

这个是1602的程序,每行16个显示单元,第一行地址从0x80~0x80+16,第二行0xc0~0xc0+16,一个字符占一个地址,其它的地址也是有存储单元的,只不过不能显示出来,你向1602发送一条移位指令就看出来了。也不是每个地址都有存储单元,具体不记得了,你试试就知道了。

以上就是关于编写51单片机实现液晶上字的循环显示和移动程序全部的内容,包括:编写51单片机实现液晶上字的循环显示和移动程序、1602液晶显示屏显示程序、单片机 putchar 这段程序什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10624865.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存