51单片机 LCD1602 液晶显示

首先,我们把程序所有的功能都使用函数模块化了,这样非常有利于程序的维护,不管
要写一个什么样的功能,只要调用相应的函数就可以了,大家注意学习这种编程方法。
其次,我们使用液晶的习惯,也是用数学上的(x,y)坐标来进行屏幕定位,但与数学坐标
系不同的是,液晶的左上角的坐标是 x=0,y=0,往右边是 x+偏移,下边是 y+偏移。
第三,第一次接触多个参数传递的函数,而且还带了指针类型的参数,所以多留心熟悉
一下。
第四,读写数据和指令程序,每次都必须进行“忙”判断。
第五,领略一下指针在这个地方的巧妙用法,你可以尝试不用指针改写程序试试,感受
一下指针的优势。

//lcd1602.h 文件

#ifndef _LCD1602_H_
#define _LCD1602_H_
#include <reg52.h>

#define LCD1602_DB P0

sbit LCD1602_RS = P1^0;
sbit LCD1602_RW = P1^1;
sbit LCD1602_E = P1^5;

/**等待液晶准备好**/
void Lcdwaitready();

/**向LCD1602写入一个字节命令,cmd-待写入命令值**/
void LcdWriteCmd(unsigned char cmd);

/**向LCD1602液晶写入一字节数据,dat—待写入数据**/
void LcdWriteDat(unsigned char dat);

/**设置显示RAM起始地址,即光标位(X,Y)**/
void LcdSetCursor(unsigned char x,unsigned char y);

/*在液晶上显示字符串*/
void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str);

/*液晶输出数字*/
void LCDNumPrint(uint num)

/*初始化LCD1602液晶*/
void InitLcd1602();

#endif

//lcd1602.c 文件

#include "lcd1602.h"

/**等待液晶准备好**/
void LcdwaitReady(){
	unsigned char sta;
	LCD1602_DB = 0xff;
	LCD1602_RS = 0;
	LCD1602_RW = 1;
	do{
		LCD1602_E = 1;
		sta  =LCD1602_DB;//读取状态字
		LCD1602_E = 0;
	}while(sta & 0x80);
}

/**向LCD1602写入一个字节命令,cmd-待写入命令值**/
void LcdWriteCmd(unsigned char cmd){
	LcdwaitReady();
	LCD1602_RS = 0;
	LCD1602_RW = 0;
	LCD1602_DB = cmd;
	LCD1602_E = 1;
	LCD1602_E = 0;
}

/**向LCD1602液晶写入一字节数据,dat—待写入数据**/
void LcdWriteDat(unsigned char dat){
	LcdwaitReady();
	LCD1602_RS = 1;
	LCD1602_RW = 0;
	LCD1602_DB = dat;
	LCD1602_E = 1;
	LCD1602_E = 0;
}

/**设置显示RAM起始地址,即光标位(X,Y)**/
void LcdSetCursor(unsigned char x,unsigned char y){
	unsigned char address;
	if(y == 0){
		address = 0x00 + x;
	}else{
		address = 0x40 + x;
	}
	LcdWriteCmd(address | 0x80);
}

/*在液晶上显示字符串*/
void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str){
	LcdSetCursor(x,y);
	while(*str != '\0'){
		LcdWriteDat(*str++);
	}
}

/*液晶输出数字*/
void LCDNumPrint(uint num)
{
        //LcdWriteDat(num/1000 + 0x30);//num的千位//因为LCD1602显示的数字0,是用0x30表示的,也可以把0当做字符显示
        LcdWriteDat(num % 1000 / 100 + 0x30);//num的百位
        LcdWriteDat(num % 100 /10 + 0x30);//num的十位
				LcdWriteDat('.');//num的个位
        LcdWriteDat(num % 10 + 0x30);//num的个位
				
}

/*初始化LCD1602液晶*/
void InitLcd1602(){
	LcdWriteCmd(0x38);//16*2显示 5*7点阵,8位数据接口
	LcdWriteCmd(0x0c);//显示器开,光标关闭
	LcdWriteCmd(0x06);//文字不动,地址自动加1
	LcdWriteCmd(0x01);//清屏
}


//主函数

#include "lcd1602.h"

void InitLcd1602();
void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str);

void main(){

	unsigned char str[] ="Hello ^_^!!";
	InitLcd1602();//初始化
	LcdShowStr(2,0,str);
	LcdShowStr(0,1,"SKT-51");
	while(1);
}
展开阅读全文
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值