找回密码
 立即注册

QQ登录

只需一步,快速开始

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

矩阵键盘程序,请帮忙修改程序,可送话费,可商量,多谢帮忙!

[复制链接]
跳转到指定楼层
楼主
ID:47843 发表于 2015-7-2 22:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1黑币
#include <REG52.H>
#include "TM16681.h"  //4位数码管H文件

/**********************************
宏定义字符串
**********************************/
#define keyport P2          //定义P2口为矩阵键盘输入口

unsigned char xdata ComData[4];        //定义数组储存键盘数据

void delayms(unsigned int count); //延时函数
unsigned char keyscan(void);          //反转法矩阵键盘扫描函数
unsigned char keypro(void);                  //反转法取得矩阵键盘键值转换成0-15数值函数



/******************************************************

                主函数

*******************************************************/
void main(void)
{
        unsigned char i=0,keynum[4];
        unsigned int resuit;
       
        while(1)
        {

                keynum[i]=keypro();         //我的意思是把取得的按键值送数组保存
                i++;
                if(i>=4)                        //我的意思是要4个按键值分别送往千位,百位,十位,个位
                {                
                        i=0;

                        resuit=keynum[0]*1000+keynum[1]*100+keynum[2]*10+keynum[3];
                        //这句话的意思是从数组取数
               
                }
               
            NixieTube_DisplayIntegerNumber(resuit);//把取出来的数送数码管显示
                                                                                                   //可是出来的结果是按1显示1111,按2显示2222、.......
                                                                                                //松开按键回到显示0,这不是我要的结果
        }

}
//请帮忙写个函数:按键值存入4位数后锁存,比如说0-9用来计数了,格式0000-9999任意数。那么10号按键取消后才能再输入
//11号按键用来确定或调用数组数据的意思,可反复调用,按11号键反复把数组送别的函数中使用。
/****************************
  反转法按键扫描函数,返回扫描值
******************************/
unsigned char keyscan(void)
{
        unsigned char num1;
        unsigned char KEY_h,KEY_l;//定义行列值中间变量
        P2=0xf0;     //这句话意思是让行线输出全为0
        if(P2!=0xf0) //不等于0就是有按键按下
                {
                        delayms(10);//延时去抖动
                        if((P2&0xf0)!=0x0f)//再次检测有关按键按下
                                {
                                        KEY_l=P2&0xf0;//读入列线值
                                        P2=0x0f;      //检测行线值
                                        KEY_h=P2&0x0f;//读入行线值
                                        num1=(KEY_l+KEY_h); //组合键值赋给num1
                                }
                }return num1;   //返回键盘码值
}
/*****************************
按键值处理函数,返回扫描键值
********************************/
unsigned char keypro(void)
{
        switch(keyscan())//判断读入键值
                {
                        case 0xe7:return 0;break;
                        case 0xdd:return 1;break;         
                        case 0xbd:return 2;break;         
                        case 0x7d:return 3;break;         
                        case 0xdb:return 4;break;
                        case 0xbb:return 5;break;
                        case 0x7b:return 6;break;
                        case 0xd7:return 7;break;
                        case 0xb7:return 8;break;
                        case 0x77:return 9;break;  
                        case 0x7e:return 10;break;          
                        case 0xbe:return 11;break;
                        case 0xde:return 12;break;
                        case 0xee:return 13;break;
                        case 0xed:return 14;break;
                        case 0xeb:return 15;break;
                        default:return 0;break;           //如果没有按键按下,送0
                }
}



评分

参与人数 1黑币 +50 收起 理由
admin + 50 赞一个!

查看全部评分

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

使用道具 举报

沙发
ID:83703 发表于 2015-7-12 11:21 | 只看该作者
#include <reg52.h>

sbit BUZZER=P3^7;

unsigned char second=0,count=0;          //设置初值
unsigned char seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//LED段码表
bit RunFlag=0;

unsigned char KeyScan();
void delay(void);

void main(void)
{
        unsigned char KeyValue;
       
        TMOD=0x1;        //设置T0为定时器模式
        TH0=0x3c;        //设置T0为50ms定时长度
        TL0=0xb0;
        PT0=0;
        TR0=1;                //启动T0
        ET0=1;                //T0中断允许
        EA=1;                //CPU中断允许
       
        while(1)
        {               
                P0=seg[second/10];        //显示十位秒值       
                P2=seg[second%10];        //显示个位秒值

                KeyValue=KeyScan();

                switch (KeyValue)
                {
                        case 0:
                                second=0;
                                break;
                        case 1:
                                second++;
                                break;
                        case 2:
                                second--;
                                break;
                        case 3:
                                RunFlag=~RunFlag;
                                break;
                        default:
                                break;
                }
        }
}

unsigned char KeyScan()
{
        unsigned char i,j,key=0x10;

        P1=0xf0;        //Yi=0;
        if ((P1 & 0xf0)!= 0xf0)        //有键按下?
        {
                delay();                          //去抖动
                for (i=0;i<4;i++)        //共扫描四行
                {
                         P1=(0xf0 | (~(0x01<<i)));
                        if ((P1 & 0xf0)!=0xf0)        //本行有键按下?
                        {
                                for (j=0;j<4;j++)
                                {
                                        if ((P1>>j & 0x10)==0x0)        //找到按键
                                        {
                                                key=i*4+j;
                                                break;
                                        }
                                }
                        }

                }                       
                P1=0xf0;
                while ((P1 & 0xf0)!= 0xf0);        //等待键抬起
                delay();                          //去抖动
        }
        return key;
}

void delay(void)
{
        unsigned char i,j;

        for (i=0;i<100;i++)
                for (j=0;j<100;j++);
}

void T0_INT() interrupt 1 using 1        //定时器T0 50ms 中断
{
        TH0=0x3c;                //重置初值
        TL0=0xb0;

        if (RunFlag==0)
                return;

        count++;                //计数增量
        if (count==20)        //是否已到1s
        {
                count=0;        //清除计数值

                second++;        //秒增量
                if (second>=60)
                        second=0;

                if (second%5==0)
                        BUZZER=0;
                else
                        BUZZER=1;
        }
}

评分

参与人数 1威望 +50 黑币 +50 收起 理由
admin + 50 + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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