搜索
bottom↓
回复: 17

接收的地址怎样用12864显示出来?

[复制链接]

出0入0汤圆

发表于 2013-1-29 21:17:42 | 显示全部楼层 |阅读模式
例如接收的一帧数据,存放在数组rx[]={0x87,0x81,0x82,0x83,0x84,0x85} ,现在我该怎样用12864液晶显示出来。显示效果如:87 81 82 83等。 以前都是显示字符串的或者十进制数1000,就直接用分离的方法。 可是显示地址,还不知道用什么方法,

  各位,能提供下思路吗?  或者有写过接收数据地址的   讲解下,先谢谢啦!
程序加上:
#include <REGX52.H>
#define uchar unsigned char
#define uint  unsigned int
/* 端口定义*/
#define LCD_data  P0             //数据口
sbit LCD_RS  =  P3^5;            //寄存器选择输入
sbit LCD_RW  =  P3^6;            //液晶读/写控制
sbit LCD_EN  =  P3^4;            //液晶使能控制
sbit LCD_PSB =  P3^7;            //串/并方式控制
sbit wela= P2^7;
sbit dula= P2^6;
uchar rx[]={0xfe,0xee};
//uchar idata Serial_buf[];  /*外部数据缓冲区申明使用*/
uchar code dis1[] = {"地址:00000123187"};
uchar code dis2[] = {"电量:123456.78"};
uchar code dis3[] = {"表号:"};
uchar code dis4[] = {"日期:"};
void Delay(uchar i)  //延时
{
uint j;
for( ;i>0;i--)
   for(j=0;j<700;j++);
}
#define comm  0 //用法:在写命令的时候给零,在写数据的时候给dat 。!
#define dat   1
  
void wr_lcd(uchar dat_comm,uchar content) //是命令为0,数据为1  
{
if(dat_comm)
     LCD_RS = 1; //数据
else  LCD_RS = 0; /*命令*/
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = content;
Delay(5);
    LCD_EN = 1;
Delay(5);
    LCD_EN = 0;   
}
/*********************************************************/
/*                                                       */
/* 设定显示位置                                          */
/* ******************************************************/
void wr_string(uchar x,uchar y0,uchar *p) /*****写字符串********/
{   
uchar pos=0;//初始化  
uchar cnt=0;//传递过来的是指针 ,cnt为偏移量,然后一个字符一个字符的写入。
switch(y0)
{
  case 0: pos=0x80+x;break;
  case 1: pos=0x90+x;break;
  case 2: pos=0x88+x;break;
  case 3: pos=0x98+x;break;
  default: break;
}
wr_lcd(comm,pos);//写地址
while(*(p+cnt)!='\0')//cnt指针偏移量 实现自加,一位位寻址了,
{
  wr_lcd(dat,*(p+cnt));//写地址里面放的数据
  cnt++;
};
}
/*  LCD初始化设定  */
void lcd_init()
{
wela=0;
dula=0;
Delay(5);
    LCD_PSB = 1;         //并口方式  
    wr_lcd(comm,0x30);      //基本指令操作
    wr_lcd(comm,0x0C);      //显示开,关光标
    wr_lcd(comm,0x01);      //清除LCD的显示内容   
}
void LCD_hanshu()
{
    lcd_init();     //初始化LCD  
wr_string(0,0,dis1);   /*分别为:第1列、第1行*/
wr_string(0,1,dis2);   /*分别为:第1列、第2行*/
// wr_string(0,2,Serial_buf);/*表号*/
wr_string(0,3,dis4);         
}
void main(void)
{
LCD_hanshu();/*液晶初始化及显示*/
printf("%x\n",rx); //把rx[]数组里面的数据转换成字符
wr_string(0,2,rx); //把转化的字符显示出来
while(1);
}
难道我格式有问题,编译没有出错,还是? 请各位前辈帮我看看

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2013-1-29 21:55:14 | 显示全部楼层
没看懂,绑定

出0入0汤圆

 楼主| 发表于 2013-1-29 22:31:37 | 显示全部楼层
maxims 发表于 2013-1-29 21:55
没看懂,绑定

