标题: 矩阵键盘程序,请帮忙修改程序,可送话费,可商量,多谢帮忙! [打印本页]

作者: hbljcxl    时间: 2015-7-2 22:19
标题: 矩阵键盘程序,请帮忙修改程序,可送话费,可商量,多谢帮忙!
#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
                }
}




作者: zjlang    时间: 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;
        }
}





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1