我想要在LCD1602显示当前电流值
时间: 2024-02-25 13:55:50 浏览: 20
好的,你可以使用51单片机的另一个IO口连接LCD1602,通过LCD1602显示当前电流值。以下是修改后的代码:
```c
#include <reg52.h>
#include <intrins.h>
#define ADC0832_DATA P0
#define ADC0832_CS P1_0
#define ADC0832_CLK P1_1
sbit LED = P2_0; //定义LED指示灯
sbit RS = P2_6; //LCD1602的RS引脚
sbit RW = P2_5; //LCD1602的RW引脚
sbit E = P2_7; //LCD1602的E引脚
void delay(int time) //延时函数
{
int i, j;
for(i = time; i > 0; i--)
for(j = 110; j > 0; j--);
}
void initADC0832() //初始化ADC0832
{
ADC0832_CS = 1; //片选禁止
ADC0832_CLK = 0; //时钟置0
}
unsigned char getADC0832Data() //获取ADC0832数据
{
unsigned char i, result = 0;
ADC0832_CS = 0; //片选使能
_nop_(); //空操作
_nop_();
_nop_();
for(i = 0; i < 8; i++)
{
ADC0832_CLK = 1; //时钟置1
_nop_();
_nop_();
_nop_();
result <<= 1; //左移一位
result |= ADC0832_DATA; //读取数据
ADC0832_CLK = 0; //时钟置0
}
ADC0832_CS = 1; //片选禁止
return result; //返回结果
}
void writeCommand(unsigned char command) //写指令函数
{
RS = 0; //将RS置0
RW = 0; //将RW置0
E = 1; //将E置1
P0 = command; //将指令写入P0口
E = 0; //将E置0
delay(5); //延时5毫秒
}
void writeData(unsigned char data) //写数据函数
{
RS = 1; //将RS置1
RW = 0; //将RW置0
E = 1; //将E置1
P0 = data; //将数据写入P0口
E = 0; //将E置0
delay(5); //延时5毫秒
}
void initLCD1602() //初始化LCD1602
{
writeCommand(0x38); //设置显示模式为16x2、5x7点阵、8位数据
writeCommand(0x0c); //设置显示开关、光标开关、光标闪烁开关,显示开,光标和闪烁关闭
writeCommand(0x06); //设置字符输入方式为左移,不移动屏幕
writeCommand(0x01); //清屏
}
void displayCurrent(unsigned char current) //显示当前电流值
{
unsigned char high = current / 100; //计算百位数
unsigned char mid = (current % 100) / 10; //计算十位数
unsigned char low = current % 10; //计算个位数
writeCommand(0x80); //将光标移动到第一行第一列
writeData('C'); //显示'C'
writeData('u'); //显示'u'
writeData('r'); //显示'r'
writeData('r'); //显示'r'
writeData('e'); //显示'e'
writeData('n'); //显示'n'
writeData('t'); //显示't'
writeData(':'); //显示':'
writeData(high + '0'); //显示百位数
writeData(mid + '0'); //显示十位数
writeData(low + '0'); //显示个位数
}
void main()
{
unsigned char adcData = 128; //设置初始电流值为一半
initADC0832(); //初始化ADC0832
initLCD1602(); //初始化LCD1602
while(1)
{
adcData = getADC0832Data(); //获取ADC0832数据
if(adcData > 127) //判断ADC0832输出电流是否大于一半
LED = 1; //LED指示灯亮
else
LED = 0; //LED指示灯灭
displayCurrent(adcData); //显示当前电流值
delay(100); //延时100毫秒
}
}
```
在`displayCurrent`函数中,首先计算出电流值的百位、十位和个位数,然后依次将它们显示在LCD1602上。需要注意的是,在每次显示电流值之前,需要先将LCD1602清屏,否则会出现残留的字符。