我想要结果,就是在12864上 能把我数组a[]={0x80,0x88}
的值在液晶上显示出来!! 有啥方法吗?

出0入0汤圆

发表于 2013-1-29 22:34:01 | 显示全部楼层
583362324 发表于 2013-1-29 22:31
我想要结果,就是在12864上 能把我数组a[]={0x80,0x88}
的值在液晶上显示出来!! 有啥方法吗? ...

都说没看懂了。。。。

问我也白搭,我也是小白菜

出0入0汤圆

发表于 2013-1-29 22:54:44 来自手机 | 显示全部楼层
肯定还是得把十六进制转化为字符串呗~没啥办法了。12864显示的就只能是字符

出0入0汤圆

 楼主| 发表于 2013-1-29 22:56:17 | 显示全部楼层
maxims 发表于 2013-1-29 22:34
都说没看懂了。。。。

问我也白搭,我也是小白菜

没事 蓬蓬人气你嘛!
x=0x81;
x_h=x>>4;
x_l=x&0x0f;

lcd_dispchar(x_h+0x30);//显示8
lcd_dispchar(x_l+0x30);//显示1

这个只能显示一个 16进制的喔, 放在数组里面的 就不行了 a[]={0x76,0x88}
  真心搞不清白!

出0入264汤圆

发表于 2013-1-29 23:01:10 来自手机 | 显示全部楼层
能显示一个,就能显示整个数组,多次调用就可以了。

出0入0汤圆

发表于 2013-1-29 23:15:45 来自手机 | 显示全部楼层
写个小函数将rx数组里的东西批量转化为字符,并按顺序放在一个数组里,然后用屏幕显示,也可以用函数直接返回指向转化后字符串的指针。系统函数库里好像有十六进制到字符串转化函数,记不清了

出0入0汤圆

发表于 2013-1-29 23:29:06 | 显示全部楼层
sprintf。

出0入0汤圆

 楼主| 发表于 2013-1-29 23:43:13 | 显示全部楼层
longwu537 发表于 2013-1-29 23:15
写个小函数将rx数组里的东西批量转化为字符,并按顺序放在一个数组里,然后用屏幕显示,也可以用函数直接返 ...

#include <stdio.h>
#include <stdarg.h>

unsigned int lcd_char_printf(const char *fmt, ...)
{
    char buf[15];

    va_list vp;
    va_start(vp, fmt);
    vsprintf(buf, fmt, vp);

    return wr_string(0,0,buf);
}

是这个函数吗??
新手,真心不知道怎么写!

出105入79汤圆

发表于 2013-1-30 00:42:28 | 显示全部楼层
x=0x81;
x_h=x>>4;
x_l=x&0x0f;

lcd_dispchar(x_h+0x30);//显示8
lcd_dispchar(x_l+0x30);//显示1


楼主这个是有问题的,假如高4位是1111,这样就是15了,‘0’+15可不是‘F’啊。。

出0入0汤圆

发表于 2013-1-30 01:42:19 | 显示全部楼层
本帖最后由 wgui 于 2013-1-30 01:43 编辑

我以前做的查表法,看适用不。每次只能显示2位十六进制。
uchar code HEXLIST[16]="0123456789ABCDEF";
void drawHEX(uchar d,x,y)
{
uchar out[2];
out[0]=HEXLIST[d>>4];
out[1]=HEXLIST[d&0x0f];
drawstring(out,x,y,2);//这个是显示字符串函数
}

出0入0汤圆

 楼主| 发表于 2013-1-31 09:47:01 | 显示全部楼层
wgui 发表于 2013-1-30 01:42
我以前做的查表法,看适用不。每次只能显示2位十六进制。
uchar code HEXLIST[16]="0123456789ABCDEF";
voi ...

问题已解决!! 谢谢!! 程序整理贴后!!

出0入0汤圆

 楼主| 发表于 2013-1-31 09:58:57 | 显示全部楼层
问题已经解决,程序整理 :
#include <REGX52.H>
#include <stdio.h>
#include <stdarg.h>
#define uchar unsigned char
#define uint  unsigned int

