单片机键盘的应用

发布者:Alisallll最新更新时间:2017-01-09 来源: eefocus关键字:单片机  键盘 手机看文章 扫描二维码
随时随地手机看文章

作业1:数码管前三位数显示一个跑表,从000到999,之间以百分之一秒的速度运行,当按下key1时跑表停止,再次按下时跑表开始


#include

#define uint unsigned int

#define uchar unsigned char 

 

sbit dula =P2^6;

sbit wela = P2^7;

sbit key1 = P3^7;

uchar aa,flag,bai,shi,ge,tt;

uint num,bb;

void init();

void keyscan();

void delay(uint z);

void display(uchar bai,uchar shi,uchar ge);

 

uchar code table[]={0x3f,0x06,0x5b,0x4f,

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

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

                    0x39,0x5e,0x79,0x71};

 

main()

{

    init();

    P3 = 0xff;

    while(1)

    {

        display(bai,shi,ge);

        if(key1==0)//检测是否按下

        {

            delay(10);

            if(key1==0)//确实按下了

            {

                TR0 = 0;//定时器停止

                bb ++;//计算按下的次数

                while(!key1)

                        display(bai,shi,ge);

                if(bb %2==0)

                {

                    TH0 =(65536-50000)/256;//装初值

                    TL0 =(65536-50000)%256; 

                    TR0 = 1;//重启定时器

                }

            }

        }

    }

 

}

 

 

 

void delay(uint z)

{

    uint x,y;

    for(x=z;x>0;x--)

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

}

 

void init()

{

    TMOD = 0x01;

    TH0 =(65536-50000)/256;

    TL0 =(65536-50000)%256;

    EA = 1;

    ET0 = 1;

    TR0 = 1;

 

}

 

void time0()interrupt 1

