液晶显示屏LCD1602直连STC89C52RC单片机程序

    我买的普中-2单片机类型开发板,单片机自带有一排插槽,是留给LCD1602显示用的。

    虽然这个插槽正好可以连接上LCD1602,但是因为他的引脚特殊性,有三个引脚,RW,RS,EN需要接到另一排引脚上,如果我们自己接线,引脚随便定义,但是这种一体的,需要我们在写程序的时候注意。

    经过我的试验,发现这几个引脚关系如下所示:

sbit RS = P2^6;
sbit RW = P2^5;
sbit EN = P2^7;

    也就是说,我们在写代码的时候,虽然不用关心连线,但是这里的几个引脚定义一定要注意,否则液晶显示器可能会点亮,但是并不会显示字符串。

   完整的代码:

#include <reg52.h>

#include <intrins.h>
#include <stdio.h>
#include <string.h>

#define uchar unsigned char 
#define uint unsigned int 

sbit RS = P2^6;
sbit RW = P2^5;
sbit EN = P2^7;

uchar code table1[] = {"hello,world!"};
uchar code table2[] = {"0123456789"};

void delay(uint time);
void init_1602(void);
void writecmd(uint cmd);
void writedata(uchar dat);
void display(uchar len,uchar* table);

void main(void)
 { 
   // Write your code here
  delay(10);
  init_1602();
  delay(5);	 
  writecmd(0x80);
  //delay(5);
  display(strlen(table1),table1);
  writecmd(0x80+0x40);
  display(strlen(table2),table2);
  while (1)
     ;
 }
 
 void delay(uint time)
 {
  unsigned char a,b,i;
  for(i=time;i!=0;i--)
  {
	for(b=199;b>0;b--)
	{
	  for(a=1;a>0;a--);	
	}		
  }  
}

void init_1602(void){
  delay(15);
//¡wwritecmd(0x33);
//	writecmd(0x32);
  writecmd(0x38); //mode set
  writecmd(0x0c); //display set
  writecmd(0x06);  //display mode
  writecmd(0x01); //clear display
}

void writecmd(uint cmd){
	RS = 0;
	RW = 0;
	P0 = cmd;
	EN = 1;
	delay(1);
	EN = 0;
	/*
	P1 = (cmd & 0x0f) << 4;
	EN = 1;
	delay(1);
	EN = 0;*/
}

void writedata(uchar dat)
{
  RS = 1;
  RW = 0;
  P0 = dat;
  EN = 1;
  delay(1);
  EN = 0;	
	/*
	P1 = (dat & 0x0f) << 4;
  EN = 1;
  delay(1);
  EN = 0;*/
}

void display(uchar len,uchar* table){
	uchar i;
	for(i=0;i<len;i++)
	{
	  writedata(table[i]);	
	}
	delay(5);
}

     实验现象拍照:

     程序就是更改了一下RS,RW,EN引脚的定义,默认P0这一排引脚应该接的就是LCD1602的数据接口D0-D7。所以程序里面需要改变的就是写入指令与数据的地方需要给P0赋值。

      这种使用开发板一体的卡槽方式,都不用布线,很省事,但是我们需要搞清楚它的一些引脚的关系,否则LCD1602只能点亮,并不能显示字符串。

  • 15
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,设计一个时钟,需要用到STC89C52RC/LE52RC单片机LCD1602液晶屏、电位器、晶振、电容、电阻等元器件。 电路连接如下: ![时钟电路连接图](https://img-blog.csdn.net/20171024153410451?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFpMzEyMjEy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75) 代码如下: ```c #include <reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char sbit RS = P2^5; //RS引脚 sbit RW = P2^6; //RW引脚 sbit EN = P2^7; //EN引脚 uchar code table[] = "2019-02-15 00:00:00"; //初始时间 uchar time[20]; //存放时间的数组 uchar hour, minute, second; //时、分、秒 bit flag; //秒钟更新标志 void delay(uint t) //延时函数 { uint i, j; for(i = t; i > 0; i--) { for(j = 110; j > 0; j--) { _nop_(); } } } void write_com(uchar com) //写命令函数 { RS = 0; RW = 0; P0 = com; EN = 1; delay(5); EN = 0; } void write_data(uchar dat) //写数据函数 { RS = 1; RW = 0; P0 = dat; EN = 1; delay(5); EN = 0; } void init() //LCD初始化函数 { write_com(0x38); //设置显示模式:16*2、5*7点阵、8位数据接口 write_com(0x0c); //开启显示,不显示光标 write_com(0x06); //光标右移,不移动屏幕 write_com(0x01); //清屏 } void get_time() //获取时间函数 { uchar i; for(i = 0; i < 20; i++) { time[i] = table[i]; } hour = (time[11] - 48) * 10 + (time[12] - 48); //计算小时 minute = (time[14] - 48) * 10 + (time[15] - 48); //计算分钟 second = (time[17] - 48) * 10 + (time[18] - 48); //计算秒钟 } void display_time() //显示时间函数 { uchar h1, h2, m1, m2, s1, s2; h1 = hour / 10; h2 = hour % 10; m1 = minute / 10; m2 = minute % 10; s1 = second / 10; s2 = second % 10; write_com(0x80); //显示位置:第一行第一列 write_data(h1 + 48); //显示小时的十位数 write_data(h2 + 48); //显示小时的个位数 write_data(':'); //显示冒号 write_data(m1 + 48); //显示分钟的十位数 write_data(m2 + 48); //显示分钟的个位数 write_data(':'); //显示冒号 write_data(s1 + 48); //显示秒钟的十位数 write_data(s2 + 48); //显示秒钟的个位数 } void timer0() interrupt 1 //定时器0中断函数 { TH0 = 0x3c; TL0 = 0xb0; flag = 1; //秒钟更新标志 } void main() { TMOD = 0x01; //定时器0,模式1 TH0 = 0x3c; //定时器初值 TL0 = 0xb0; TR0 = 1; //启动定时器0 ET0 = 1; //开启定时器0中断 EA = 1; //开启总中断 init(); //LCD初始化 get_time(); //获取时间 while(1) { if(flag) //一秒钟更新一次 { flag = 0; //清除秒钟更新标志 second++; //秒钟加1 if(second == 60) //一分钟更新一次 { second = 0; //秒钟清零 minute++; //分钟加1 if(minute == 60) //一小时更新一次 { minute = 0; //分钟清零 hour++; //小时加1 if(hour == 24) //一天更新一次 { hour = 0; //小时清零 } } } display_time(); //显示时间 } } } ``` 在此代码中,使用定时器0中断来更新时间,一秒钟更新一次。在更新时间时,需要注意进位的问题。最后,将更新后的时间显示在LCD上,实现一个简单的时钟程序
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值