微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 程序哪里错了

程序哪里错了

时间:10-02 整理:3721RD 点击:
如题,这是一个通过矩阵键盘设置参数的程序,a为真实值,b为参数。通过LED灯来观察现象,但是现在的问题是:1只能设置一次参数2不能设置参数为小数。程序如下:
#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;    //"设置键"标志位
unsigned char flag2=0;         // 负号标记
unsigned char flag3=0;     // 分子小于分母,结果只有两位有效数字时,扩大100倍有两位有效数字
unsigned char flag4=0;         //        分子小于分母,结果只有一位效数字时,扩大100倍有1位有效数字
unsigned char a=11,b=10;
long table2[19];         //存储结果的数组,20就出错?
long s,num1;         //s为计算结果,a为第一个数,b为第二个数,num1对应为键对应的值为显12864显示服务
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:num1=9;flag1=1;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:num1=14;flag14=1;break;          //右下角
               case 0x7b:num1=13;flag13=1;break;
               case 0x7d:num1=12;flag12=1;break;
               case 0x7e:       ;flag11=1;break;
             }
             while(temp!=0x0f)
             {
                temp=PTH;
                temp=temp&0x0f;       
             }
             
          }
            
   }
}

/*********************************存储按下的数字键函数*****************8*********************/
void scan()
{                       
        if(flag16==1)                                                        // 只有按下"设置键" 才能进入
        {            
               
                        if(flag1==1)                       
                        {
                                s=s*10+num1;                          
                                flag1=0;
                        }
                       
        }       
        if(flag15==1){        // 按下"确认键"设置参数
        b=s;          
        }
  if(flag11==1){
    flag16=0;
    num1=0;
    s=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