打印

求助!类型“u8”的参数与类型“u8 *”的参数不兼容

[复制链接]
551|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
3月的尾巴|  楼主 | 2020-4-23 20:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_delay.h"
#include "bsp_lcd.h"
/**
  * @brief  主函数
  * @param  无  
  * @retval 无
  */
const u8 table1[]={"123456789"};
const u8 table2[]={"98745123"};
const u8 table3[]={"STM32F103RCT6"};
const u8 table4[]={"132456"};
int main(void)
{
u8 i=0;
delay_init(8);  //初始化延时函数的微妙计数基数。  
InitDis();    //初始化 LCD
LED_GPIO_Config();
WriteCmd(0x80);
while(table1 != '\0')
{
  DisStr(table1);
  i++;
}
i=0;
WriteCmd(0x90);
while(table2 != '\0')
{
  DisStr(table2);
  i++;
}
i=0;
WriteCmd(0x88);
while(table3 != '\0')
{
  DisStr(table3);
  i++;
}
i=0;
WriteCmd(0x98);
while(table4 != '\0')
{
  DisStr(table4);
  i++;
}
while (1);
}



#include "bsp_lcd.h"
#include "bsp_delay.h"
#define u16 unsigned short   //为了可移植性好,对这两个 STM 32 已经定义过的变量,再定义一次。
#define u8 unsigned char
/********** 以下是相关引脚定义。**************/
#define DisIO GPIOA                 //定义12864要使用的I/O端口。
#define DisClk RCC_APB2Periph_GPIOA  //定义12864要使用的I/O端口的时钟。
#define Data GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7
                                       //定义12864使用的数据引脚。
#define RS GPIO_Pin_9
#define RW GPIO_Pin_10
#define EN GPIO_Pin_11       //定义使能端使用的引脚。
#define PSB GPIO_Pin_12      //定义并,串行数据模式的选择端口使用的引脚。
/*********************************************/
                        
GPIO_InitTypeDef  GPIOStru;  //定义用于定义所以引脚为输出的变量。
void IOInitOut(void)           //把所有端口初始化为推挽输出模式的函数。
{
    GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP;//定义所有的引脚为推挽输出的变量初始化。
    GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
    GPIOStru.GPIO_Pin = Data|RS|RW|EN|PSB;
    RCC_APB2PeriphClockCmd(DisClk,ENABLE);
    GPIO_Init(DisIO,&GPIOStru);
}
void IOInitIn(void)           //把数据引脚初始化为浮空输入的函数。
{
    GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP;//定义数据引脚为开漏输出的变量初始化。
    GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
    GPIOStru.GPIO_Pin = Data;
    RCC_APB2PeriphClockCmd(DisClk,ENABLE);   //把所有端口初始化为输出模式的函数。   
    GPIO_Init(DisIO,&GPIOStru);
}
void WaitBusy(void)          //等待12864的忙状态结束的函数。
{
    IOInitIn();        //把数据引脚定义为浮空输入;
    GPIO_ResetBits(DisIO,RS);  //RS = 0.
    GPIO_SetBits(DisIO,RW);    //RW = 1.
    GPIO_SetBits(DisIO,EN);    //EN = 1.
    while((GPIO_ReadInputData(DisIO)<<8) & 0x80); //只要位7的值,位7是忙标志位。
  GPIO_ResetBits(DisIO,EN);  //EN = 0;
    IOInitOut();      //把所有引脚定义为输出。
}
void WriteCmd(u8 cmd)    //写命令函数。
{
   WaitBusy();
    GPIO_ResetBits(DisIO,RS);  //RS = 0.
    GPIO_ResetBits(DisIO,RW);  //RW = 0.
    GPIO_ResetBits(DisIO,EN);  //EN = 0.
  delay_ms(2);
    DisIO->ODR=((DisIO->ODR & 0xff00)|cmd); //此处,只有直接操作寄存器才能
                  //达到,只改变输出数据寄存器ODR的低8位,其它位
                  //不变的目的。因为,只有低8位是数据引脚,
                  //其它位可能是控制引脚,不能改变。
    delay_ms(2);
  GPIO_SetBits(DisIO,EN);     //EN = 1.
    delay_ms(2);
  GPIO_ResetBits(DisIO,EN);  //EN = 0;
}
void WriteData(u8 data)  //写数据函数。
{
  WaitBusy();
    GPIO_SetBits(DisIO,RS);  //RS = 1.
    GPIO_ResetBits(DisIO,RW);  //RW = 0.
    GPIO_ResetBits(DisIO,EN);  //EN = 0.
    DisIO->ODR=((DisIO->ODR & 0xff00)|data);  //同上。
    delay_ms(5);
  GPIO_SetBits(DisIO,EN);    //EN = 1.
    delay_ms(5);
    GPIO_ResetBits(DisIO,EN);  //EN = 0;
}
void InitDis(void)   //初始化 12864 和要用到的 STM 32 的引脚。
{
    IOInitOut();  
    delay_init(8);   //初始化延时函数的微妙计数基数。  
    GPIO_SetBits(DisIO,PSB);  //令PSB=1,设置为并行数据模式。
    delay_ms(10);
    WriteCmd(0x30);  //选择基本指令集,和,8位数据模式。
    delay_ms(10);
    WriteCmd(0x0c);  //开显示,无游标,不反白.
    delay_ms(10);
    WriteCmd(0x01);  //清除显示,并将 DDRAM 的地址计数器 AC 设为 00H.
    delay_ms(10);
    WriteCmd(0x06);  //设置,外部读写数据后,地址记数器 AC 会自动加 1。
    delay_ms(5);
    WriteCmd(0x80);  //将 DDRAM 地址计数器 AC 设为 0.
    delay_ms(5);
}
void DisStr(u8 *s)    //显示字符串的函数。
{
    while(*s != '\0')
    {
        WriteData(*s);
        s++;
        delay_ms(2);
    }
}
void DisInt(long int num)  //显示整型变量的函数,最多显示16位的整数。只能显示正数。
{
u8 temp[17];
u8 str[17];
int i=0,j=0;
while(num != 0)   //这里不能用num%10 != 0,如果num是10的整数倍,
                   //例如,100,这样就会出错,根本就不能进入循环体。
{
  temp = (num%10)+0x30;
  num/=10;
  i++;
}
i--;           //因为i在退出循环之前还自加了一次,此时,
                 //指向最后一个存储有用值的元素的后一个位置。
while(i != -1)  //因为i=0时,temp[0]还是有用值。
{
  str[j] = temp;
  j++;
  i--;
}
str[j]='\0';  //因为i在退出循环之前还自加了一次,此时,
               //指向最后一个存储有用值的元素的后一个位置。
DisStr(str);
}
void DisFloat(float fnum) //显示有4位小数的浮点数,总位数不超过16位。
{
long int num = fnum*10000;
u8 temp[17];
u8 str[17];
int i=0,j=0;
while(num != 0)                  
{
  temp = (num%10)+0x30;
  num/=10;
  i++;
  if(i == 4)  //4位小数处理完后,加入小数点。
  {
   temp = '.';
   i++;
  }
}
i--;   
while(i != -1)
{
  str[j] = temp;
  j++;
  i--;
}
str[j]='\0';  
DisStr(str);   
}

使用特权

评论回复

相关帖子

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

本版积分规则

433

主题

433

帖子

0

粉丝