标题: 求老师指点关于1602液晶具体显示在那个地方的问题 [打印本页]

作者: fujian2014    时间: 2014-11-3 11:58
标题: 求老师指点关于1602液晶具体显示在那个地方的问题
老师们,我想把1602的液晶行和列显示弄成disply(0,1,'a');
就是说想显示在屏幕上那一点就直接调用disply();
那怎么编程呢,我编的始终有错误求指点



作者: fujian2014    时间: 2014-11-3 12:02
我附上1602的程序假如要显示ABCD在第一行第3位开始和EFG在第二行第4位显示呢求大神指点
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P3^5;
sbit wr=P3^6;
sbit lcden=P3^4;
sbit dula=P2^6;
sbit wela=P2^7;
uchar table1[]="PL-51STAR MCU";
uchar table2[]="WWW.51hei.COM";
void delay(uint x)
{
        uint a,b;
        for(a=x;a>0;a--)
                for(b=10;b>0;b--);
}

void write_com(uchar com)         //些命令,RS=0
{
        P0=com;
           wr=0;
        rs=0;
        lcden=0;
        delay(10);
        lcden=1;
        delay(10);
        lcden=0;
        
}

void write_data(uchar dat)           //写数据,RS=1
{
        P0=dat;
        wr=0;
        rs=1;
        lcden=0;
        delay(10);
        lcden=1;
        delay(10);
        lcden=0;
        
}

void init()
{
        dula=0;
        wela=0;
        write_com(0x38);   //显示模式设置:16×2显示,5×7点阵,8位数据接口
        delay(20);
        write_com(0x0f);   //显示模式设置
        delay(20);
        write_com(0x06);   //显示模式设置:光标右移,字符不移
        delay(20);
        write_com(0x01);   //清屏幕指令,将以前的显示内容清除
        delay(20);        
}
void main()
{
        
        init();                          //1602初始化
        
        while(1);
}
作者: fujian2014    时间: 2014-11-3 12:04
void frmxy( char x , char y) {  if(y==0)x=x|0x80;  else x=x|0xc0;  write_com(x);  write_data(led);  }
作者: sadfasd    时间: 2014-11-3 12:45

作者: dgahz    时间: 2014-11-3 18:12
disply(char x,char y,char *p,)
作者: fujian2014    时间: 2014-11-3 19:27

        void frmxy( char x , char y ,char *p ,uchar count)
        {
          uchar i;
          for(i=0;i<*p;i++)
         {
          
         if(y==0)x=x|0x80;
         else x=x|0xc0;
         write_com(x);
         write_data(*p);
         x++;
         p++;
       
        }
         }

作者: fujian2014    时间: 2014-11-3 19:35
为啥我的程序能显示字符在那一列和行
frm(0,1,xiexie,6);这样的能显示出来但是放进一个简单按S2加1就错了
disdata[0]=count/10;
frm(0,1,disdata,1);就错了不解啊
作者: fujian2014    时间: 2014-11-3 19:35
dgahz 发表于 2014-11-3 18:12
disply(char x,char y,char *p,)

   void frmxy( char x , char y ,char *p ,uchar count)
        {
          uchar i;
          for(i=0;i<*p;i++)
         {
         
         if(y==0)x=x|0x80;
         else x=x|0xc0;
         write_com(x);
         write_data(*p);
         x++;
         p++;
        
        }
         }
作者: fujian2014    时间: 2014-11-3 19:35
dgahz 发表于 2014-11-3 18:12
disply(char x,char y,char *p,)

为啥我的程序能显示字符在那一列和行
frm(0,1,xiexie,6);这样的能显示出来但是放进一个简单按S2加1就错了
disdata[0]=count/10;
frm(0,1,disdata,1);就错了不解啊
作者: dgahz    时间: 2014-11-3 20:16
  fujian2014 发表于 半小时前
void frmxy( char x , char y ,char *p ,uchar count)
        {
          uchar i;
          for(i=0;i<*p;i++)
         {
         
         if(y==0)x=x|0x80;
         else x=x|0xc0;
         write_com(x);
         write_data(*p);
         x++;
         p++;
        
        }
         }

count在函数体中没让它起作用
作者: fujian2014    时间: 2014-11-3 22:59
dgahz 发表于 2014-11-3 20:16
count在函数体中没让它起作用

老师我想让1602显示动态的数据有啥方法吗;
我不会,你最好了,能用1602举个例子吗

作者: fujian2014    时间: 2014-11-3 23:01
dgahz 发表于 2014-11-3 20:16
count在函数体中没让它起作用

1602我的程序发不过来,说要审核
作者: dgahz    时间: 2014-11-4 09:42
本帖最后由 dgahz 于 2014-11-4 09:55 编辑

void frmxy( char x , char y ,char *p ,uchar count)
        {
          uchar i;
                 char disdata[]="=00" ;
                  disdata[1]=count/10+0x30;
                  disdata[2]=count%10+0x30;
                 if(y==0)x=x|0x80;
         else x=x|0xc0;
         write_com(x);
          for(;*p!='\0';p++)
         {
                         write_data(*p);
         }
          for(i=0;i<3;i++)
                 {
          write_data(disdata[ i ]);
         }
        
        

作者: dgahz    时间: 2014-11-4 09:59
count只限于100变化内显示
作者: fujian2014    时间: 2014-11-5 09:17
谢谢喽
作者: 三元里    时间: 2015-1-7 15:30
dgahz 发表于 2014-11-4 09:42
void frmxy( char x , char y ,char *p ,uchar count)
        {
          uchar i;

  disdata[1]=count/10+0x30;
                  disdata[2]=count%10+0x30;

我向您求教,求余后为什么都+0x30
作者: dgahz    时间: 2015-1-7 17:27
因为0的字符码是0x30.1是0x31,一直到9是0x39;
作者: dgahz    时间: 2015-1-7 17:28
因为0的字符码是0x30.1是0x31,一直到9是0x39;
作者: 三元里    时间: 2015-1-7 18:06
dgahz 发表于 2015-1-7 17:28
因为0的字符码是0x30.1是0x31,一直到9是0x39;

那为什么要加个0字符?请教!
作者: dgahz    时间: 2015-1-7 18:46
十六进制格式为0x数字。
作者: dgahz    时间: 2015-1-7 18:50


作者: dgahz    时间: 2015-1-7 18:51
百度1602字符手册
作者: 三元里    时间: 2015-1-7 18:58
dgahz 发表于 2015-1-7 18:46
十六进制格式为0x数字。

不明白为什么要加上这个代表0字符的十六进制数0x30?烦指导,初学。
作者: dgahz    时间: 2015-1-7 19:07
要显示0,输入0x30;显1输0x31;2输入0x32;3输入0x33;9输入0x39;
1+0x30=0x31;2+0x30=0x32;9+0x30=0x39;0+0x30=0x30
作者: dgahz    时间: 2015-1-7 19:20


作者: 三元里    时间: 2015-1-7 19:29
dgahz 发表于 2015-1-7 18:46
十六进制格式为0x数字。

谢了!在您的指导下基本明白了,原来ASCII码的0字符代码是十进制的48,1字符代码是十进制的49,2字符代码是十进制的50......,又因为十进制的48就是十六进制的0X30,所以都应加上0X30。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1