ZzuYyuRru 2024-02-24 00:15 采纳率: 25%
浏览 48

STM32TFTLCD屏幕无法显示动态数据

warning: argument of type "char *" is incompatible with parameter of type "u8"
矩阵键盘输入的值无法在 LCD 屏幕显示
静态数据正常显示

img

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"
#include <stdio.h>
#include <string.h>

//ALIENTEK 探索者STM32F407开发板 实验13
//LCD显示实验-库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com  
//广州市星翼电子科技有限公司  
//作者:正点原子 @ALIENTEK

//============全局变量定义===============//
#define Num_of_show        10
unsigned char decimal,count;
volatile float  num1;
volatile float  num2;
volatile float  result;
char num1_str[Num_of_show];
char num2_str[Num_of_show];
char result_str[Num_of_show];
char opera_str[2]=" ";
unsigned int KEYCODE=0;
unsigned char key_flag=1;
void xmui(void);
void refshow(void);
//=======================================//

void Load_Drow_Dialog(void)
{
    LCD_Clear(LIGHTBLUE);//清屏
    POINT_COLOR=BLUE;//设置画笔蓝色
    LCD_DrawRectangle(4,5,236,325);
    LCD_DrawRectangle(4,30,236,30);
}

//LCD显示程序
void xmui()//显示信息
{
    Load_Drow_Dialog();
    POINT_COLOR=BLUE;
    LCD_ShowString(64,10,200,16,16,"Caculator");
    POINT_COLOR=DARKBLUE;
    LCD_ShowString(6,40,200,16,16,"num1:");
    LCD_ShowString(46,40,200,16,16,num1_str);
    LCD_ShowString(6,60,200,16,16,"operat:");
    LCD_ShowString(60,60,200,16,16,opera_str);
    LCD_ShowString(6,80,200,16,16,"num2:");
    LCD_ShowString(46,80,200,16,16,num2_str);
    LCD_ShowString(6,100,200,16,16,"result:");
    LCD_ShowString(64,100,200,16,16,result_str);
}

//清除LCD缓存
void dispClearBuffer(char *buffer)
{
    volatile unsigned int j;
    for(j=0;j<Num_of_show - 1;j++)
    {
        buffer[j]=32;//空格清空显示缓存,32是空格的ASCII码
    }
    buffer[Num_of_show - 1]='\0';//字符串结尾
    
}

//计算处理函数
void Access()
{
    switch(key_flag)
    {
        case 1:
            //按键标志位为1,有num1数据输入
        {
            if(KEYCODE<=9)//输入的是数字
            {
                if(decimal==0)  num1 =  KEYCODE + num1 * 10;
                if(decimal==1)  
                {
                    count++;//记录小数点第几位
                    switch(count)
                    {
                        case 1:num1 = num1 + KEYCODE * 0.1;break;
                        case 2:
                        {
                            num1 = num1 + KEYCODE * 0.01;count = 0;decimal = 0;
                        }break;
                     } 
                    
                }
             }
             
            if(KEYCODE==14)//输入的是#,小数点
            {
                decimal = 1;//小数位标志位置位 
             }
             
            sprintf(num1_str,"%.2f",num1);//???这是什么? 
             
            if(KEYCODE==10)//keyA 加法运算 
            {
                count = 0;//方便下一次数据输入
                decimal = 0;
                opera_str[0]='+';
                key_flag++; //按键标志位加一 
            }
            if(KEYCODE==11)//B  减法运算 
            {
                count = 0;//方便下一次数据输入
                decimal = 0;
                opera_str[0]='-';
                key_flag++; //按键标志位加一 
            }
            if(KEYCODE==12)//删除 
            {
                if(opera_str[0]==' ')
                {
                    count = 0;//方便下一次数据输入
                    decimal = 0;
                    num1 = 0;
                    dispClearBuffer(num1_str);
                }
                
            }
            
            if(KEYCODE==13)//C  乘法运算
            {
                count = 0;//方便下一次数据输入
                decimal = 0;
                opera_str[0]='*';
                key_flag++; //按键标志位加一 
             } 
        
         } break;
        case 2:
        {
            if(KEYCODE<=9)//输入的是数字
            {
                if(decimal==0)  num2 =  KEYCODE + num2 * 10;
                if(decimal==1)  
                {
                    count++;//记录小数点第几位
                    switch(count)
                    {
                        case 1:num2 = num2 + KEYCODE * 0.1;break;
                        case 2:
                        {
                            num2 = num2 + KEYCODE * 0.01;count = 0;decimal = 0;
                        }break;
                     } 
                    
                }
             }
             
            if(KEYCODE==14)//输入的是#,小数点
            {
                decimal = 1;//小数位标志位置位 
             }
             
            sprintf(num2_str,"%.2f",num2);//???这是什么? 
            
            if(KEYCODE==12)//删除 
            {
                count = 0;//方便下一次数据输入
                decimal = 0;
                num2 = 0;
                dispClearBuffer(num2_str);
            }
            
            if(KEYCODE==15)
            {
                decimal = 0;
                key_flag++; 
                switch(opera_str[0])
                {
                    case '+':result=num1+num2;break;
                    case '-':result=num1-num2;break;
                    case '*':result=num1*num2;break;
                    default:break;
                }
                sprintf(result_str,"%.2f",result);
            }    
            
            
        }break;
        case 3://按键标志位为3,结束运算后,按键c,清零,显示复位 
        {
            key_flag = 1;
            if(KEYCODE==12)
            {
                num1 = 0;
                num2 = 0;
                opera_str[0]=' ';//清除运算符号
                result = 0;
                dispClearBuffer(num1_str);
                dispClearBuffer(num2_str);
                dispClearBuffer(result_str); 
            }
        }
    }
    
    
}

