微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 基于C51单片机怎样让1602显示一个变量啊?新手求大神指教

基于C51单片机怎样让1602显示一个变量啊?新手求大神指教

时间:10-02 整理:3721RD 点击:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^5;
sbit rw=P2^6;
sbit e=P2^7;
uchar sz1[]="     a      !";
uchar sz2[]="--------56----  ";
void delay_50us(uint t)
{
     uchar j;
    for(;t>0;t--)
    for(j=19;j>0;j--);
}
void delay_50ms(uint t)
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_50us(100);
e=1;
delay_50us(100);
e=0;
}
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_50us(100);
e=1;
delay_50us(100);
e=0;
}
void init(void)
{
delay_50us(300);
write_com(0x38);
delay_50us(100);
write_com(0x38);
delay_50us(100);
write_com(0x38);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}
void main()
{
    uchar k;
init ();
write_com(0x81);
for(k=0;k<16;k++)
{
  write_data(sz1[k]);
  delay_50us;
}
write_com(0x80 + 0x40);
  for(k=0;k<16;k++)
{
  write_data(sz2[k]);
  delay_50us;
}
while(1);
}
这是这两天学习1602写的一个程序,但是我想做一个电子称需要它显示传感器传回的任意值,于是就首先要实现1602显示变量,但是想了很久都还没有找到实现办法,还请大神能帮帮我,感激不尽!

//我在你的程序上少稍作了修改,希望可以帮到你。
/**********************************************************
                                        修改版
**********************************************************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//定义初始显示位置
#define Addr    0
//在这里定义一个全局变量,这个变量代表电子秤测量值
uchar NewVallue=0;
//这个是你源程序定义的数组,我将它放到这了里,应为下面要用到。
uchar sz1[]="     a      !";
//下面将这个变量分解
sz1[Addr]=NewValue/100 +0x30;
sz1[Addr+1]=NewValue%100/10 +0x30;
sz1[Addr+2]=NewValue%100%10 +0x30;
sbit rs=P2^5;
sbit rw=P2^6;
sbit e=P2^7;
//uchar sz1[]="     a      !";
uchar sz2[]="--------56----  ";
void delay_50us(uint t)
{
     uchar j;
    for(;t>0;t--)
    for(j=19;j>0;j--);
}
void delay_50ms(uint t)
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_50us(100);
e=1;
delay_50us(100);
e=0;
}
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_50us(100);
e=1;
delay_50us(100);
e=0;
}
void init(void)
{
delay_50us(300);
write_com(0x38);
delay_50us(100);
write_com(0x38);
delay_50us(100);
write_com(0x38);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}
void main()
{
    uchar k;
init ();
write_com(0x81);
for(k=0;k<16;k++)
{
  write_data(sz1[k]);
  delay_50us;
}
write_com(0x80 + 0x40);
  for(k=0;k<16;k++)
{
  write_data(sz2[k]);
  delay_50us;
}
while(1);
}

非常感谢,先前也想到过拆分,但是对于具体怎么操作还是不清楚,谢谢帮忙!

,其实最根本的解决办法还是要用函数将功能封装起来,这样以后用着也方便。比如你可以写这样两个函数:
一,显示字符函数,void DisplayChar(unsigned char Addr,unsigned char dat)
注:Addr表示显示位置,dat表示要显示的字符。
二,显示字符串函数 ,void DisplayString(unsigned char Addr,unsigned char*pdat)
注:Addr表示字符串起始显示位置,pdat表示要显示的字符。
     这样以后你要显示数据就很简单啦,比如你要显示当前测量值(NewValue)就可以这样写:
DisplayString(0,"Value is :");
DisplayChar(8,DisplayChar/100+0x30);
DisplayChar(9,DisplayChar%100/10+0x30);
DisplayChar(10,DisplayChar%100%10+0x30);



多谢指教!

顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶

能详细说说分解的作用吗?谢谢啦

好东西顶顶顶顶顶顶顶顶

厉害厉害!解决了好多问题

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top