5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)

标题: stc89c52单片机学习—4*4矩阵键盘 [打印本页]

作者: lc6211668    时间: 2013-8-31 14:23
标题: stc89c52单片机学习—4*4矩阵键盘
/*******************************************************************************
* 实验名        : 矩阵键盘
* 使用的IO        : P0连接1位静态数码管,P2连接4*4矩阵键盘
* 实验效果      : 按下按键,显示0-15数字,
* 注意                :单片机STC89C52 编译环境KEIL                         :
*******************************************************************************/
#include<reg51.h>
#include<intrins.h>       

#define SMG_DISPLAY P0
#define K1 P2

unsigned char code SMG_CODE[17]=

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x

ff };
unsigned int number;

void Delay10ms( );   //延时10ms

/*******************************************************************************
* 函数名         : main
* 函数功能                   : 主函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void main(void)
{
unsigned int i;
number=16;
        while(1)
        {
        K1=0x0f;                                  //0000 1111        扫描列
        if(K1!=0x0f)                //检测按键K1是否按下
                        {
                        Delay10ms();        //消除抖动
                        if(K1==0x07)                        //0000 0111           第1列被按下


                        number=0;
                        if(K1==0x0b)                        //0000 1011           第2列被按下


                        number=1;
                        if(K1==0x0d)                        //0000 1101           第3列被按下


                        number=2;       
                        if(K1==0x0e)                        //0000 1110           第4列被按下


                        number=3;                       
                        }
        K1=0xf0;        //1111 0000                    扫描行
        if(K1!=0xf0)
                        {
                       
                        if(K1==0x70)                        //0111 0000            第1行被按下


                        number=number+0;
                        if(K1==0xb0)                        //1011 0000            第2行被按下


                        number=number+4;
                        if(K1==0xd0)                        //1101 0000            第3行被按下


                        number=number+8;
                        if(K1==0xe0)                        //0111 0000            第4行被按下


                        number=number+12;                                               

                                               
                          }
        if(number==16)       
        {               
         SMG_DISPLAY= SMG_CODE[number];
        }                         
                else  SMG_DISPLAY= SMG_CODE[number]&0x7f;                       

//0111 1111
             
        }
        while((i<50)&&(K1!=0xf0))         //检测按键是否松开
                {
                        Delay10ms();
                        i++;
                }
        i=0;
                               
                       
}
/*******************************************************************************
* 函数名         : Delay10ms
* 函数功能                   : 延时函数,延时10ms
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void Delay10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}



作者: lc6211668    时间: 2013-8-31 14:24
记录自己航模电子DIY的学习过程~~20130831





欢迎光临 5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年) (http://wz.5imx.com/) Powered by Discuz! X3.3