LCD1602用C语言编程如何显示字符?

国内作者 / 996信息技术 / 2026-05-26 15:30
"
关于LCD1602用C语言编程如何显示字符?的讨论正在各大平台持续发酵,我们精心筛选了最新资讯,希望能为您带来实质性的帮助。void

关于LCD1602用C语言编程如何显示字符?的讨论正在各大平台持续发酵,我们精心筛选了最新资讯,希望能为您带来实质性的帮助。

void delay(uint z);//延时,1微妙时间有点短

你看看下面我做的程序,在2051+12M晶振通过你可以套用这个程序,不行的话就改长延时

//LCD脚接法,根据实际接法定义

#define LCM_D4_RS P3_2//第4脚数据/命令

#define LCM_D5_RW P3_5//第5脚读/写

#define LCM_D6_E P3_7//第6脚使能

#define LCM_D16_BLK P3_0//背光负极

#define LCM_D7_Data P1//第7-14脚数据

//LCD脚接法,根据实际接法定义

#define Busy 0x80 //用于检测LCM状态字中的Busy标识

#define _LCD_BIT_IS 4 //CPU与LCD1602间使用DB7-DB4这4根数据线进行传输

#include <at89x51.h> //头文件

#include <string.h> //strlen()函数头文件

void LCMInit(void); //LCM初始化化

void WriteDataLCM(unsigned char WDLCM); //写数据

void WriteCommandLCM(unsigned char WCLCM,int BuysC); //写指令

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); //按指定位置显示一个字符

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);//按指定位置显示一串字符

void Delay5Ms(void); //5ms延时

unsigned char ReadStatusLCM(void); //读状态

unsigned char code Greetings_Line1[] = {"Welcome Control"};

unsigned char code Greetings_Line2[] = {" ChuLong Make "};

data unsigned char cou = 0; // 定义软计数器,放在程序最前面的寄存器定义部分

void main(void)

{

LCMInit(); //LCM初始化

LCM_D16_BLK = 0; //开背光灯

TMOD = 0x11; // 定时/计数器0,1工作于方式1 16位定时

TH0 = 0x3c; // 预置产生50ms时基信号

TL0 = 0xb0;

EA = 1; // 开总中断

ET0 = 1; // 定时/计数器0允许中断

TR0 = 1; // 开定时/计数器0

DisplayListChar(0, 0, Greetings_Line1);

DisplayListChar(0, 1, Greetings_Line2);

// while(1);

}

//

void LCMInit(void) //LCM初始化

{

WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号

Delay5Ms();

WriteCommandLCM(0x38,0);

Delay5Ms();

WriteCommandLCM(0x38,0);

#if(_LCD_BIT_IS == 8) //CPU与LCD1602间使用DB0-DB8这8根数据线进行传输

WriteCommandLCM(0x38,1); //显示8位模式设置,开始要求每次检测忙信号

#else //CPU与LCD1602间使用DB0-DB4这4根数据线进行传输

WriteCommandLCM(0x28,1); //显示4位模式设置,开始要求每次检测忙信号

#endif

WriteCommandLCM(0x08,1); //关闭显示

WriteCommandLCM(0x01,1); //显示清屏

WriteCommandLCM(0x06,1); // 显示光标移动设置

WriteCommandLCM(0x0C,1); // 显示开及光标设置

}

//写数据

void WriteDataLCM(unsigned char WDLCM)

{

ReadStatusLCM(); //检测忙

LCM_D4_RS = 1;

LCM_D5_RW = 0;

#if(_LCD_BIT_IS == 8) //CPU与LCD1602间使用DB0-DB8这8根数据线进行传输

{

LCM_D7_Data = WDLCM;

}

#else //CPU与LCD1602间使用DB0-DB4这4根数据线进行传输

{

LCM_D7_Data &= 0x0f; //清高四位

LCM_D7_Data |= WDLCM & 0xf0; //写高四位

LCM_D6_E = 0;

LCM_D6_E = 1;

WDLCM = WDLCM << 4; //低四位移到高四位

LCM_D7_Data &= 0x0f; //清高四位

LCM_D7_Data |= WDLCM & 0xf0; //写低四位

}

#endif

LCM_D6_E = 0;

LCM_D6_E = 1;

}

//写指令

void WriteCommandLCM(unsigned char WCLCM,int BuysC) //BuysC为0时忽略忙检测

{

if(BuysC)

ReadStatusLCM(); //根据需要检测忙

LCM_D4_RS = 0;

LCM_D5_RW = 0;

#if(_LCD_BIT_IS == 8) //CPU与LCD1602间使用DB7-DB4这4根数据线进行传输

{

LCM_D7_Data = WCLCM;

}

#else

{

LCM_D7_Data &= 0x0f; //清高四位

LCM_D7_Data |= WCLCM & 0xf0; //写高四位

LCM_D6_E = 0;

LCM_D6_E = 1;

WCLCM = WCLCM << 4; //低四位移到高四位

LCM_D7_Data &= 0x0f; //清高四位

LCM_D7_Data |= WCLCM & 0xf0; //写低四位

}

#endif

LCM_D6_E = 0;

LCM_D6_E = 1;

}

//读状态

unsigned char ReadStatusLCM(void)

