OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7129|回复: 13

移植原子哥ADC到LCD1602顯示出現類型錯誤

[复制链接]

51

主题

340

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3275
金钱
3275
注册时间
2013-9-21
在线时间
281 小时
发表于 2014-6-30 20:24:55 | 显示全部楼层 |阅读模式
5金钱
拜托大神们解答不知道为什么原子的变量可以在LCD显示一样的变量换到LCD1602显示就不行了
移植原子哥ADC到LCD16902显示出现类型错误
错误代码error:  #167: argument of type "u16" is incompatible with parameter of type "u8 *"


   
以下红色部分是我修改的

adcx=Get_Adc_Average(ADC_Channel_1,10);
        //LCD_ShowxNum(156,130,adcx,4,16,0);
        LCD_Setpos_DisplayString(0,1,adcx);
        temp=(float)adcx*(3.3/4096);
        adcx=temp;
        //LCD_ShowxNum(156,150,adcx,1,16,0);
        LCD_Setpos_DisplayString(0,1,adcx);
        temp-=adcx;
        temp*=1000;
        //LCD_ShowxNum(172,150,temp,3,16,0X80);
        LCD_Setpos_DisplayString(0,1,temp);
附上我的LCD1602.h内容(LCD1602所使用的内容)

/**************************************************************************
**文件名称    :lcd1602.c  for  STM32
** by  DCL     : 2013-12-02
**硬    件     :RS/RW/EN = PB0/PB1/PB2
              DB0-DB7  = PC0-PC7    
**************************************************************************/
#include "stm32f10x.h"
#include "lcd1602.h"


/*********************************************************************
*名    称:LCD_WritePort()
*功    能:写8位数据到DB0-DB7这8个端口
*入口参数:port:待写入的指令
*出口参数:无
*********************************************************************/
void LCD_WritePort(u8 port)
{
    LCDData0 = ((port >> 0) & 0x01);
    LCDData1 = ((port >> 1) & 0x01);  
    LCDData2 = ((port >> 2) & 0x01);  
    LCDData3 = ((port >> 3) & 0x01);  
    LCDData4 = ((port >> 4) & 0x01);  
    LCDData5 = ((port >> 5) & 0x01);  
    LCDData6 = ((port >> 6) & 0x01);  
    LCDData7 = ((port >> 7) & 0x01);  
}


/*********************************************************************
*名    称:LCD_Writecmd()
*功    能:写指令到LCD1602,指令数据占一个字节
*入口参数:cmd:待写入的指令
*出口参数:无
*********************************************************************/
void LCD_Writecmd(u8 cmd)
{
    LCD_RS_0;            //对同一个寄存器的两次写入,中间延时一会
    delay_nus(1);
    LCD_RW_0;
    delay_nus(1);
    
    LCD_EN_1;
    LCD_WritePort(cmd);
    delay_nus(300);        //必要的延时
    LCD_EN_0;            //下降沿,LCD1602开始工作
}


/*********************************************************************
*名    称:LCD_Writedata()
*功    能:写一字节数据到LCD1602
*入口参数:dat:无符号字节类型,0~255  包括各个ASCII码字符
*出口参数:无
*********************************************************************/
void LCD_Writedata(u8 dat)
{
    LCD_RS_1;
    delay_nus(1);
    LCD_RW_0;
    delay_nus(1);
        
    LCD_EN_1;              //先拉高
    LCD_WritePort(dat);
    delay_nus(300);     //很重要的延时,经调试,延时300us以上才可以
    LCD_EN_0;           //下降沿,开始写入有效数据
}





