单片机键盘-示例程序代码

发布者:温暖梦想最新更新时间:2017-01-18 来源: eefocus关键字:单片机键盘  程序代码 手机看文章 扫描二维码
随时随地手机看文章

郭天祥键盘部分的代码真是冗长,难道是为了易懂,但也不是越长越好懂啊,看看我写的。


扫描法



#include

#include


sbit we=P2^7;

sbit du=P2^6;


unsigned char code table[] = {

0x3f , 0x06 , 0x5b , 0x4f,

0x66 , 0x6d , 0x7d , 0x07,

0x7f , 0x6f , 0x77 , 0x7c,

0x39 , 0x5e , 0x79 , 0x71,

0x00};


void ini_t0();

void show();

void delayms(unsigned time);

void keyscan();

void matrixscan();



unsigned char num[6]={0,0,16,0,0,16};

unsigned char count=0;

unsigned char nums=0;


void main()

{

      ini_t0();

    

    while(1)

    {

        keyscan();

        num[1]=nums/10;

        num[0]=nums%10;

        matrixscan();

        show();

    }

}


void matrixscan()

{

    unsigned char i,j;

    unsigned char temp;


    for(i=0;i<4;i++)

    {

        P3=~(1<

        if((P3|0x0f)!=0xff)    //判断此时是否有列为低电平

        {                    //有则得到行列位置i+1,j+1

            delayms(10);

            if((temp=P3|0x0f)!=0xff)

            {

                while((P3|0x0f)!=0xff);

                for(j=0;j<4 && ( temp& 0x10<

                    ;

                num[4]=i+1;

                num[3]=j+1;

                break;

            }

        }

    }

    P3=0xff;    //还原电平

}


void keyscan()

{

    unsigned char temp;


    if((P3|0x0f)!=0xff)

    {

        delayms(10);

        if((temp=P3|0x0f)!=0xff)

        {

            while((P3|0x0f)!=0xff);

            switch(temp)

            {

            case 0xef:

                if(++nums==60)

                    nums=0;

                break;

            case 0xdf:

                if(nums--==0)

                    nums=59;

                break;

            case 0xbf:

                nums=0;

                break;

            case 0x7f:

                TR0=~TR0;

                break;

            }

        }

    }

}


void t0_time() interrupt 1

{

    TH0=(65536-45872)/256;

    TL0=(65536-45872)%256;

    count++;


    if(count==20)

    {

        count=0;

        if(++nums==60)

            nums=0;

    }

}


void ini_t0()

{

    EA=1;

    ET0=1;

    TMOD=0x01;

    TH0=(65536-45872)/256;

    TL0=(65536-45872)%256;

}


void show()

{

    unsigned char i;

    

    for(i=0;i<6;i++)

    {

        P0=0xff;

        we=1;

        we=0;      


        P0=table[num[i]];

        du=1;

        du=0;


        P0=~(0x20>>i);

        we=1;

        we=0;


        delayms(1);

    }

}


void delayms(unsigned time)

{

    unsigned i,j;


    for(i=time;i>0;i--)

        for(j=110;j>0;j--)

        ;

}


 行列反转法,更简单的方法。可以再外加一个 “if和延时” 来去抖动



 1 void matrixscan()

 2 {

 3     unsigned char temp,i;

 4 

 5     P3=0x0f;

 6     if(P3!=0x0f)

 7     {

 8         temp=P3;

 9         P3=0xf0;

10         temp|=P3;

11         while(P3!=0xf0)

12             ;

13         for(i=0;i<4 && (temp& 0x01<

14             ;

15         num[1]=i+1;

16         for(i=0;i<4 && (temp& 0x10<

17             ;

18         num[0]=i+1;

19     }

20 }


关键字:单片机键盘  程序代码 引用地址:单片机键盘-示例程序代码

上一篇:单片机数码管显示-消影问题
下一篇:DS1302-演示代码

推荐阅读最新更新时间:2024-03-16 15:31

AVR单片机扫描4X4矩阵键盘并数码管显示程序
/* program name : keyboard ; 功能描述 : 扫描16个按键(4X4),并把键值显示在数码管上(两位); 要点 : 在扫描按键时运用了比较复杂的两个for()循环嵌套式 扫描方案,大大减少了程序量,循环嵌套方案让我纠结了好久, 键值有0~9,上,下,左,右,确认,清零; 体会: 又一个里程碑,泪奔啊...我似乎成了 代码男神 啊...; 实验用时: 约等于14小时(每天2小时X7天); 完成时间: 2013-11-19 23:58:22 */ #include iom16v.h #include macros.h #define uint8 unsi
[单片机]
PIC单片机温感器DS18B20 C语言程序代码
/*温感器 此为自已写的,已修正时序,自测过延时时间 采用天祥温度转换模块算法 */ #include pic.h __CONFIG(0X3B31); #define uint unsigned int #define uchar unsigned char #define DQ RC1 #define DQ_DIR TRISC1 #define DQ_HIGH() TRISC1=1 #define DQ_LOW() DQ=0;TRISC1=0 unsigned char shi; //整数十位 unsigned char ge; //整数个位 unsigned char shifen; //十
[单片机]
PIC<font color='red'>单片机</font>温感器DS18B20 C语言<font color='red'>程序代码</font>
MSP430F149 TimerA 输出pwm信号 C程序代码
MSP430F149 TimerA 输出pwm信号  注意其中寄存器设置与pwm信号输出引脚的对应关系 P1.2-TA1,TACCR1,TACCTL1;,P1.3-TA2, TACCR2,TACCTL2。 #include msp430x14x.h #define uint unsigned int #define uchar unsigned char void int_clk() { uchar i; BCSCTL1 &= ~XT2OFF; //打开XT振荡器 BCSCTL2 |= SELM1+SELS; //MCLK为8MHz,SMCLK为8MHz do {
[单片机]
PIC单片机4×4行列式键盘的工作原理解析
在本文中,小编将对pic单片机的4×4行列式键盘的工作原理加以介绍,以帮助大家增进对pic单片机键盘系统的了解,方便后期编程使用。 (1)单片机系统键盘原理 行列式键盘的接法比独立式键盘的接法复杂,编程实现上也会比较复杂。但是,在占用相同的I/O端口的情况下,行列式键盘的接法会比独立式接法允许的按键数量多,其原理图如图1所示。 图1 4×4行列式键盘的原理图 实际的工程中,可能会使用PIC16C5X这种通用的可编程的键盘、显示接口器件,使用PIC16C5X单片器件就能够完成键盘输入和显示控制两种功能。 行列式键盘的工作方式是先用列线发送扫描字,然后读取行线的状态,查看是否有按键按下。键盘部分提供一种扫描的工作方式,可以
[单片机]
PIC<font color='red'>单片机</font>4×4行列式<font color='red'>键盘</font>的工作原理解析
At89c51单片机键盘扫描和显示程序
;****************************************************** ;* 名称:kbd ;* 功能:从键盘中读入按键值,存入寄存器A:r*4+c ;* 输入: ;* 输出: A=按键值 ;****************************************************** org 0000h ljmp main org 0200h main: init: MOV 60H,#10h MOV 61H,#10h MOV 62H,#10h MOV 63H,#10h wait: acall keyscan ;有键按下,
[单片机]
51单片机超声波测距程序代码
51单片机超声波测距程序代码 /超声波模块ME007显示程序 //晶振=8M //MCU=STC10F04XE //P0.0-P0.6共阳数码管引脚 //Trig = P1^0 //Echo = P3^2 #include reg52.h //包括一个52标准内核的头文件 #define uchar unsigned char //定义一下方便使用 #define uint unsigned int #define ulong unsigned long //*********************************************** sfr CLK_DIV = 0x9
[单片机]
C#实现USB接口的程序代码
namespace ConsoleApplication1 {     class Program     {         static void Main(string args)         {             USB usb;             usb = new UDisk();//插入U盘             usb.OutputFile();//从U盘读出文件             usb.InputFile();//往U盘写入文件             usb.Dispose();//拔出U盘              Console.WriteLine("");            
[嵌入式]
C51单片机矩阵键盘扫描去抖程序
  这段有1个C51的项目,用的是新华龙的C51 F020单片机。项目中要使成为事实4*5的矩阵键盘。矩阵电路图如次如示      此中,四条列线接在 F020的P2~P5口线上,5条行线接在P5口线上(F020的P5口是差别于平凡C51的扩大接口,不克不及位寻址)。同时4条列线接在一四输入与非门(74LS20)上,门输出接F020的外间断1,如许,不论什么一键按下,都会孕育发生间断,报信程序举行键盘电子扫描。   托1个新手给写了键盘的电子扫描程序,基本功效都能使成为事实,但对键盘的去抖措置惩罚老是做欠好,体现是或不克不及去抖,或按钮相应太卡,或采集到纰缪键值。看来新手对矩阵键盘电子扫描原理掌握较好(网上资料多)
[单片机]
C51<font color='red'>单片机</font>矩阵<font color='red'>键盘</font>扫描去抖程序
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved