找回密码
 立即注册

QQ登录

只需一步,快速开始

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

矩阵键盘

[复制链接]
跳转到指定楼层
楼主
本帖最后由 2842687945 于 2014-10-26 20:48 编辑

/*******************利用定时器扫描读取键码*******************/
#include <reg52.h>
typedef unsigned int uint16;
typedef unsigned char uint8;
//定时器0的初始化
void time0(void)
{
        TMOD = 0x01;//设置定时器0的工作方式为1
        TH0 = 0xff;//定时10us定时器0的高位端
        TL0 = 0xf6;//定时10us定时器0的低位端
        ET0 = 1;//开启定时器0中断
        TR0 = 1;//启动定时器0
        EA = 1;//开启总中断
}
//矩阵键盘函数
void key_P1(void)
{
         uint8 code led[] = {
                                      0x3f,0x06,0x5b,0x4f,
                                      0x66,0x6d,0x7d,0x07,
                                      0x7f,0x6f,0x77,0x7c,
                                      0x39,0x5e,0x79,0x71
                                      };//共阴数码管的段码
         P1 = 0xef;//打开第一列
         //第一列的键码
         switch(P1)
         {
                 case 0xee:P0 = led[0];break;
                case 0xed:P0 = led[1];break;
                case 0xeb:P0 = led[2];break;
                case 0xe7:P0 = led[3];break;
                default :break;
         }
         P1 = 0xdf;//打开第二列
         //第二列的键码
         switch(P1)
         {
                 case 0xde:P0 = led[4];break;
                case 0xdd:P0 = led[5];break;
                case 0xdb:P0 = led[6];break;
                case 0xd7:P0 = led[7];break;
                default :break;
         }
         P1 = 0xbf;//打开第三列
         //第三列的键码
         switch(P1)
         {
                 case 0xbe:P0 = led[8];break;
                case 0xbd:P0 = led[9];break;
                case 0xbb:P0 = led[10];break;
                case 0xb7:P0 = led[11];break;
                default :break;
         }
         P1 = 0x7f;//打开第四列
         //第四列的键码
         switch(P1)
         {
                 case 0x7e:P0 = led[12];break;
                case 0x7d:P0 = led[13];break;
                case 0x7b:P0 = led[14];break;
                case 0x77:P0 = led[15];break;
                default :break;
         }
}
//主函数
void main(void)
{
        P1 = 0xff;//P1口的初始化
        time0();//初始化
        while(1)
        {
               
        }
}
//定时器0的子服务函数
void inti(void) interrupt 1
{
        TH0 = 0xff;//重新赋值
        TL0 = 0xf6;
        key_P1();//调用矩阵键盘函数
}

QQ截图20141026204753.png (19.56 KB, 下载次数: 119)

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

使用道具 举报

沙发
ID:44262 发表于 2014-10-26 20:06 来自手机 | 只看该作者
有电路图吗
回复

使用道具 举报

板凳
ID:64817 发表于 2014-11-1 17:18 | 只看该作者
能否详细解说一下,进入一次中断检测一次key_P1()的值,如何消抖处理,,。学习一下。
回复

使用道具 举报

地板
ID:69319 发表于 2014-12-8 19:10 | 只看该作者
楼主这个程序能不能用汇编写给我学习一下
回复

使用道具 举报

5#
ID:203338 发表于 2017-9-25 10:45 | 只看该作者
666可以看看
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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