/*********************************************************************
*函       数:LCD_Setpos(u8 x,        u8 y)
*功    能:设置显示位置
*入口参数:(1)y:行=0或1        (2)x:列=0~15,    
*出口参数:无
*********************************************************************/
void LCD_Setpos(u8 x,    u8 y)
{
    if(y==0)    LCD_Writecmd(0x80+x);    //第1行的第x个位置开始显示
    else        LCD_Writecmd(0xC0+x);    //第2行的第x个位置开始显示
}
/*********************************************************************
*函       数:LCD_write_char(u8 x,    u8 y,    u8 ch)
*功    能:在指定位置显示一个字符
*入口参数:(1)y:行=0或1        (2)x:列=0~15,    (3)ch:待显示的字符
*出口参数:无
*********************************************************************/
void LCD_Setpos_DisplayChar(u8 x,    u8 y,    u8 ch)
{
    LCD_Setpos(x,y);
    LCD_Writedata(ch);
}
/*********************************************************************
*名    称:LCD_DisplayString(u8 x,    u8 y)
*功    能:使LCD1602显示一个字符串
*入口参数:(1)y:行=0或1        (2)x:列=0~15,        
*出口参数:无
*********************************************************************/
void LCD_DisplayString(u8 str[])
{
    u8 i=0;
    while(str != '\0')
    {
        LCD_Writedata(str);
        ++i;
    }
}
/*********************************************************************
*名    称:LCD_Setpos_DisplayString(u8 x,    u8 y,    u8 str[])
*功    能:设置位置使LCD1602显示一个字符串
*入口参数:(1)y:行=0或1        (2)x:列=0~15,        (3)str[]:待显示的字符串
*出口参数:无
*********************************************************************/
void LCD_Setpos_DisplayString(u8 x,    u8 y,    u8 str[])
{
    LCD_Setpos(x,y);
    LCD_DisplayString(str);
}
/*********************************************************************
*名    称:LCD_DisplayNum(u32 num)
*功    能:显示一个不超过8位的整数
*入口参数:num:待显示的整数,不超过8位
*出口参数:无
*********************************************************************/
void LCD_DisplayNum(u32 num)
{
    u8     i=0, j, k=0, wei, q;
    u8    str[9];
    if       (num>=10000000)    wei=8;
    else if(num>=1000000)    wei=7;
    else if(num>=100000)    wei=6;
    else if(num>=10000)        wei=5;
    else if(num>=1000)         wei=4;
    else if(num>=100)        wei=3;
    else if(num>=10)         wei=2;
    else                     wei=1;
    for(i=wei;i>0;i--)
    {   
        q=1;
        j=1;                 //i=1时,q=1,得到个位
        for(;j<i;j++) q *= 10;
        str[k++] = num/q +'0';
        num %= q;
    }
    str[k] = '\0';             //添加字符串结束标志
    LCD_DisplayString(str);    //显示字符串
}
/*********************************************************************
*名    称:LCD_Setpos_DisplayNum(u32 num)
*功    能:在指定位置显示一个不超过8位的整数
*入口参数:(1)y:行=0或1        (2)x:列=0~15    (3)num:待显示的整数,不超过8位
*出口参数:无
*********************************************************************/
void LCD_Setpos_DisplayNum(u8 x,    u8 y,    u32 num)
{
    LCD_Setpos(x,y);
    LCD_DisplayNum(num);
}
/*********************************************************************
*名    称:void LCD_Setpos_DisplayDMX512(u16 num)
*功    能:第0位第2行显示“DMX512:num”
*入口参数:num:待显示的3位整数
*出口参数:无
*********************************************************************/
void LCD_Setpos_DisplayDMX512(u16 num)
{
    
    u16 bai=0,shi=0,ge=0;
    bai=num/100;
    shi=num%100/10;
    ge=num%10;
    LCD_Setpos(0,1);
    LCD_DisplayString("DMX512:");
    LCD_DisplayNum(bai);
    LCD_DisplayNum(shi);
    LCD_DisplayNum(ge);
}







/******************************************************************/
/*                        清屏函数                                    */
/******************************************************************/
void LCD_clear(void)
{
    LCD_Writecmd(0x01);
    delay_nms(5);
}
/******************************************************************/
/*                        GPIO配置函数                            */
/******************************************************************/
void A1602_GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);    //开启端口C的时钟
    GPIO_InitStructure.GPIO_Pin =     GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |
                                    GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 |
                                    GPIO_Pin_6 | GPIO_Pin_7 ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;           //PD0~PD7 推挽输出,不能有漏极输出,除非外有有上拉电阻
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);//开启端口B的时钟
    GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //PE.0~2 推挽输出,不能有漏极输出,除非外有有上拉电阻
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    LCD_RS_0; //控制端口除能
    LCD_RW_0;
    LCD_EN_0;

    LCDData7 = 0;  //数据端口初始输出低电平
    LCDData6 = 0;
    LCDData5 = 0;  
    LCDData4 = 0;
    LCDData3 = 0;
    LCDData2 = 0;
    LCDData1 = 0;
    LCDData0 = 0;
}
/*********************************************************************
*名    称:LCD_Init()
*功    能:初始化LCD1602
*入口参数:无
*出口参数:无
*常用命令:0x38:16*2显示,5*&点阵显示字符,8位数据;指令执行时间40us
*          0x0C:开显示,关光标   40us
*          0x08:关显示,关光标   40us
*          0x0D:字符闪烁,关光标,接着设定位置,闪烁周期0.4ms左右
*          0x0F:字符闪烁,开光标
*          0x06:写完数据自动右移光标,普通情形,从左向右显示  40us
*          0x04:写完数据自动左移光标,可以从右向左显示  40us
*          0x01:清除显示内容,即清屏  1.64ms
*          0x02:使光标还回起始位置   1.64ms
*          0x18:屏幕上所有字符同时左移一格,适合滚动显示 40us
*          0x1C:屏幕上所有字符同时右移一格,适合滚动显示 40us
*********************************************************************/
void LCD_Init(void)
{  
    A1602_GPIO_Configuration(); //LCD1602的11个端口配置初始
    delay_nms(100);      //延时20ms        
    LCD_Writecmd(0x38);  //16*2显示,5*7点阵,8位数据
    delay_nms(10);
    LCD_Writecmd(0x38);  //16*2显示,5*7点阵,8位数据
    delay_nms(10);
    LCD_Writecmd(0x38);  //16*2显示,5*7点阵,8位数据
    delay_nms(10);    
    LCD_Writecmd(0x38);  //16*2显示,5*7点阵,8位数据
    delay_nms(10);    
    LCD_Writecmd(0x08);  //先关显示,后开显示
    delay_nms(10);
    LCD_Writecmd(0x01);  //清除LCD的显示内容
    delay_nms(10);
    LCD_Writecmd(0x06);  //自动右移光标,0x04为左移光标
    delay_nms(10);    
    LCD_Writecmd(0x0c);  //显示开,关光标;0x08为关显示
    delay_nms(10);
}
/******************************************************************/
/*                        延时n Us                                    */
/******************************************************************/
void delay_nus(u32 n)
{
    unsigned long j;
    while(n--)
    {
        j=8;
        while(j--);
    }
}
/******************************************************************/
/*                        延时n Ms                                    */
/******************************************************************/
void delay_nms(u32 n)
{
    while(n--){delay_nus(1100);}
}

