yuyu87 发表于 2012-11-6 13:39:13

C语言基础问题,求指点,指针

本帖最后由 yuyu87 于 2012-11-6 13:41 编辑

void lcd_cls(uint16_t color){                               
        uint8_t cReg;
        cReg=color>>8;                //高字节在前
        cReg=(uint8_t)color&0xff;
        lcd_write_cmd(0x52,cReg,2); //现在采用的方法,这里 此函数第二个参数是uint8_t 的指针,


我现在用的这种方法感觉有些麻烦,多余,但我直接传递color的指针编译时会出错,,
lcd_write_cmd(0x52,&color,2);因为color是16位的,传递给8位指针会出问题,
lcd_write_cmd(0x52,(uint8_t)&color,2); 这样也是一样的结果,
求大家指点,在线求解答

补充:
void lcd_write_cmd(uint8_t cmd,uint8_t *option,uint32_t len);
函数申明       

sxmilovebb2 发表于 2012-11-6 14:20:03

lcd_write_cmd(0x52,(uint8_t)&color,2); 这样也是一样的结果,
----------难道编译器没WARNING提示?应该是 (uint8_t *)&color不?

jameszxj 发表于 2012-11-6 15:42:05

lcd_write_cmd(0x52,(uint8_t *)&color,2);

yuyu87 发表于 2012-11-6 13:41:13

也就是16位的颜色要传递给8位指针

sf49ers 发表于 2012-11-6 13:53:54

color用union呢

yuyu87 发表于 2012-11-6 14:17:19

是的,联合是可以的,但有没有直接点的方法传递指针?

yuyu87 发表于 2012-11-6 14:21:11

typedef union {
        uint8_t c8;
        uint16_t c16;
}color_def;


void lcd_cls(color_def color){                                //以指定颜色清屏,叵为0则用背景色清屏
        if(color.c16)
                lcd_write_cmd(0x52,&color.c8,2);
        else
                lcd_write_cmd(0x52,0x0,0);
       


好吧,暂时这样用

leavic 发表于 2012-11-6 16:56:04

jameszxj 发表于 2012-11-6 15:42 static/image/common/back.gif
lcd_write_cmd(0x52,(uint8_t *)&color,2);

这样写在语法上是通过的,结果上还是错的,M3是little endian的,MSB在高地址,LSB在低地址,这样传递过去以后,先写了低8位,后写高8位,数据就错了。

jameszxj 发表于 2012-11-6 18:02:54

leavic 发表于 2012-11-6 16:56 static/image/common/back.gif
这样写在语法上是通过的,结果上还是错的,M3是little endian的,MSB在高地址,LSB在低地址,这样传递过 ...

这跟楼主用联合的结果应该是一样的,至于little endian还是big endian的问题,应该用宏定义等其他方式来确定方式。

jisaowang 发表于 2012-11-8 03:14:12

这种刷屏函数本身效率已经低的令人发指了,再改还是残废,直接自己写一个吧,填个颜色还要传指针是要死人的

jisaowang 发表于 2012-11-8 03:15:43

leavic 发表于 2012-11-6 16:56
这样写在语法上是通过的,结果上还是错的,M3是little endian的,MSB在高地址,LSB在低地址,这样传递过 ...

你可以在写颜色的时候就字节倒序。。。用dma刷spi的液晶我就是那么干的,定义颜色的时候就倒过来。。。。
页: [1]
查看完整版本: C语言基础问题,求指点,指针