微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 飞思卡尔矩阵键盘问题

飞思卡尔矩阵键盘问题

时间:10-02 整理:3721RD 点击:
我的飞思卡尔xs128单片机建工程的时候用了浮点数类型,编了一个矩阵键盘的程序。程序能编译没出错但是却按下键盘,在数据口上没有发现键值的变化情况,请问如何解决。程序如下:
#include <hidef.h>     
#include "derivative.h"     
#define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4
unsigned char flag1=0;         //数字标记位
//unsigned char flag11=0;         //重新设置键标记位
//unsigned char flag12=0;         //小数点标记位
//unsigned char flag13=0;         //          *标记位
unsigned char flag14=0;         //"小数"标记位
unsigned char flag15=0;         //        "确认键"标记位
unsigned char flag16=0;  //"设置键"标志位
float a=11.2,b=10.1;
//long table2[19];         //存储结果的数组,20就出错?
float s,s1,s2;         //s为计算结果,a为第一个数,b为第二个数,num1对应为键对应的值为显12864显示服务
unsigned char num1;
void delay_10us(long m)
{    // 延时m*10us
  //while(m--);  
    unsigned long a;
    for(a=15*m;a>0;a--);
}
//------------------------------------
//函数名称:delay_1ms
//函数功能:1ms延时
//入口参数:usigned int t
//出口参数:无
void delaynms(unsigned int t)  //延时t*1ms
{
  unsigned int i;
  for(i=0;i<t;i++)
    delay_10us(102);
}
/********************************/
/*************************************************************/
/*                    初始化4X4矩阵键盘                      */
/*************************************************************/
//函数名称:KEY_Init
//函数功能:KEY初始化
//入口参数:无
//出口参数:无
void KEY_Init()   //LCD初始化
{
   DDRH=0xf0; //0输入。1输出
   PERH=0xff; //1设置上拉/下拉电阻
   PPSH=0xf0; //0上拉1下拉
   //PIEH=0x00;
   //PORTA=0xff;
   //PTH=0xff;
}
/***********************************************************
函数名称:Kbscan
函数功能:键盘扫描程序
入口参数:无
出口参数:键值
备 注:
***********************************************************/
void kbscan(void)
{
   uchar temp;
   DDRH=0xf0; //0输入。1输出
   PTH=0xef;    //将第4lie线置低电平,其余线全为高电平
   DDRH=0xf0; //0输入。1输出
   temp=PTH;
   temp=temp&0x0f;
  if(temp!=0x0f)
  {
    delaynms(10);
    temp=PTH;
    temp=temp&0x0f;
    if(temp!=0x0f)
    {
       temp=PTH;
             switch(temp)
             {
               case 0xe7:      ;flag15=1;break;          //1hang
               case 0xeb:num1=1;flag1=1;break;
               case 0xed:num1=4;flag1=1;break;
               case 0xee:num1=7;flag1=1;break;          
             }
             while(temp!=0x0f)  //松手检测
             {
               temp=PTH;
               temp=temp&0x0f;
             }
           
          }
  }
  DDRH=0xf0; //0输入。1输出
  PTH=0xdf;
  DDRH=0xf0; //0输入。1输出
  temp=PTH;
  temp=temp&0x0f;
  if(temp!=0x0f)
  {
    delaynms(10);
    temp=PTH;
    temp=temp&0x0f;
    if(temp!=0x0f)
    {
       temp=PTH;
             switch(temp)
             {
               case 0xd7:num1=0;flag1=1;break;          //右下角
               case 0xdb:num1=2;flag1=1;break;
               case 0xdd:num1=5;flag1=1;break;
               case 0xde:num1=8;flag1=1;break;
             }
             while(temp!=0x0f)
             {
                temp=PTH;
                temp=temp&0x0f;
             }
           
          }
  }
  DDRH=0xf0; //0输入。1输出
  PTH=0xbf;
  DDRH=0xf0; //0输入。1输出
  temp=PTH;
  temp=temp&0x0f;
  if(temp!=0x0f)
  {
    delaynms(10);
    temp=PTH;
    temp=temp&0x0f;
    if(temp!=0x0f)
    {
       temp=PTH;
             switch(temp)
             {
               case 0xb7:        ;flag16=1;break;          //右下角
               case 0xbb:num1=3;flag1=1;break;
               case 0xbd:num1=6;flag1=1;break;
               case 0xbe:        ;flag14=0;break;
             }
             while(temp!=0x0f)
             {
                temp=PTH;
                temp=temp&0x0f;
             }
             
          }
  }
  DDRH=0xf0; //0输入。1输出
  PTH=0x7f;
  DDRH=0xf0; //0输入。1输出
  temp=PTH;
  temp=temp&0x0f;
  if(temp!=0x0f)
  {
    delaynms(10);
    temp=PTH;
    temp=temp&0x0f;
    if(temp!=0x0f)
    {
       temp=PTH;
             switch(temp)
             {
               case 0x77:       ;flag14=1;break;          //右下角
               case 0x7b:num1=9 ;flag1=0;break;
               case 0x7d:       ;flag15=0;break;
               case 0x7e:       ;flag16=0;break;
             }
             while(temp!=0x0f)
             {
                temp=PTH;
                temp=temp&0x0f;       
             }
             
          }
            
   }
}

/*********************************存储按下的数字键函数*****************8*********************/
void scan()
{                       
        if(flag16==1)                                                        // 只有按下"设置键" 才能进入
        {            
               
                        if(flag1==1)                       
                        {
                                s1=s1*10+num1;                          
                                flag1=0;
                        }
                        if(flag14==1){
                          if(flag1==1){  
                          s2=num1*0.1;
                          }
                        }
                       
        }       
        if(flag15==1){        // 按下"确认键"设置参数
        s=s1+s2;
        b=s;          
        }
  if(flag16==0){
    s=0;
    s1=0;
    s2=0;
    num1=0;
  }
}

void bijiao(){
  if(a>b)
  LEDCPU=0;
  else
  LEDCPU=1;
}

void main(void) {
  LEDCPU_dir=1;
  KEY_Init();
  while(1){
   kbscan();
   scan();
   bijiao();
  }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top