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

#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);
}
}