/* 端口定义*/
#define LCD_data  P0             //数据口
sbit LCD_RS  =  P3^5;            //寄存器选择输入
sbit LCD_RW  =  P3^6;            //液晶读/写控制
sbit LCD_EN  =  P3^4;            //液晶使能控制
sbit LCD_PSB =  P3^7;            //串/并方式控制
sbit wela= P2^7;
sbit dula= P2^6;
char a[10];
int cnt;
char rx[]={0xfe,0x51,0x30,0x40,0x20};
//uchar idata Serial_buf[];  /*外部数据缓冲区申明使用*/

uchar code dis1[] = {"地址:00000123187"};
uchar code dis2[] = {"电量:123456.78"};
uchar code dis3[] = {"表号:"};
uchar code dis4[] = {"日期:"};

void Delay(uchar i)
{
        uint j;
        for( ;i>0;i--)
          for(j=0;j<700;j++);
}

#define comm  0 //用法:在写命令的时候给零,在写数据的时候给dat 。!
#define dat   1
               
void wr_lcd(uchar dat_comm,uchar content) //是命令为0,数据为1  
{
        if(dat_comm)
            LCD_RS = 1; //数据
        else  LCD_RS = 0; /*命令*/
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = content;
        Delay(5);
    LCD_EN = 1;
        Delay(5);
    LCD_EN = 0;         
}
/*********************************************************/
/*                                                       */
/* 设定显示位置                                          */
/* ******************************************************/

void wr_string(uchar x,uchar y0,uchar *p) /*****写字符串********/
{   
        uchar pos=0;//初始化         
        uchar cnt=0;//传递过来的是指针 ,cnt为偏移量,然后一个字符一个字符的写入。
        switch(y0)
        {
                case 0: pos=0x80+x;break;
                case 1: pos=0x90+x;break;
                case 2: pos=0x88+x;break;
                case 3: pos=0x98+x;break;
                default: break;
        }
        wr_lcd(comm,pos);//写地址       
        while(*(p+cnt)!='\0')//cnt指针偏移量 实现自加,一位位寻址了,
        {
                wr_lcd(dat,*(p+cnt));//写地址里面放的数据
                cnt++;
        }
}
/*  LCD初始化设定  */
void lcd_init()
{
        wela=0;
        dula=0;
        Delay(5);
    LCD_PSB = 1;         //并口方式  
    wr_lcd(comm,0x30);      //基本指令操作
    wr_lcd(comm,0x0C);      //显示开,关光标
    wr_lcd(comm,0x01);      //清除LCD的显示内容   
}
void LCD_hanshu()
{
    lcd_init();     //初始化LCD  
        wr_string(0,0,dis1);   /*分别为:第1列、第1行*/
        wr_string(0,1,dis2);   /*分别为:第1列、第2行*/
        wr_string(0,3,dis4);         
}

void lcd_char_printf(const char *fmt,...) //kei中自带的转字符串输出函数
                                         //具体可自行查阅相关资料。
{
    char buf[15],b;
    va_list vp;
    va_start(vp, fmt);
    vsprintf(buf, fmt, vp);
    wr_string(b,2,buf);
        b++;
        if(b>5) //这是根据你自己定义的数组值来确定的
           b=0;
}

void main(void)
{       
    char i;
        LCD_hanshu();/*液晶初始化及显示*/
        for(i=0;i<5;i++)
        {       
                lcd_char_printf("%bx",rx[i]); //这是调用函数rx[i]为自定义的数组
        }
         while(1);
}

出0入0汤圆

 楼主| 发表于 2013-1-31 10:01:19 | 显示全部楼层
maxims 发表于 2013-1-29 21:55
没看懂,绑定

问题 已解决,程序贴后!!

出0入0汤圆

发表于 2013-2-3 23:09:56 来自手机 | 显示全部楼层
看看,受益匪浅

出0入0汤圆

发表于 2013-6-12 17:11:26 | 显示全部楼层
看看

出0入0汤圆

发表于 2014-9-13 20:35:59 | 显示全部楼层
谢谢谢谢  我也遇到这方面的问题,不过我的是串驱的 借鉴你的改改看能不能搞定
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 02:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表