论坛元老
 
- 积分
- 3275
- 金钱
- 3275
- 注册时间
- 2013-9-21
- 在线时间
- 281 小时
|
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的函数就可以了
|