3039|4

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

1个16按键 的程序问题。 [复制链接]

   今天很郁闷,话了很久写了个程序,就是按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1,第二个显示4...
   但是怎么只就显示第一个 到  第8个键呢,就是 是显示001 到081, 到案第十个键的时候就不行了。第10个键 应该是100.按键次数多了,学习版就死机了。
  找了个群问了下,  都说我程序乱七八糟。课我觉程序比较清楚啊;
  就是 利用num的返回值。  然后i=num*num。  然后i=aa*aa;   分离参数。  最后调用。 望大家指点一下,谢谢。
                                               bai=i/100;
                                              shi= i%100/10;
                                               ge=i%10;
程序如下;
#include
#define uchar unsigned char
#define  uint unsigned int
uchar code table[]={
0x02 , 0x9F, 0x25,  0x0D , 0x99  ,
0x49 , 0x40, 0x1F,  0x00,  0x08,
0x10,  0xC0, 0x62,   0x84, 0X60, 0x70 ,0};
uchar temp,num,aa,bai, shi, ge ;
uint i;
void display(uchar bai, uchar shi,uchar ge)  ;
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

uchar  keyscan() ;
main()
{          
       while(1)
       {
             aa=keyscan();
              i=aa*aa;
              bai=i/100;
             shi= i%100/10;
             ge=i%10;
         display( bai, shi, ge);
        }
}
void display(uchar bai, uchar shi, uchar ge )
{
     P2=0X04;
     P0=table[bai];
     delay(5);
   
     P2=0X02;
     P0=table[shi];
     delay(5);
   
     P2=0x01;
     P0=table[ge];
     delay(5);
  
}

uchar  keyscan()
{
         P1=0xfe;
         delay(1)  ;
         temp=P1;
         temp=temp&0xf0;        
         while(temp!=0xf0)  //松手检测
           {   
                delay(5);  
              temp=P1;
              switch(temp)
                     {         
                    
                          case 0xee:  num=1;    break;
                         case 0xde:  num=2;    break;
                         case 0xbe:  num=3;     break;
                         case 0x7e:  num=4;     break ;
                   }
                        while(temp!=0xf0)
                        {
                            temp=P1;
                            temp=temp&0xf0;
                        }
                          
                }
         P1=0xfd;
         delay(1);
         temp=P1;
         temp=temp&0xf0;        
         while(temp!=0xf0)
           {   
                delay(5);
                temp=P1;
              switch(temp)
                     {         
                    
                         case 0xed:  num=5;    break;
                         case 0xdd:  num=6;    break;
                         case 0xbd: num=7;     break;
                         case 0x7d: num=8;     break ;
                   }
                        while(temp!=0xf0)
                        {
                            temp=P1;
                            temp=temp&0xf0;
                        }       
                          
               
                   }
         P1=0xfb;
         delay(1);
         temp=P1;
         temp=temp&0xf0;        
         while(temp!=0xf0)
           {  
                delay(5);
                        temp=P1;
              switch(temp)
                     {         
                    
                         case 0xeb:  num=9;     break;
                         case 0xdb:  num=10;    break;   //问题在这里就不正常显示了。
                         case 0xbb: num=11;     break;
                         case 0x7b: num=12;     break ;
                   }
                        while(temp!=0xf0)
                        {
                                temp=P1;
                                temp=temp&0xf0;
                        }       
                          
                }
               
                P1=0xf7;
                delay(1);
            temp=P1;
            temp=temp&0xf0;        
           while(temp!=0xf0)
            {   
               delay(5);
                  
               temp=P1;
              switch(temp)
                     {         
                    
                         case 0xe7:   num=13;     break;
                         case 0xd7:   num=14;     break;
                         case 0xb7:   num=15;     break;
                         case 0x77:   num=16;     break;
                   }
                        while(temp!=0xf0)     

                         {
                                 temp=P1;
                                temp=temp&0xf0;
                        }       
                }
   
  return num;
}

最新回复

给你一个比较短的按键程序吧 P1.0-P1.3接列  P1.4-P1.7接行 unsigned char rownum=0;//第几行 unsigned char colnum=0;//第几列 unsigned char row,col,key; P1=0x0f; if(P1!=0x0f) { delay(); //延时程序自己看怎办吧 if(P1!=0x0f) col=P1;   //保存列的P1值 } P1=0xf0; if(P1!=0xf0) { delay(); if(P1!=0xf0) row=P1;  //保存行的P1值 } row=row>>4;//行右移动4位,把高位移动到低位 while(row>>1) rowcunt++;  //算出是第几行 while(col>>1) colcount++;  //算出是第几列 key=rowcount  详情 回复 发表于 2009-12-10 19:25
点赞 关注

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
路过帮顶
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
大家都很牛,受教了
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
看你的程序麻烦 你可以先取得按键的值 0----F 这样如果没错的话  就说明你的矩阵键盘的程序没有问题  然后再去做键值平方的问题
给你一个4*4矩阵键盘的程序参考
/****************************************************************************
* 文件名:KeyArray.C
* 功能:有按键矩阵控制数码管显示0~F
* 硬件说明:
* 用1根8位连接线。将数码管部份的数据口 接到CPU部份的P0口
* 用1根8位连接线。将数码管部份的数据口 接到CPU部份的P2口
* 用1根8位连接线。将按键矩阵部份的数据口 接到CPU部份的P1口
****************************************************************************/

