查看: 2103|回复: 1
打印 上一主题 下一主题

运用了矩阵键盘,一个按键显示0-F的一位

[复制链接]
跳转到指定楼层
沙发
发表于 2014-7-21 16:43:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/***************************************************
程序功能:通过矩阵按键,可以依次显示0到9,A到F,一个按键显示1位
接线情况:P0端口接静态数码管的a-g和DP
                  P2^0-P^3接矩阵键盘的KL3-KL0
                  P2^4-P2^7接矩阵键盘的KR3-KR0
日    期:2014/7/21
作    者:吴超
****************************************************/
#include <reg51.h>
typedef unsigned char uchar;
typedef unsigned int uint;

#define FOSC 12000000L                                //晶振的频率
#define TIMS 65536-FOSC/2/1000                //1MS

sfr AUXR        = 0x8e;

sfr P0M1        =0x93;
sfr P0M0        =0x94;

//数码管字形表,供显示时查询
uchar code disptable[18]=
{                          //定义表格一定要使用code,这样会做到程序存储区中
    0x3F,                  //"0"的字形表,0B00111111
    0x06,                  //"1"的字形表,0B00000110
    0x5B,                  //"2"的字形表,0B01011011
    0x4F,                  //"3"的字形表,0B01001111
    0x66,                  //"4"的字形表,0B01100110
    0x6D,                  //"5"的字形表,0B01101101
    0x7D,                  //"6"的字形表,0B01111101
    0x07,                  //"7"的字形表,0B00000111
    0x7F,                  //"8"的字形表,0B01111111
    0x6F,                  //"9"的字形表,0B01101111
    0x77,                  //"A"的字形表,0B01110111
    0x7c,                  //"b"的字形表,0B01111100         
    0x39,                  //"C"的字形表,0B00111001  
    0x5e,                  //"d"的字形表,0B01011110
    0x79,                  //"E"的字形表,0B01111001
    0x71,                  //"F"的字形表,0B01110001
    0x00                   // 全灭消隐
};

uchar mTimeCount = 0;                //定时器计数
uchar mSecIs0k  = 0;                //定时器标准位
uchar k_value;                                //存储按键值
/***************************************************
函数名称:tm0_init()
函数功能:定时器0的初始函数, 1ms@12MHz,1T模式
入口参数:无
返回参数:无
****************************************************/
void tm0_init()
{
        AUXR        |= 0x80;                //定时器0工作在1T模式
        TMOD        = 0x00;                        //设置定时器0工作模式0
       
        TL0                =(char)TIMS;
        TH0                =TIMS>>8;                //设置定时器0初始值

        ET0                =1;                                //使能定时器0中断
        EA                =1;                                //使能全局中断
        TR0                =1;                                //定时器0开始计数
}
/***************************************************
函数名称:keyscan()
函数功能:矩阵按键扫描程序,读出哪个按键按下
入口参数:无
返回参数:无
****************************************************/
void keyscan()
{
        uchar i,j,tmep;
        uchar buffer[4]={0xfe,0xfd,0xfb,0xf7};
        for(j=0;j<4;j++)                //循环4次,进行行扫描,四次
        {
                P2 = buffer[j];       
                tmep = 0x80;                        //先读出列的最高位
                for(i=0;i<4;i++)                //循环4次,检查列
                {
                        if(!(P2 & tmep))        //从高4位截取1位
                        {
                                k_value = i+j*4;        //获得按键值
                        }
                        tmep >>=1;
                 }
         }
}
void main()
{
        P0M1 = 0x00;
        P0M0 = 0xFF;        //P0的端口为推挽输出
        P0 = 0x00;
        tm0_init();                //定时器0的初始化

        while(1)
        {
                if(mSecIs0k == 1)
                {
                        mSecIs0k = 0;
                        keyscan();
                        P0 = disptable[k_value];
                }               
        }
}
/*******************************************************
函数名称:Timer0_ISR()
函数功能:定时器0中断服务程序
入口参数:无
返回参数:无
********************************************************/
void tm0_isr() interrupt 1 using 1
{
        if(++mTimeCount >=10)
        {
                mTimeCount = 0;
                mSecIs0k = 1;
        }
}       
       

回复

使用道具 举报

板凳
发表于 2014-7-28 21:01:42 | 只看该作者
只完成了扫描,没有消抖,好好斟酌一下马老师的程序
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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