{

    TH0 =(65536-50000)/256;

    TL0 =(65536-50000)%256;

    aa++;

 

        if(aa==2)

        {

            aa = 0;

            num ++;

            if(num==1000)

                num=0;

        }

 

    bai = num/100;

    shi = num/10%10;

    ge = num%10;

 

void display(uchar bai,uchar shi,uchar ge)

{

    wela = 1;

    P0 = 0xfe;

    wela = 0;

    P0 = 0x0;//消影操作

  

    dula = 1;

    P0 = table[bai];

    dula = 0;

    tt = 25;

    while(tt--);

    dula = 1;//关灯操作,高速度扫描时必备 

    P0 = 0;

    dula = 0;

  

    wela = 1 ;

    P0 = 0xfd;

    wela = 0;

    P0= 0x0;//消影操作

  

    dula = 1;

    P0 = table[shi];

    dula = 0;

    tt = 25;

    while(tt--);

    dula = 1;//关灯操作,高速度扫描时必备 

    P0 = 0;

    dula = 0;

  

  

    wela = 1;

    P0 = 0xfb;

    wela = 0;

    P0 = 0x0;//消影操作

  

    dula = 1;

    P0 = table[ge];

    dula =0;

    tt=25;

    while(tt --);

      

    dula = 1;//关灯操作,高速度扫描时必备 

    P0 = 0;

    dula = 0;

  

}

 在上题目的基础上,用另外三个独立键盘实现按下第一个时计数停止,按下第二个时计数开始,按下第三个时计数清零重新开始


#include

#define uint unsigned int

#define uchar unsigned char 

 

sbit dula =P2^6;

sbit wela = P2^7;

sbit key1 = P3^3;

sbit key2 = P3^4;

sbit key3 = P3^5;

sbit key4 = P3^6;

uchar aa,flag,bai,shi,ge,tt;

uint num,bb;

void init();

void keyscan();

void delay(uint z);

void display(uchar bai,uchar shi,uchar ge);

 

uchar code table[]={0x3f,0x06,0x5b,0x4f,

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

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

                    0x39,0x5e,0x79,0x71};

 

main()

{

    init();

    P3 = 0xff;

    while(1)

    {

        display(bai,shi,ge);

        if(key1==0)//检测是否按下

        {

            delay(10);

            if(key1==0)//确实按下了

            {

                TR0 = 0;//定时器停止

                while(!key1)

                        display(bai,shi,ge);

                            TR0 = 1;//重启定时器

             

            }

        }

        if(key2==0)

        {

            delay(10);

            if(key2==0)

                {

                    TR0 = 0;//定时器停止

                    while(!key2)

                    display(bai,shi,ge);

                }

        }

     

        if(key3==0)

        {

            delay(10);

            if(key3==0)

                {

                    TH0=(65536-50000)/256;

                    TL0 = (65536-50000)%256;

                    TR0 = 1;//重启定时器

                    while(!key3)

                    display(bai,shi,ge);//不加入这句话有很大的bug  

                }

        }

 

        if(key4==0)

        {

            delay(10);

            if(key4==0)

                {

                    num = 0;//重新开始计数

                    while(!key4)

                    display(bai,shi,ge);

                }

        }

 

    }

 

}

 

 

 

void delay(uint z)

{

    uint x,y;

    for(x=z;x>0;x--)

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

}

 

void init()

{

    TMOD = 0x01;

    TH0 =(65536-50000)/256;

    TL0 =(65536-50000)%256;

    EA = 1;

    ET0 = 1;

    TR0 = 1;

 

}

 

void time0()interrupt 1

{

    TH0 =(65536-50000)/256;

    TL0 =(65536-50000)%256;

    aa++;

 

        if(aa==2)

        {

            aa = 0;

            num ++;

            if(num==1000)

                num=0;

        }

 

    bai = num/100;

    shi = num/10%10;

    ge = num%10;

 

void display(uchar bai,uchar shi,uchar ge)

{

    wela = 1;

    P0 = 0xfe;

    wela = 0;

    P0 = 0x0;//消影操作

  

    dula = 1;

    P0 = table[bai];

    dula = 0;

    tt = 25;

    while(tt--);

    dula = 1;//关灯操作,高速度扫描时必备 

    P0 = 0;

    dula = 0;

  

    wela = 1 ;

    P0 = 0xfd;

    wela = 0;

    P0= 0x0;//消影操作

  

    dula = 1;

    P0 = table[shi];

    dula = 0;

    tt = 25;

    while(tt--);

    dula = 1;//关灯操作,高速度扫描时必备 

    P0 = 0;

    dula = 0;

  

  

    wela = 1;

    P0 = 0xfb;

    wela = 0;

    P0 = 0x0;//消影操作

  

    dula = 1;

    P0 = table[ge];

    dula =0;

    tt=25;

    while(tt --);

      

    dula = 1;//关灯操作,高速度扫描时必备 

    P0 = 0;

    dula = 0;

  

}

 作业3:按下16个矩阵键盘依次在数码管上显示1到16的平方


#include

#define uint unsigned int

#define uchar unsigned char

sbit dula = P2^6;

sbit wela = P2^7;

 

uchar num1,num,temp,tt;

uint aa;

uchar keyscan();

void display(uchar bai,uchar shi,uchar ge);

void delay(uint z);

uchar code table[]={0x3f,0x06,0x5b,0x4f,

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

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

                    0x39,0x5e,0x79,0x71};

main()

{

 

    while(1)

    {

        display(aa/100,aa/10%10,aa%10);

        num1 = keyscan();

        aa = num1*num1;

     

    }

}

 

void delay(uint z)

{

    uint x,y;

    for(x=z;x>0;x--)

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

}

 

void display(uchar bai,uchar shi,uchar ge)

{

    wela = 1;

    P0 = 0xfe;

    wela = 0;

    P0 = 0x0;//消影操作

  

    dula = 1;

    P0 = table[bai];

    dula = 0;

    tt = 25;

    while(tt--);

    dula = 1;//关灯操作,高速度扫描时必备 

    P0 = 0;

    dula = 0;

  

    wela = 1 ;

    P0 = 0xfd;

    wela = 0;

    P0= 0x0;//消影操作

  

    dula = 1;

    P0 = table[shi];

    dula = 0;

    tt = 25;

    while(tt--);

    dula = 1;//关灯操作,高速度扫描时必备 

    P0 = 0;

    dula = 0;

  

  

    wela = 1;

    P0 = 0xfb;

    wela = 0;

    P0 = 0x0;//消影操作

  

    dula = 1;

    P0 = table[ge];

    dula =0;

    tt=25;

    while(tt --);

      

    dula = 1;//关灯操作,高速度扫描时必备 

    P0 = 0;

    dula = 0;

  

}

 

 

uchar keyscan()

{

        P3 = 0xfe;//1111 1110

        temp = P3;

        temp = temp&0xf0;//11110000

        while(temp!=0xf0)//如果有键摁下

        {

            delay(5);//再次检测P3口

            temp = P3;

            temp = temp&0xf0;

            while(temp!=0xf0)

            {

                temp = P3;  

                switch(temp)

                {

                    case 0x7e:num = 1;

                        break;

                    case 0xbe:num = 2;

                        break;

                    case 0xde:num = 3;

                        break;

                    case 0xee:num = 4;

                        break;

                     

                }

                while(temp!=0xf0)//松手检测

                {

                    temp = P3;

                    temp = temp&0xf0;

                    display(aa/100,aa/10%10,aa%10);//这句话不加,有很大的bug  

                }

             

            }

        }

 

         

        P3 = 0xfd;//1111 1101

        temp = P3;

        temp = temp&0xf0;//11110000

        while(temp!=0xf0)//如果有键摁下

        {

            delay(5);//再次检测P3口

            temp = P3;

            temp = temp&0xf0;

            while(temp!=0xf0)

            {

                temp = P3;  

                switch(temp)

                {

                    case 0x7d:num = 5;

                        break;

                    case 0xbd:num = 6;

                        break;

                    case 0xdd:num = 7;

                        break;

                    case 0xed:num = 8;

                        break;

                     

                }

                while(temp!=0xf0)//松手检测

                {

                    temp = P3;

                    temp = temp&0xf0;

                    display(aa/100,aa/10%10,aa%10);

                }

         

            }

        }

 

 

 

        P3 = 0xfb;//1111 1011

        temp = P3;

        temp = temp&0xf0;//11110000

        while(temp!=0xf0)//如果有键摁下

        {

            delay(5);//再次检测P3口

            temp = P3;

            temp = temp&0xf0;

            while(temp!=0xf0)

            {

                temp = P3;  

                switch(temp)

                {

                    case 0x7b:num = 9;

                        break;

                    case 0xbb:num = 10;

                        break;

                    case 0xdb:num = 11;

                        break;

                    case 0xeb:num = 12;

                        break;

                     

                }

                while(temp!=0xf0)//松手检测

                {

                    temp = P3;

                    temp = temp&0xf0;

                    display(aa/100,aa/10%10,aa%10);

                }

     

            }

        }

 

        P3 = 0xf7;//1111 0111

        temp = P3;

        temp = temp&0xf0;//11110000

        while(temp!=0xf0)//如果有键摁下

        {

            delay(5);//再次检测P3口

            temp = P3;

            temp = temp&0xf0;

            while(temp!=0xf0)

            {

                temp = P3;  

                switch(temp)

                {

                    case 0x77:num = 13;

                        break;

                    case 0xb7:num = 14;

                        break;

                    case 0xd7:num = 15;

                        break;

                    case 0xe7:num = 16;

                        break;

                     

                }

                while(temp!=0xf0)//松手检测

                {

                    temp = P3;

                    temp = temp&0xf0;

                    display(aa/100,aa/10%10,aa%10);

                }

     

            }

        }

         

        return num;

 

}

 其实,单片机的功能模块有很多的示例代码可以参考,也正是由于c语言具有极好的移植性,所以大大加快了现在点子产品的开发周期


关键字:单片机  键盘 引用地址:单片机键盘的应用

上一篇:单片机液晶操作
下一篇:单片机键盘的操作

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

51单片机基础之OLED
取模软件的配置: 百度网盘 获取链接: 链接:https://pan.baidu.com/s/1rFjU00HDLwGi8WZsOY7jnA 提取码:1234 代码: main.c文件 #include reg51.h #include oled.h void main(void) { unsigned int t=1; OLED_Init(); //初始化OLED OLED_Clear(); //清屏函数 while(1) { //这个函数显示中文 OLED_ShowCHinese(0,0,0);//陈 //第一个形参是列,第二个是行,第三个是显示哪个中
[单片机]
51<font color='red'>单片机</font>基础之OLED
基于AT89C51单片机的RS 232串行数据截取器设计
0 引言 目前,我国的装备技术水平和发达国家相比还有一定的差距,对于国外引进的先进设备,如何才能在没有任何技术资料的情况下破解其技术瓶颈,实现装备技术水平的跨越式发展是我国普遍面临的技术难题。为此作者认为获取设备与控制计算机之间的通信数据,分析其通信协议是解决这个难题的基础。基于此,本文设计了数据截取器。 很多设备和其控制计算机之间采用的是RS 232标准串行接口进行通信,本文设计和实现了RS 232串行通信数据截取器,能有效地截取设备与其控制计算机之间的通信数据。 1 截取器硬件部分设计 1.1 总体框图及原理 系统原理框图如图1所示。 原理分析:具体设备与其控制计算机之间的通信线路通过电平转换分两路。一路是
[单片机]
基于AT89C51<font color='red'>单片机</font>的RS 232串行数据截取器设计
以C8051F021单片机和RA8835液晶控制器为核心的液晶
本文给出了一种基于C8051F021和RA8835实现的低成本液晶显示方案。随着电子产品设计技术的不断发展,电子产品的设计,尤其是人机交互界面的设计日益趋向人性化。这其中的液晶显示屏以其具有能显示复杂文字及图形、显示面积大小随意、功耗低、轻薄等优点,而得到广泛的应用。近年来,随着单片机技术的飞速发展,涌现了多种性能优良且成本很低的单片机品种。C8051F系列单片机就是其中之一。在工程应用中,C8051F021可在满足性能要求的前提下,减少浪费、降低成本。 1 系统主要器件 1.1 C8051F021单片机 本系统选用性能优良且成本较低的SOC单片机C8051F021作为控制核心。C8051F201是完全集成的混合信号系统级M
[单片机]
以C8051F021<font color='red'>单片机</font>和RA8835液晶控制器为核心的液晶
单片机的抗干扰性能分析
  搞过产品的朋友都有体会,一个设计看似简单,硬件设计和代码编写很快就搞定,但在调试过程中却或多或少的意外,这些都是抗干扰能力不够的体现。   下面讨论一下如何让你的设计避免走弯路:   抗干扰体现在2个方面,一是硬件设计上,二是软件编写上。   这里重点提醒:在MCU设计中主要抗干扰设计是在硬件上,软件为辅。因为MCU的计算能力有限,所以要在硬件上花大工夫。   看看干扰的途径:   1:干扰信号干扰MCU的主要路径是通过I/O口,一是影响了MCU的数据采集,二是影响内部其它寄存器。   解决方法:后面讨论。   2:电源干扰:MCU虽然适应电压较宽(3-5。5V),但对于电源的波动却很敏感,比如说MCU可以在3V
[单片机]
单片机智能温度检测控制系统程序设计
实验说明: 根据自己使用的LCD1602是否带有转接板,如果带有转接板的即为4位,需在LCD.H头文件中将宏#define LCD1602_4PINS打开,我们这里使用的LCD1602是8位,所以默认将该宏注释。 实验接线: 1,LCD1602液晶模块-- 单片机管脚 参考LCD1602液晶显示实验接线(开发攻略内在对应的实验章节内实验现象有接线说明) 2,独立按键模块-- 单片机管脚 K1-- P34 K2-- P35 K3-- P32 3,蜂鸣器模块-- 单片机管脚 BEEP-- P15 4,LED模块-- 单片机管脚 D1-- P24
[单片机]
基于STC15w单片机系列 自带的AD转换程序
15W系列是目前51单片机里面可用资源较多的处理器。一般的设计都可以用,本次分享下利用单片机自带的AD转换座一个数字电压表。显示用的LCD1602 单片机源程序如下: #include 15w.H #include math.h #include string.h #include stdio.h #include intrins.h #define uchar unsigned char #define uint unsigned int typedef unsigned int WORD; #define ADC_POWER 0x80 //ADC电源控制位 #define ADC_FLAG
[单片机]
中国MCU市场有望于2013年复苏
据IHS公司的一份中国研究专题报告,继2012年萎缩之后,随着能效要求与设备升级推动嵌入及自动应用对于 MCU芯片 的需求增长,中国微控制器(MCU)市场今年有望回升。 今年中国MCU市场的营业收入预计达到31亿美元,比2012年的29亿美元增长7.7%。去年该市场收缩2.6%,但从2013年开始至少会连续五年保持增长,预计2017年达到45亿美元。 去年中国MCU市场下滑主要是受全球经济形势低迷以及中国实施紧缩的货币政策所致。中国政府随后在第三季度放宽了限制,而且中国的MCU等产品出口市场开始缓慢复苏。 今年,中国MCU市场获得新的动力,在嵌入应用及自动控制产品及设备领域的销售再度快速增长,包括消费与工业电器、汽车系统和智能电
[单片机]
单片机如何提高编程效率优化程序?
在进行8051单片机应用系统程序设计时,编程都往往少不了要直接操作系统的各个存储器地址空间。 C51程序经过编译之后产生的目标代码具有浮动地址,其绝对地址必须经过BL51连接定位后才能确定。 为了能够在C51程序中直接对任意指定的存储器地址进行操作,可以采用扩展关键字“at”、指针、预定义以及连接定位控制命令。 在这些方法中,本人认为最简单而有效的方法是用“ _at_ ”关键字来对指定变量存储器空间绝对地址来指定。一般格式如下: 数据类型 标识符 _at_ 地址常数 其中: (1).存储器类型: idata、data、xdata等C51能够识别的所有类型,最好不要省略。 (2).数据类型: 可以用int、long
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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