找回密码
 立即注册

QQ登录

只需一步,快速开始

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

谁能帮我看看为啥单片机程序实现不了键盘逐个输入到BCD中

[复制链接]
回帖奖励 40 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
为啥实现不了从键盘逐个输入到数码管中,我在PROTUES手动控制锁存是可以实现的,代码不知道哪里出了问题。目标是想输入一个数字锁存然后输入下一个再锁存。这样

单片机源程序如下:
#include <reg51.h>
unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F, //0-9字形码,也叫段码
0x77,0x7C,0x39,0x5E,0x79,0x71};

sbit Q=P3^0;   //BCD1
sbit W=P3^1;        //BCD2
sbit E=P3^2;        //BCD3
sbit R=P3^3;        //BCD4

unsigned char count=0;
void delay(unsigned int i)
{          unsigned char j,k;
  for(j=i;j>0;j--)
    for(k=255;k>0;k--);
}
void keyscanf() {
          unsigned char temp;

        
         P2=0xfe;
          temp=P2;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {          temp=P2;
                switch        (temp){
                case 0xee:P1=table[1];count++;break;
                case 0xde:P1=table[2];count++;break;
                case 0xbe:P1=table[3];count++;break;
                case 0x7e:P1=table[4];count++;break;        }
               
        }


                P2=0xfD;
          temp=P2;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {          temp=P2;
                switch        (temp){
                case 0xed:P1=table[5];count++;break;
                case 0xdd:P1=table[6];count++;break;
                case 0xbd:P1=table[7];count++;break;
                case 0x7d:P1=table[8];count++;break;        }
                        

        }
                   P2=0xfB;
          temp=P2;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {          temp=P2;
                switch        (temp){
                case 0xeB:P1=table[9];count++;break;
                case 0xdB:P1=table[10];count++;break;
                case 0xbB:P1=table[11];count++;break;
                case 0x7B:P1=table[12];count++;break;        }
                        

        }
                   P2=0xf7;
          temp=P2;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {          temp=P2;
                switch        (temp){
                case 0xe7:P1=table[13];count++;break;
                case 0xd7:P1=table[14];count++;break;
                case 0xb7:P1=table[15];count++;break;
                case 0x77:P1=table[0];count++;break;        }
                        

        }
                  
           
        }

           


void main()        {

         Q=W=E=R=0;
                        
  while(1){
                  
                if(count==0)
        {        Q=1;W=E=R=0;
                   keyscanf();
        }
        
                if(count==1)
                {         
                         W=1;Q=E=R=0;
                        
                          keyscanf();
                }
                        
                if(count==2)
                {         
                        E=1;Q=W=R=0;
               
                          keyscanf();
                }

               
                if(count==3)
                {         
                        R=1;Q=W=E=0;
               
                          keyscanf();
                }
                if(count==4)
                {        count=0;}
   }
        }

1592383573(1).jpg (81.04 KB, 下载次数: 38)

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

使用道具 举报

沙发
ID:332444 发表于 2020-6-18 07:02 | 只看该作者
对于P3的4个口用于控制锁存器不用那样写的麻烦,直接赋值给P3口1,2,4,8就可以了,写法比较简单。按键取值那样写也太啰嗦了,看起来也不直观,不如使用16个独立按键,驱动写的容易懂。
回复

使用道具 举报

板凳
ID:332444 发表于 2020-6-18 11:08 | 只看该作者

回复

使用道具 举报

地板
ID:600952 发表于 2020-6-26 13:53 | 只看该作者
楼上说的很详细,完全赞同,对于P3的4个口用于控制锁存器不用那样写的麻烦,直接赋值给P3口1,2,4,8就可以了,写法比较简单。按键取值那样写也太啰嗦了,看起来也不直观,不如使用16个独立按键,驱动写的容易懂。
回复

使用道具 举报

5#
ID:788495 发表于 2020-6-27 09:43 | 只看该作者
楼上说的确实详细,就直接赋值P3的1、2、4、8就可以,这样的话操作比较简单,而且也没那么麻烦
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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