#include

#define LedBit P2_1                //选择第二个7段数码管(为0有效)
#define PortSegLed P0                //数据输出显示七段数据
#define PortKeyCtrl P1                //键盘控制端(列线P1.0-1.3)
                                //(行线P1.4-1.7)
#define KeyCtrlColm1 P1_4       
#define KeyCtrlColm2 P1_5  
#define KeyCtrlColm3 P1_6
#define KeyCtrlColm4 P1_7

unsigned char temp;
unsigned char key;
unsigned char i,j;
//定义轮流显示的键盘值,因为无法表达*# 就用H表示,B用8表示
unsigned table[]=        {        0x28,0x34,0x28,0x34,        //0h0h
                                0xa9,0x60,0x20,0x7a,        //c987
                                0x20,0x21,0x61,0x74,        //8654
                                0x30,0x62,0xa2,0x7e        //a321
                        };

//***********************************************************
//函数名称:Delay1s()
//函数功能:延时k ms函数
//入口参数:k(1-128)
//出口参数:无
//***********************************************************
void Delaykms(unsigned char k)

{

  unsigned char n,s;

  for(n=2*k;n>0;n--)

  for(s=248;s>0;s--);

}


void main(void)
{
          while(1)
          {
              PortKeyCtrl=0xff;                         //矩阵按键控制端输出全1
              KeyCtrlColm1=0;                         //选择扫描第一列               
              temp=PortKeyCtrl;                         //读按键控制端
              temp=temp & 0x0f;                         //读取键值
              if (temp!=0x0f)                         //如果键值不为0x0f
        {
                  Delaykms(25);                         //延时25ms
                  temp=PortKeyCtrl;                 //读按键控制端
                  temp=temp & 0x0f;                 //读取键值
                  if (temp!=0x0f)                 //如果键值仍不为0x0f
            {
                     switch(temp)                         //对读取的键值分配对应键码
                {
                          case 0x0e:
                            key=0;
                            break;
                          case 0x0d:
                            key=4;
                            break;
                          case 0x0b:
                            key=8;
                            break;
                          case 0x07:
                            key=12;
                            break;
                }
                      LedBit=0;                   //开显示位
                      PortSegLed=table[key];    //显示键值

                      temp=PortKeyCtrl;          //读按键控制端
                      temp=temp & 0x0f;         //读取键值      
                      while(temp!=0x0f)           //如果键值不为0x0f
                {
                          temp=PortKeyCtrl; //读按键控制端
                          temp=temp & 0x0f; //读取键值            
                }
            }
        }
  
              PortKeyCtrl=0xff;
              KeyCtrlColm2=0;
              temp=PortKeyCtrl;
              temp=temp & 0x0f;
              if (temp!=0x0f)
        {
                  Delaykms(25);
                  temp=PortKeyCtrl;
                  temp=temp & 0x0f;
                  if (temp!=0x0f)
            {
                      switch(temp)
                {
                          case 0x0e:
                            key=1;
                            break;
                          case 0x0d:
                            key=5;
                            break;
                          case 0x0b:
                            key=9;
                            break;
                          case 0x07:
                            key=13;
                            break;
                }
                      LedBit=0;                                
                      PortSegLed=table[key];        

                      temp=PortKeyCtrl;
                      temp=temp & 0x0f;      
                      while(temp!=0x0f)
                {
                          temp=PortKeyCtrl;
                          temp=temp & 0x0f;              
                }
            }
        }
  
              PortKeyCtrl=0xff;
              KeyCtrlColm3=0;
              temp=PortKeyCtrl;
              temp=temp & 0x0f;
              if (temp!=0x0f)
        {
                  Delaykms(25);  
                  temp=PortKeyCtrl;
                  temp=temp & 0x0f;
                  if (temp!=0x0f)
            {
                      switch(temp)
                {
                          case 0x0e:
                            key=2;
                            break;
                          case 0x0d:
                            key=6;
                            break;
                          case 0x0b:
                            key=10;
                            break;
                          case 0x07:
                            key=14;
                            break;
                }
                       LedBit=0;                 //开显示位
                      PortSegLed=table[key];         //显示键值

                      temp=PortKeyCtrl;
                      temp=temp & 0x0f;            
                      while(temp!=0x0f)
                {
                          temp=PortKeyCtrl;
                          temp=temp & 0x0f;              
                }
            }
        }
  
              PortKeyCtrl=0xff;
              KeyCtrlColm4=0;
              temp=PortKeyCtrl;
              temp=temp & 0x0f;
              if (temp!=0x0f)
        {
                  Delaykms(25);
                  temp=PortKeyCtrl;
                  temp=temp & 0x0f;
                  if (temp!=0x0f)
            {
                      switch(temp)
                {
                          case 0x0e:
                            key=3;
                            break;
                          case 0x0d:
                            key=7;
                            break;
                         case 0x0b:
                            key=11;
                            break;
                         case 0x07:
                            key=15;
                            break;
                }
                       LedBit=0;                 //开显示位
                      PortSegLed=table[key];         //显示键值

                      temp=PortKeyCtrl;
                      temp=temp & 0x0f;   
                      while(temp!=0x0f)
                {
                          temp=PortKeyCtrl;
                          temp=temp & 0x0f;              
                }
            }
        }
    }
}



 
 
 

回复

1

帖子

0

TA的资源

禁止访问

5
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表