找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1480|回复: 4
打印 上一主题 下一主题
收起左侧

帮忙看看下面的程序为什么按按键出不来数字

[复制链接]
跳转到指定楼层
楼主
#include <reg52.h>                           //主函数
#define  uint unsigned int           //宏定义
#define  uchar unsigned char
//#define data P0                           //数据口
//sbit LCD_RS =P2^7;                   //并行数据命令选择控制
//sbit LCD_RW =P2^6;                   //并行读写控制
//sbit LCD_EN =P2^5;                   //并行使能信号
//sbit LCD_PSB=P2^4;                   //并行串行选择
int   keyscan();
uint  key_keys;                    //定义按键值                                  
void delayms(uint xms)               //延时函数
{
        uint i,j;
        for(i=xms;i>0;i--);
                for(j=110;j>0;j--);       
}

/**********主函数**********/
void main()                                          
{

        while(1)
        {
                key_keys=keyscan();
        }
}

/******按键控制函数******/
int keyscan()                                  
{
        uchar temp;
    static keys;                    //keys定义成为一个静态全局变量                        
        P1=0xfe;                        //(写)1111 1110将第一行线置低电平,其余行线全为高电平
        temp=P1;                               //(读)将P3口当前的状态赋给临时变量temp
        temp=temp&0xf0;                        //判断temp的高四位是否有0
        if(temp!=0xf0)                        //说明有第一行的按键被按下
        {
                delayms(5);            //按键去抖延时
                temp=P1;                    //进行再一次判断
                temp=temp&0xf0;
                if(temp!=0xf0)
                {       
                        temp=P1;
                        switch(temp)
                        {
                                case 0xee : keys=1;break;        //1110 1110
                                case 0xde : keys=2;break;   //1101 1110
                                case 0xbe : keys=3;break;        //1011 1110
                                case 0x7e : keys=4;break;        //0111 1110
                        }                       
                        while(temp!=0xf0)
                        {
                                temp=P1;
                                temp=temp&0xf0;
                        }
                }
        }

        P1=0xfd;                                  //1111 1101将第二行线置低电平,其余行线全为高电平
        temp=P1;                                  //将P3口当前的状态赋给临时变量temp
        temp=temp&0xf0;                          //判断temp的高四位是否有0
        if(temp!=0xf0)                          //说明有第一行的按键被按下
        {
                delayms(5);                  //按键去抖延时
                temp=P1;                          //进行再一次判断
                temp=temp&0xf0;
                if(temp!=0xf0)
                {       
                        temp=P1;
                        switch(temp)
                        {
                                case 0xed : keys=5;break;   //1110 1101
                                case 0xdd : keys=6;break;   //1101 1101
                                case 0xbd : keys=7;break;   //1011 1101
                                case 0x7d : keys=8;break;   //0111 1101

                        }                       
                        while(temp!=0xf0)
                        {
                                temp=P1;
                                temp=temp&0xf0;
                        }
            }
         }

        P1=0xfb;                                  //1111 1011将第三行线置低电平,其余行线全为高电平
        temp=P1;                                  //将P3口当前的状态赋给临时变量temp
        temp=temp&0xf0;                          //判断temp的高四位是否有0
        if(temp!=0xf0)                          //说明有第一行的按键被按下
        {
                delayms(5);                  //按键去抖延时
                temp=P1;                          //进行再一次判断
                temp=temp&0xf0;
                if(temp!=0xf0)
                {       
                        temp=P1;
                        switch(temp)
                        {
                                case 0xed : keys=9;break;   //1110 1011
                                case 0xdd : keys=0;break;   //1101 1011
//                                case 0xbd : key==;break;   
//                                case 0x7d : write_data(0x01);break;   //0111 1101


                        }                       
                        while(temp!=0xf0)
                        {
                                temp=P1;
                                temp=temp&0xf0;
                        }
            }
                return keys;

         }
//        P1=0xf7;                                  //1111 0111将第四行线置低电平,其余行线全为高电平
//        temp=P1;                                  //将P3口当前的状态赋给临时变量temp
//        temp=temp&0xf0;                          //判断temp的高四位是否有0
//        if(temp!=0xf0)                          //说明有第一行的按键被按下
//        {
//                delayms(10);                  //按键去抖延时
//                temp=P1;                          //进行再一次判断
//                temp=temp&0xf0;
//                if(temp!=0xf0)
//                {       
//                        temp=P1;
//                        switch(temp)
//                        {
//                                case 0xe7 : key=+;break;   
//                                case 0xd7 : key=-;break;   
//                                case 0x77 : key=/;break;   
//                                case 0xb7 : key=*;break;  
//                        }                       
//                        while(temp!=0xf0)
//                        {
//                                temp=P1;
//                                temp=temp&0xf0;
//                        }
//            }
//         }
}
//void yunshuang()
//{
//       
//
//
//}
///*写指令数据到LCD*/       
///*RS=H,RW=L,E=高脉冲,D0-D7=指令码*/
//void write_cmd(uchar cmd)                               
//{       
//        LCD_RS=0;                                                           //写
//        LCD_RW=0;                                                           //指令
//        LCD_EN=0;                                                           //选中数据
//        P1=cmd;
//        delayms(5);                                                  
//        LCD_EN=1;                                                           //写入数据
//        delayms(5);
//        LCD_EN=0;         
//}
///*写显示数据到LCD*/
///*RS=H,RW=L,E=高脉冲,D0-D7=数据*/
//void write_dat(uchar dat)                               
//{       
//        LCD_RS=1;                                                           //写
//        LCD_RW=0;                                                           //数据
//        LCD_EN=0;                                                           //选中数据
//        P1=dat;
//        delayms(5);
//        LCD_EN=1;                                                           //写入数据
//        delayms(5);
//        LCD_EN=0;
//}
//
//

