标题:
单片机控制LCD1602显示电压和角度值的代码
[打印本页]
作者:
samo_xyh
时间:
2018-8-30 16:23
标题:
单片机控制LCD1602显示电压和角度值的代码
LCD1602
单片机源程序如下:
#include "include.h"
//LCD1602
/********IO引脚定义***********************************************************/
sbit LCD_RS=P1^0;//定义引脚
sbit LCD_RW=P1^1;
sbit LCD_E=P1^2;
/********宏定义***********************************************************/
#define LCD_Data P0
#define Busy 0x80 //用于检测LCD状态字中的Busy标识
/********数据定义*************************************************************/
//unsigned char code uctech[] = {"MCU218"};
/***********主函数开始********************************************************/
/*
void main(void)
{
Delay400Ms(); //启动等待,等LCD讲入工作状态
LCDInit(); //初始化
Delay5Ms(); //延时片刻(可不要)
DisplayListChar(0, 0, uctech);
DisplayOneChar(4, 1, 'a');
ReadDataLCD(); //测试用句无意义
while(1);
}
*/
/***********写数据********************************************************/
void WriteDataLCD(unsigned char WDLCD)
{
ReadStatusLCD(); //检测忙
LCD_Data = WDLCD;
LCD_RS = 1;
LCD_RW = 0;
LCD_E = 0; //若晶振速度太高可以在这后加小的延时
LCD_E = 0; //延时
LCD_E = 1;
}
/***********写指令********************************************************/
void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCD(); //根据需要检测忙
LCD_Data = WCLCD;
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 0;
LCD_E = 0;
LCD_E = 1;
}
/***********读数据********************************************************/
unsigned char ReadDataLCD(void)
{
LCD_RS = 1;
LCD_RW = 1;
LCD_E = 0;
LCD_E = 0;
LCD_E = 1;
return(LCD_Data);
}
/***********读状态*******************************************************/
unsigned char ReadStatusLCD(void)
{
LCD_Data = 0xFF;
LCD_RS = 0;
LCD_RW = 1;
LCD_E = 0;
LCD_E = 0;
LCD_E = 1;
while (LCD_Data & Busy); //检测忙信号
return(LCD_Data);
}
/***********初始化********************************************************/
void LCDInit(void)
{
LCD_Data = 0;
WriteCommandLCD(0x38,0); //三次模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCD(0x38,0);
Delay5Ms();
WriteCommandLCD(0x38,0);
Delay5Ms();
WriteCommandLCD(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCD(0x08,1); //关闭显示
WriteCommandLCD(0x01,1); //显示清屏
WriteCommandLCD(0x06,1); //显示光标移动设置
WriteCommandLCD(0x0C,1); //显示开及光标设置
}
/***********按指定位置显示一个字符*******************************************/
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; //算出指令码
WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
WriteDataLCD(DData);
}
/***********按指定位置显示一串字符*****************************************/
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>=0x20){ //若到达字串尾则退出
if (X <= 0xF){ //X坐标应小于0xF
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++;
X++;
}
}
}
/***********短延时********************************************************/
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
/***********长延时********************************************************/
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
}
}
//显示AD转换值
void display_AD_value(unsigned int result)
{
int i=0;
unsigned int temp=0;
unsigned char str[3];
unsigned int j=100;
unsigned char k=0;
DisplayOneChar(0, 0, 'U'); //显示单个字符
DisplayOneChar(1, 0, '='); //显示单个字
DisplayOneChar(6, 0, 'V'); //显示单个字符
for(i=0; i<=2; i++)
{
temp=result/j;
result=result-j*temp;
str[i]=(unsigned char)(temp+0x30);
j/=10;
}
for(k=0,i=0; i<4; k++,i++)
{
if(i==0)
DisplayOneChar(k+2, 0, str[i]); //显示单个字符
else if(i==1)
DisplayOneChar(k+2, 0, '.'); //显示单个字符
else
{
DisplayOneChar(k+2, 0, str[i-1]); //显示单个字符
}
}
}
//显示电机转动角度
void display_motor_rotaition(unsigned int result)
{
int i=0;
unsigned int temp=0;
unsigned char str[4];
unsigned int j=1000;
unsigned char k=0;
DisplayOneChar(0, 1, 'A'); //显示单个字符
DisplayOneChar(1, 1, 'n'); //显示单个字
DisplayOneChar(2, 1, 'g'); //显示单个字符
DisplayOneChar(3, 1, '='); //显示单个字符
DisplayOneChar(9, 1, 'd'); //显示单个字符
DisplayOneChar(10, 1, 'u'); //显示单个字符
for(i=0; i<=3; i++)
{
temp=result/j;
result=result-j*temp;
str[i]=(unsigned char)(temp+0x30);
j/=10;
}
for(k=0,i=0; i<5; k++,i++)
{
if(i==4)
DisplayOneChar(k+4, 1, str[i-1]); //显示单个字符
else if(i==3)
DisplayOneChar(k+4, 1, '.'); //显示单个字符
else
{
DisplayOneChar(k+4, 1, str[i]); //显示单个字符
}
}
}
复制代码
所有资料51hei提供下载:
LCD1602.rar
(8.88 KB, 下载次数: 13)
2018-8-30 16:21 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2018-8-30 17:04
补全原理图或者详细说明一下电路连接即可获得100+黑币
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1