//通用定时器3中断初始化
//arr:自动重装值
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us
//Ft=定时器工作频率,单位:MHz 168MHz/4=42,Ft=42*2=84MHz
//定时器3!!!
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_AHB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3时钟
    
    TIM_TimeBaseInitStructure.TIM_Period = arr;//自动重装载值
    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;//定时器分频
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure); //初始化TIM3
    
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//允许定时器3更新中断
    TIM_Cmd(TIM3,ENABLE);//使能定时器3
    
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//定时器3中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//抢占优先级1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;//子优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
}

//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)//溢出中断
    {
        LED2=!LED2 ;//D2翻转
        xmui();        //显示信息
        
    }
    TIM_ClearITPendingBit(TIM3,TIM_IT_Update );//
}

int main(void)
{ 
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
    delay_init(168);      //初始化延时函数
    uart_init(115200);        //初始化串口波特率为115200
    
    LED_Init();                      //初始化LED
     LCD_Init();           //初始化LCD FSMC接口
    key_Configuration();  //键盘初始化
    TIM3_Int_Init(1000 - 1,8400 - 1);//定时器时钟84M,分频系数8400,所以84M/8400=10Khz的计数频率,
                                    //一个周期是0.1ms,计数1000次为100ms,也可以是50ms
    xmui();
    POINT_COLOR=RED;      //画笔颜色:红色
    delay_ms(100);          //延迟等初始化完成
                     
      while(1) 
    {         
        KEYCODE=KEY_Scanf();
        if(KEYCODE!='F')
        {
            printf ("keyValue=%d",KEYCODE);
            printf ("\r\n");//显示换行
            Access ();
        }
        LED1=!LED1;     
        delay_ms(1000);    
    } 
}

  • 写回答

3条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-02-24 00:16
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如需一对一服务私聊我哦
    问题1:warning: argument of type "char *" is incompatible with parameter of type "u8" 这个警告通常是因为函数需要一个u8类型的参数,但是实际传入的是char类型。可以通过将传入的char参数转换为u8类型来解决这个问题。 例如,假设有以下函数:
    void my_function(u8 arg){
        // do something
    }
    

    如果传入一个char类型的参数,会出现上述警告,可以通过以下方法解决:

    char my_char = 'a';
    my_function((u8)my_char);
    

    问题2:矩阵键盘输入的值无法在LCD屏幕显示 这个问题可能是因为矩阵键盘输入的值没有被正确地输出到LCD屏幕上。可以检查一下代码,确认是否有将矩阵键盘输入的值传递给LCD屏幕的代码。 例如,如果想要将矩阵键盘输入的值显示在LCD屏幕上,可以使用以下代码:

    // 假设矩阵键盘的输入值被存储在input_value中
    // 假设LCD屏幕的显示函数为lcd_show(第一个参数是显示的行号,第二个参数是显示的字符串)
    // 假设需要将input_value以字符串的形式显示在第一行LCD屏幕上
    char str_value[10];
    sprintf(str_value, "%d", input_value);
    lcd_show(1, str_value);
    

    问题3:静态数据正常显示 这个问题可能是因为静态数据被正确地输出到LCD屏幕上了。需要进一步检查代码,找出导致其他数据无法正常显示的原因。 例如,如果想将一个固定的字符串显示在LCD屏幕上,可以使用以下代码:

    // 假设需要将"Hello World"字符串显示在第一行LCD屏幕上
    lcd_show(1, "Hello World");
    
    评论

报告相同问题?

问题事件

  • 修改了问题 2月24日
  • 创建了问题 2月24日