Build target '计算机'
compiling main.c...
MAIN.C(140): warning C291: not every exit path returns a value
linking...
Program Size: data=14.0 xdata=0 code=323
creating hex file from "计算机"...
"计算机" - 0 Error(s), 1 Warning(s).




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624769 发表于 2021-12-6 15:19 | 只看该作者
    static keys;                    //keys定义成为一个静态全局变量  

少了个 int 吧?  而且,你确定需要用 int 来传参么? 从你的代码里真没看出 int的必要性……
回复

使用道具 举报

板凳
ID:986164 发表于 2021-12-6 16:43 | 只看该作者
188610329 发表于 2021-12-6 15:19
static keys;                    //keys定义成为一个静态全局变量  

少了个 int 吧?  而且,你确 ...

不是,变成static int keys;还是不行,而且不用int用a1  keyscan 定义函数有错误

回复

使用道具 举报

地板
ID:624769 发表于 2021-12-6 16:58 | 只看该作者
xzxdbb 发表于 2021-12-6 16:43
不是,变成static int keys;还是不行,而且不用int用a1  keyscan 定义函数有错误

1, 我不明白, 既然 这个 keys 是用来return 的,为什么,要static
2, 虽然你的代码极端混乱,但是我没看出用int的必要。
3, 不用int,不是应该用char么?  a1 是什么鬼?
回复

使用道具 举报

5#
ID:213173 发表于 2021-12-6 21:43 | 只看该作者

  1. #include <reg52.h>                   //主函数
  2. #define  uint unsigned int           //宏定义
  3. #define  uchar unsigned char
  4. //#define data P0                      //数据口
  5. sbit LCD_RS =P2^7;                   //并行数据命令选择控制
  6. sbit LCD_RW =P2^6;                   //并行读写控制
  7. sbit LCD_EN =P2^5;                   //并行使能信号
  8. //sbit LCD_PSB=P2^4;                   //并行串行选择

  9. uchar KeyValue;                    //定义键值                                 

  10. void delayms(uint xms)               //延时函数
  11. {
  12.         uint i,j;
  13.         for(i=xms;i>0;i--)//;
  14.                 for(j=110;j>0;j--);
  15. }
  16. /*写指令数据到LCD*/        
  17. /*RS=H,RW=L,E=高脉冲,D0-D7=指令码*/
  18. void write_cmd(uchar cmd)                                
  19. {        
  20.         LCD_RS=0;                                                           //写
  21.         LCD_RW=0;                                                           //指令
  22.         LCD_EN=0;                                                           //选中数据
  23.         P0=cmd;
  24.         delayms(1);                                                   
  25.         LCD_EN=1;                                                           //写入数据
  26.         delayms(1);
  27.         LCD_EN=0;         
  28. }
  29. /*写显示数据到LCD*/
  30. /*RS=H,RW=L,E=高脉冲,D0-D7=数据*/
  31. void write_dat(uchar dat)                                
  32. {        
  33.         LCD_RS=1;                                                           //写
  34.         LCD_RW=0;                                                           //数据
  35.         LCD_EN=0;                                                           //选中数据
  36.         P0=dat;
  37.         delayms(1);
  38.         LCD_EN=1;                                                           //写入数据
  39.         delayms(1);
  40.         LCD_EN=0;
  41. }
  42. void init_LCD()
  43. {
  44.         write_cmd(0x38);//设置16*2显示,5*7点阵,8位数据接口
  45.         write_cmd(0x01);//显示清零,数据指针清零
  46.         write_cmd(0x0c);//设置开显示,不显光标
  47.         write_cmd(0x06);//设置写一个字符后地址指针加1
  48. }
  49. /******按键扫描函数******/
  50. void keyscan()
  51. {
  52.         static uchar count=0;//消抖计数
  53.         static bit sign=0;//按键状态标志
  54.         P1=0xf0;
  55.         if(P1!=0xf0)                                //检测有按键按下
  56.         {
  57.                 if(++count>=5 && sign==0)
  58.                 {                       
  59.                         sign=1;//按键状态标志置1
  60.                         switch(P1)
  61.                         {
  62.                                 case(0Xe0):KeyValue = 1;break;
  63.                                 case(0Xd0):KeyValue = 2;break;
  64.                                 case(0Xb0):KeyValue = 3;break;
  65.                                 case(0X70):KeyValue = 4;break;
  66.                         }
  67.                         P1=0x0f;
  68.                         switch(P1)
  69.                         {
  70.                                 case(0X0e):KeyValue+= 0;break;
  71.                                 case(0X0d):KeyValue+= 4;break;
  72.                                 case(0X0b):KeyValue+= 8;break;
  73.                                 case(0X07):KeyValue+=12;break;
  74.                         }
  75.                         write_cmd(0x80);
  76.                         write_dat(KeyValue/10+'0');
  77.                         write_dat(KeyValue%10+'0');
  78.                 }
  79.         }
  80.         else                                                //键抬起
  81.         {
  82.                 sign=0;                                //按键状态标志清0
  83.                 count=0;                                //消抖计数清0
  84.         }
  85. }

  86. /**********主函数**********/
  87. void main()
  88. {
  89.         init_LCD();
  90.         write_cmd(0x80);
  91.         write_dat(KeyValue/10+'0');
  92.         write_dat(KeyValue%10+'0');
  93.         while(1)
  94.         {
  95.                 keyscan();       
  96.                 delayms(5);
  97.         }
  98. }


复制代码



回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表