最佳答案

查看完整内容[请看2#楼]

回复【13楼】Badu_Space: --------------------------------- 谢谢我另外给一个u32的函数就可以了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

340

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3275
金钱
3275
注册时间
2013-9-21
在线时间
281 小时
 楼主| 发表于 2014-6-30 20:24:56 | 显示全部楼层
回复【13楼】Badu_Space:
---------------------------------
谢谢我另外给一个u32的函数就可以了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-30 21:02:37 | 显示全部楼层
你可以正常驱动LCD16902先
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

51

主题

340

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3275
金钱
3275
注册时间
2013-9-21
在线时间
281 小时
 楼主| 发表于 2014-6-30 21:17:24 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我的LCD1602是可以正常驱动显示的但编译时一直出现类型错误
原子哥为什么你的可以套用在LCD显示
我的却不行?是因为LCD函数不适合吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-30 21:35:52 | 显示全部楼层
回复【3楼】hack906447:
---------------------------------
和硬件无关的地方,就可以公用。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

51

主题

340

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3275
金钱
3275
注册时间
2013-9-21
在线时间
281 小时
 楼主| 发表于 2014-6-30 22:05:07 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥你好現在都可以LCD1602都是正常顯示後才加入ADC代碼在LCD_ShowxNum(156,130,adcx,4,16,0);這裡全部替換LCD_Setpos_DisplayString(0,1,adcx);
回复

使用道具 举报

51

主题

340

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3275
金钱
3275
注册时间
2013-9-21
在线时间
281 小时
 楼主| 发表于 2014-6-30 22:14:44 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
我只有些改你的LCD显示函数换成LCD1602显示函数但现在却出现类型错误是为什么呢?
原子哥为什么你的变量放在函数中不用类型强制转换?也没出现类型错误
回复

使用道具 举报

51

主题

340

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3275
金钱
3275
注册时间
2013-9-21
在线时间
281 小时
 楼主| 发表于 2014-7-1 11:41:50 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
请教原子哥这样的问题是出在那裏?谢谢
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-7-1 13:06:00 | 显示全部楼层
回复【7楼】hack906447:
---------------------------------
看看原子的LCD_ShowxNum(156,130,adcx,4,16,0);这个函数形参的数据类型和你自己的LCD_Setpos_DisplayString(0,1,adcx);数据类型进行对照,看下是不是要“强奸法”还是转换一下
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

51

主题

340

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3275
金钱
3275
注册时间
2013-9-21
在线时间
281 小时
 楼主| 发表于 2014-7-1 14:37:56 | 显示全部楼层
回复【8楼】Badu_Space:
--------------------------------
强制转换用过(u8)(u16)
float不知道该怎么强制转换麻烦大神指点
回复

使用道具 举报

51

主题

340

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3275
金钱
3275
注册时间
2013-9-21
在线时间
281 小时
 楼主| 发表于 2014-7-1 22:01:16 | 显示全部楼层
寻求各位大神协助目前尝试修改LCD1602函数还是一样出现类型错误
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-7-2 08:16:56 | 显示全部楼层
回复【9楼】hack906447:
---------------------------------
乘以10的倍数化成整数
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

51

主题

340

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3275
金钱
3275
注册时间
2013-9-21
在线时间
281 小时
 楼主| 发表于 2014-7-2 10:25:09 | 显示全部楼层
回复【11楼】Badu_Space:
---------------------------------
先向你道谢
但我不懂为什么原子的lcd函数可以直接使用变量跟float我也看过他与我的函数目前看不出太大的差异请大神帮忙给方向
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-7-2 10:56:16 | 显示全部楼层
回复【12楼】hack906447:
---------------------------------
这个你就要看原子哥的显示函数体里面怎么处理的了,不同的人有不同的做法
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-6 20:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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