找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求51单片机矩阵键盘输入,四位共阴数码管简易计算机程序及仿真

[复制链接]
跳转到指定楼层
楼主
ID:175071 发表于 2017-4-21 10:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
30黑币
要求能做两位数的加减乘除

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

使用道具 举报

沙发
ID:82765 发表于 2017-4-21 22:34 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

板凳
ID:192228 发表于 2017-4-22 05:40 | 只看该作者
/*********************************************************************************
*实验名   :矩阵键盘扫描 数码管显示
*实验效果        :按S1-S16矩阵按键,数码管8位依次显示0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
*
*********************************************************************************/
#include<reg52.h>
#include"bstv51.h"

uchar code table[17]={0x3f , 0x06 , 0x5b ,0x4f , 0x66 , 0x6d ,0x7d ,
                   0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 ,
                   0x5e , 0x79 , 0x71 , 0x00};         //0-9&A-F&“不显示”  字型码

void delay(uint xms)        //延迟xms
{
    uint i,j;
        for(i=xms;i>0;i--)
          for(j=112;j>0;j--);
}

void display(uchar num)           //数码管显示函数
{
    P0=table[num];                 //段选
        DU=1;
        DU=0;
}

void keyscan4x4()
{
    uchar temp,key;


        ///////////////第一行扫描///////////////////
        P3=0xfe;//1111 1110 让P3.0口输出低
        temp=P3;
        temp=temp&0xf0;//1111 0000        位与操作 屏蔽后四位
        if(temp!=0xf0)
        {
            delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                    temp=P3;
                        switch(temp)
                        {
                          case 0xee:           //1110 1110 S1被按下
                               key=0;
                                   break;
                          case 0xde:                  //1101 1110  S2被按下
                                   key=1;
                                   break;
                          case 0xbe:                  //1011 1110  S3被按下
                                   key=2;
                                   break;
                          case 0x7e:                  //0111 1110  S4被按下
                                   key=3;
                                   break;
                        }
                        while(temp!=0xf0)
                        {
                            temp=P3;
                                temp=temp&0xf0;
                        }
                        display(key);
                }
        }
                        ///////////////第二行扫描///////////////////
        P3=0xfd;//1111 1101 让P3.1口输出低
        temp=P3;
        temp=temp&0xf0;//1111 0000        位与操作 屏蔽后四位
        if(temp!=0xf0)
        {
            delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                    temp=P3;
                        switch(temp)
                        {
                          case 0xed:           //1110 1101 S5被按下
                               key=4;
                                   break;
                          case 0xdd:                  //1101 1101  S6被按下
                                   key=5;
                                   break;
                          case 0xbd:                  //1011 1101  S7被按下
                                   key=6;
                                   break;
                          case 0x7d:                  //0111 1101  S8被按下
                                   key=7;
                                   break;
                        }
                        while(temp!=0xf0)
                        {
                            temp=P3;
                                temp=temp&0xf0;
                        }
                        display(key);
                }
         }
                        ///////////////第三行扫描///////////////////
        P3=0xfb;//1111 1011 让P3.2口输出低
        temp=P3;
        temp=temp&0xf0;//1111 0000        位与操作 屏蔽后四位
        if(temp!=0xf0)
        {
            delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                    temp=P3;
                        switch(temp)
                        {
                          case 0xeb:           //1110 1011 S9被按下
                               key=8;
                                   break;
                          case 0xdb:                  //1101 1011  S10被按下
                                   key=9;
                                   break;
                          case 0xbb:                  //1011 1011  S11被按下
                                   key=10;
                                   break;
                          case 0x7b:                  //0111 1011  S12被按下
                                   key=11;
                                   break;
                        }
                        while(temp!=0xf0)
                        {
                            temp=P3;
                                temp=temp&0xf0;
                        }
                        display(key);
                  }
                }

                        ///////////////第四行扫描///////////////////
        P3=0xf7;//1111 0111 让P3.0口输出低
        temp=P3;
        temp=temp&0xf0;//1111 0000        位与操作 屏蔽后四位
        if(temp!=0xf0)
        {
            delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                    temp=P3;
                        switch(temp)
                        {
                          case 0xe7:           //1110 0111 S13被按下
                               key=12;
                                   break;
                          case 0xd7:                  //1101 0111  S14被按下
                                   key=13;
                                   break;
                          case 0xb7:                  //1011 0111  S15被按下
                                   key=14;
                                   break;
                          case 0x77:                  //0111 0111  S16被按下
                                   key=15;
                                   break;
                        }
                        while(temp!=0xf0)
                        {
                            temp=P3;
                                temp=temp&0xf0;
                        }
                        display(key);

                 }
         }

}

void main()
{
    bstv51_init(); //学习板初始化
        P0=0;                 //位选 锁存为8位同时显示
        WE=1;
        WE=0;
        while(1)
        {
           keyscan4x4();
        }
}








/*********************************************************************
*
*                         bstv51.c
*
*********************************************************************
* 描    述: BST-V51开发板初始化
* 开发平台: BST-V51开发板+KEIL C51
********************************************************************/

#include <reg52.h>/*包含51系统头文件*/
#include "bstv51.h"/*包含BST-V51开发板头文件*/

/*BST-V51主板初始化函数*/
void bstv51_init(void)
{
        /* 引脚方向、输出初值定义 */
        FM=1;/*蜂鸣器*/
        EN=0;/*让LCD1602数据口处于输入状态,相当于LCD1602使不能,让其释放数据总线*/
        CS=1;/*TF卡使不能*/
        RST=0;/*ds1302使不能*/
}

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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