{

LCM_D7_Data = 0xff;

LCM_D4_RS = 0;

LCM_D5_RW = 1;

LCM_D6_E = 1;

while (LCM_D7_Data & Busy); //检测忙信号

return(LCM_D7_Data);

}

//按指定位置显示一个字符

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)

{

Y &= 0x1;

X &= 0xF; //限制X不能大于15,Y不能大于1

if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;

X |= 0x80; //算出指令码

WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码

WriteDataLCM(DData);

}

//按指定位置显示一串字符

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)

{

int ListLength;

Y &= 0x1;

X &= 0xF; //限制X不能大于15,Y不能大于1

for(ListLength = 0;ListLength < strlen(DData);ListLength++) //若到达字串尾则退出

{

if (X <= 0xF) //X坐标应小于0xF

{

DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符

X++;

}

}

}

//5ms延时

void Delay5Ms(void)

{

unsigned int TempCyc = 5552;

while(TempCyc--);

}

//10s延时

void tiem0(void) interrupt 1

{ // T/C0中断服务程序(产生50ms时基信号)

if(cou < 60)

{ // 计数值到1000(1s) (****时间为倒计时****)

cou = 0; // 软计数器清零

}

cou++; // 软计数器加1

TH0 = 0x3c; // 重置定时常数

TL0 = 0xb0;

}

求单片机实现4×4键盘输入,并用LCD1602显示键盘输入的数字的程序,

1、首先我们打开KeilμVision编译器,新建一个工程,然后保存在硬盘上的位置。

2、其次导入51单片机的头文件以及LCD1602的头文件。创建一个延时函数,可以传入想要具体延时的时长,其内部实现是由一个二重循环,两个循环的次数相乘积。

3、最后最后在主函数中首先执行LCD1602的初始化函数,首先创建一个无限循环,然后添加两个字符串,这里以两行显示百度经验的网址为例,再进行延时以及使用清屏函数进行刷新。

#include <reg52.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

#define DD P0

sbit Rs=P0^0;

sbit Rw=P0^1;

sbit E=P0^2;

uchar key_led;

unsigned char code disp_code[]={"0123456789abcdef"};

unsigned char code key_code[]={

0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,

0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77 };//注意这里你自己看下你电路是怎么连得,对应改一下表单里的值

void delay(int ms)

{

int i;

while(ms--)

{

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

{

_nop_();

_nop_();

_nop_();

_nop_();

}

}

}

void delay_1ms(unsigned char i) //最小延时1ms

{ unsigned char j;

while(i--)

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

}

void delay_10ns(unsigned char i) //最小延时10ns

{

unsigned char j;

while(i--)

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

}

void write_com(unsigned char com,bit p) //写指令

{if(p)

delay_10ns(5);

E=0;

Rs=0;

Rw=0;

DD=com;

delay_10ns(50); //>40ns

E=1;

delay_1ms(2); //>150ns

E=0;

delay_10ns(4); //>25+10ns

}

void write_date(unsigned char DATA) //写数据

{

delay_10ns(50);

E=0;

Rs=1;

Rw=0;

DD=DATA;

delay_10ns(50);

E=1;

delay_10ns(50);

E=0;

delay_10ns(4);

}

void addr_x_y(unsigned char x,bit y) //写坐标,定位置

{

unsigned char temp=0x80;

if(y)

{

temp|=0x40;

}

temp|=x;

write_com(temp,0);

}

void desplay_char(unsigned char x,bit y,unsigned char p)

//在指定位置显示一个字符。

{

addr_x_y(x,y);

write_date(p);

}

void lcd_init(void)

{

delay_1ms(15);

write_com(0x38,0);

delay_1ms(5);

write_com(0x38,0);

delay_1ms(5);

write_com(0x38,0);

delay_1ms(5);

write_com(0x38,1);

write_com(0x08,1);

write_com(0x01,1);

write_com(0x06,1);

write_com(0x0c,1);

}

uchar keyscan()

{

uchar scan1,scan2,keycode,j;

P1=0xf0;

scan1=P1;

if((scan1&0xf0)!=0xf0) //判键是否按下

{

delay(30); //延时30ms

scan1=P1;

if((scan1&0xf0)!=0xf0) //二次判键是否按下

{

P1=0x0f;

scan2=P1;

keycode=scan1|scan2; //组合成键编码

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

{

if(keycode== key_code[j]) //查表得键值

{

delay(30);

key_led=j;

}

}

}

}

else return(16) ;

}

void keydown()

{

P1=0xf0;

if((P1&0xf0)!=0xf0)

{

keyscan();

}

}

void main(void)

{

lcd_init(); // 初始化LCD

key_led=16;

while(1)

{

keydown();

desplay_char(0,0,disp_code[key_led]);

}

}

关于LCD1602用C语言编程如何显示字符?的探讨就到这里,您是否还有其他想了解的内容?欢迎在评论区留言告诉我们,同时别忘了点击关注哦!

分享到
声明:本文为用户投稿或编译自英文资料,不代表本站观点和立场,转载时请务必注明文章作者和来源,不尊重原创的行为将受到本站的追责;转载稿件或作者投稿可能会经编辑修改或者补充,有异议可投诉至本站。

热文导读