打印

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

[复制链接]
4122|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hhchenxinag|  楼主 | 2013-1-29 15:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hhchenxinag 于 2013-1-29 17:09 编辑

例如接收的一帧数据,存放在数组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);
}
难道我格式有问题,编译没有出错,还是? 请各位前辈帮我看看

相关帖子

沙发
ayb_ice| | 2013-1-29 15:52 | 只看该作者
有什么大不一样吗

如果有字库,就发各个数字的ASCII码,如果没有则发数字的点阵数据即可

使用特权

评论回复
板凳
ccxlslr| | 2013-1-29 15:55 | 只看该作者
用printf

使用特权

评论回复
地板
ccxlslr| | 2013-1-29 16:00 | 只看该作者
#include <stdio.h>
#include <stdarg.h>

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

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

    return lcd_char_puts(buf);
}

任何输出设备,你只需要一个输出字符串函数,都能用printf。

使用特权

评论回复
5
hhchenxinag|  楼主 | 2013-1-29 16:05 | 只看该作者
ayb_ice 发表于 2013-1-29 15:52
有什么大不一样吗

如果有字库,就发各个数字的ASCII码,如果没有则发数字的点阵数据即可 ...

内带字库!

使用特权

评论回复
6
hhchenxinag|  楼主 | 2013-1-29 17:10 | 只看该作者
ccxlslr 发表于 2013-1-29 15:55
用printf

我程序加上了 可以还是不行, 用printf 输出数组里面的。 望指点。,

使用特权

评论回复
7
hhchenxinag|  楼主 | 2013-1-29 17:12 | 只看该作者
ccxlslr 发表于 2013-1-29 16:00
#include
#include

这个大哥你好,小弟新手,有些看不懂,刚把程序贴上了,望指点下!

使用特权

评论回复
8
ccxlslr| | 2013-1-29 17:20 | 只看该作者
首先你的字符串输出函数,要能输出“ABCDEF”,类似的字符串,其次你要会用printf

你上程序吧,我的全发出来了。我的LCD就这样显示的

使用特权

评论回复
9
hhchenxinag|  楼主 | 2013-1-29 17:22 | 只看该作者
ccxlslr 发表于 2013-1-29 17:20
首先你的字符串输出函数,要能输出“ABCDEF”,类似的字符串,其次你要会用printf

你上程序吧,我的全发出 ...

我程序贴出来了!! 麻烦在看下!!感谢!

使用特权

评论回复
10
ccxlslr| | 2013-1-29 17:30 | 只看该作者
本帖最后由 ccxlslr 于 2013-1-29 17:32 编辑

你弄错了吧,我要你写LCD的printf,我上面贴了代码,Keil下的printf是输出到串口的。
而要完成上面的printf,你得写一个输出字符串到LCD的函数。
这个函数你有了,加入到上面的程序就可以了

使用特权

评论回复
11
ccxlslr| | 2013-1-29 17:34 | 只看该作者
#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);
}

输出调用 lcd_char_printf
printf 不能输出数组,要循环,一个一个的输出

使用特权

评论回复
12
hhchenxinag|  楼主 | 2013-1-29 18:47 | 只看该作者
本帖最后由 hhchenxinag 于 2013-1-29 18:50 编辑
ccxlslr 发表于 2013-1-29 17:30
你弄错了吧,我要你写LCD的printf,我上面贴了代码,Keil下的printf是输出到串口的。
而要完成上面的printf, ...


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

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

   return buf;         //return wr_string(0,2,buf) 出错
}
  
void main(void)
{        
    uchar i;
        LCD_hanshu();/*液晶初始化及显示*/
               
        for(i=0;i<10;i++)
        {        
                //lcd_char_printf(rx);
                a【i】=lcd_char_printf(rx);  //把rx数组数据经过这个函数转换,return一个buf
                                            //再送到数组a中 在执行下面函数。
        }
        wr_string(0,2,a); //把转化的字符显示出来
        while(1);
}
这样 写有显示了 但是都是乱码!! 呜呜!! 一个函数这么难搞 哎!!

使用特权

评论回复
13
ningling_21| | 2013-1-29 19:43 | 只看该作者
显示:0x81
x=0x81;
x_h=x>>4;
x_l=x&0x0f;

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

使用特权

评论回复
14
hhchenxinag|  楼主 | 2013-1-29 20:20 | 只看该作者
ningling_21 发表于 2013-1-29 19:43
显示:0x81
x=0x81;
x_h=x>>4;

定义一个x=0x80;能显示出来,可以把数据放在数组里面 在来显示就不行了 始终是00
uchar a[]={0x80,0x81,0x82}
rx_h=a[1]>>4;//
rx_l=a[1]&0x0f;//
wr_data(0,2,rx_h+0x30);
wr_data(1,2,rx_l+0x30);

使用特权

评论回复
15
在山上| | 2013-1-29 21:00 | 只看该作者
怎么感觉像是1602的程序啊  求解    !!

使用特权

评论回复
16
hhchenxinag|  楼主 | 2013-1-29 21:07 | 只看该作者
在山上 发表于 2013-1-29 21:00
怎么感觉像是1602的程序啊  求解    !!

这是12864的程序,都是并行传输数据~

使用特权

评论回复
17
ningling_21| | 2013-1-29 22:08 | 只看该作者
hhchenxinag 发表于 2013-1-29 20:20
定义一个x=0x80;能显示出来,可以把数据放在数组里面 在来显示就不行了 始终是00
uchar a[]={0x80,0x81, ...

wr_data(...);//这个函数可能有问题。

使用特权

评论回复
18
hhchenxinag|  楼主 | 2013-1-29 22:27 | 只看该作者
ningling_21 发表于 2013-1-29 22:08
wr_data(...);//这个函数可能有问题。


void wr_data(uchar x,uchar y0,uchar date )
{
  uchar pos=0;
  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);//12864液晶地址
  wr_lcd(dat,date);// 数据
}
其它都跟前面一样的, !!卡在这里了,下面 就没法做啊!! 哎!!

使用特权

评论回复
19
link8001| | 2013-1-30 08:28 | 只看该作者
hhchenxinag 发表于 2013-1-29 22:27
void wr_data(uchar x,uchar y0,uchar date )
{
  uchar pos=0;

wr_data(1,2,rx_l+0x30)这个有问题,12864只能写偶数位地址,如wr_data(2,2...)
wr_data(4,2...)
void wr_data(uchar x,uchar y0,uchar date )中的x只能为偶数

使用特权

评论回复
20
ccxlslr| | 2013-1-30 09:03 | 只看该作者
本帖最后由 ccxlslr 于 2013-1-30 09:10 编辑

你那个字符串没有返回的,你就别返回了,还是用我那个程序。

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

unsigned int lcd_char_printf(const char *fmt, ...)

lcd_char_printf("%bd", rx)
{
    char buf[15];

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

    wr_string(0,0,buf);
    return 0;
}

printf 不是这样用的
lcd_char_printf("%bX", rx【i】);


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

50

帖子

0

粉丝