keypad 按键显示

keypad 按键显示main.c#include”config.h”//矩阵按键扫描头文件#include”anjian.h”//1602显示头文件#include”1602.h”#include”music.h”sbitLED=P1^0;u8codekey[]={‘0′,’1′,’2′,’3′,’4′,’5′,’6′,’7′,’8′,’9′,’*’,’#’};//3*4手机拨号键盘号码u8

大家好,又见面了,我是你们的朋友全栈君。

这里写图片描述

main.c

#include "config.h"
//矩阵按键扫描头文件
#include "anjian.h"
//1602显示头文件
#include "1602.h"
#include "music.h"

sbit LED=P1^0;
u8 code key[]={
  
  '0','1','2','3','4','5','6','7','8','9','*','#'};//3*4手机拨号键盘号码

u8 code title[]="- phone number -";
u8 keynum=12;
//数字缓冲区
u8 Number_Str[]={
  
  " "};
u8 i=0,j;
//设定工作方式
void port()
{
    TMOD=0x21; //(定时器T0工作方式1、软启动、定时,驱动蜂鸣器);(T1工作方式2、软启动,设置串口波特率) 

    //串口初始化
    TH1=0xfd; //波特率9600
    TL1=0xfd;
    TR1=1;  
    PCON=0x00;
    SCON=0X40;//串口工作方式1,8位异步收发,(REN=0)不允许接收

    //定时器初始化,驱动蜂鸣器发声
    TH0=63628/256;
    TL0=63628%256;  //根据蜂鸣器频率设置计数初值
}

void init()
{
  EA=1;
  EX0=1;//允许外部中断0
  IT0=1;//下降沿引发外部中断
  EX1=1;//允许外部中断1
  IT1=1;//下降沿引发外部中断
}

void main()
{   
    port();
    LCD_Init();//使用前初始化
    display_char(title,0x00);
    while(1)
    {
        keynum=keyscan();//扫描按键
        init();
        if(keynum<12)   
        {       
            EA=0;//关键:两个定时器同时使用时,在串口收发时,最好把EA关掉,处理完后在将EA打开。
            SBUF=key[keynum];
            while(!TI);//检测发送标志位TI, TI=0,未发送完
            TI=0;//一个字节发送完,TI清0

            //打开蜂鸣器
            EA=1;
            ET0=1;  //允许计数器T0中断
            TR0=1;  //启动计数器T0驱动蜂鸣器
            sound(keynum);
            delay(300);
            BEEP=1;  TR0=0;//停止定时器,关闭蜂鸣器

            if(keynum==0xFF) continue;
            if(++i == 12)                            //超过十一位时清空
            {
               for(j=0;j<16;j++) 
               Number_Str[j]=' ';
               i=0;
            }
            Number_Str[i]=key[keynum];
            display_char(Number_Str,0x40);
        }
    }   
}
//外部中断0
void EX_INT0() interrupt 0       /*INT0中断服务程序*/
{
    LED=~LED;
    for(j=0;j<16;j++) 
    Number_Str[j]=' ';
    i=0;
    display_char(Number_Str,0x40);
}
//外部中断1
void EX_INT1() interrupt 2      /*INT0中断服务程序*/
{
   PlayMusic(); //播放生日快乐 
}

void Time0() interrupt 1//定时器T0中断 
{   
   TH0 = TH00;
   TL0 = TL00;
   BEEP = ~BEEP;       
} 

anjian.h

#include "config.h"

u8 keyscan()//手机拨号盘按键扫描函数:要去抖,若有按键按下,返回对应的按键值(0-9,*-10,#-12),否则返回16
{
    unsigned char i,key=16,row,temp;//初值设置为16,目的是:没有按键按下时返回16;若不设初值(默认值为0),没有按键按下时,将返回0,会误认为0被按下 

    row=0xef;        

    for(i=0;i<4;i++)
    {
        P2=0xff;  
        P2=row;
        row=_crol_(row,1); 
        temp=P2;  
        temp=temp&0x0f;  
        if(temp!=0x0f)  
        {  
            delay(20);  
            temp=P2;  
            temp=temp&0x0f;  
            if(temp!=0x0f)  
            {  
                switch(temp)  
                {  
                    case 0x0e:key=1+i*3;break;  
                    case 0x0d:key=2+i*3;break;  
                    case 0x0b:key=3+i*3;  
                }
                do{
                    temp=P2;  
                    temp=temp&0x0f;  
                }while(temp!=0x0f);  //等待按键释放 
            }  
        }
    }  
    if(key==11) key=0;
    if(key==12) key=11;
    return(key);//没找到
}

//按键音
void sound(u8 keynum)
{
  switch(keynum)
    {
       case 0:TH00=0xf3;TL00=0x07;break;     //低3 
       case 1:TH00=0xf3;TL00=0xc8; break;    //低4 
       case 2:TH00=0xf5;TL00=0x1e; break;    //低5 
       case 3:TH00=0xf6;TL00=0x4c; break;    //低6 
       case 4:TH00=0xf7;TL00=0x5a; break;    //低7 
       case 5:TH00=0xf7;TL00=0xd8; break;    //中1 
       case 6:TH00=0xf8;TL00=0xbd; break;    //中2 
       case 7:TH00=0xf9;TL00=0x87; break;    //中3 
       case 8:TH00=0xf9;TL00=0xe4; break;    //中4 
       case 9:TH00=0xfa;TL00=0x90; break;    //中5 
       case 10:TH00=0xfb;TL00=0x29; break;   //中6 
       case 11:TH00=0xfb;TL00=0xb1; break;   //中7 
       case 12:TH00=0xfb;TL00=0xef; break;   //高1 
       case 13:TH00=0xfc;TL00=0x62; break;   //高2 
       case 14:TH00=0xfc;TL00=0xc7; break;   //高3 
       case 15:TH00=0xfc;TL00=0xf6; break;   //高4 
    }
    TH0=TH00;
    TL0=TL00;
// TR0=1;
}

music.h

#include "config.h"

//生日快乐歌的音符频率表,不同频率由不同的延时来决定
u8 code SONG_TONE[]={
  
  201,212,190,212,159,169,212,212,190,212,142,159,
                        212,212,106,126,159,169,190,119,119,126,159,142,159,0};
//生日快乐歌节拍表,节拍决定每个音符的演奏长短
u8 code SONG_LONG[]={
  
  9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0};

void PlayMusic()
{
    u16 i=0,j,k;
    while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
    {   //播放各个音符,SONG_LONG为拍子长度
        for(j=0;j<SONG_LONG[i]*20;j++)
        {
            BEEP=~BEEP;
            //SONG_TONE延时表决定了每个音符的频率
            for(k=0;k<SONG_TONE[i]/3;k++);
        }
        delay(10);
        i++;        
    }
}

1602.h

/*****************************显示输入文本数字等*********************************************/
void display_char(u8 *point, u8 address)
{
 unsigned char i;
 WrComLCD(0x80 + address);
 for (i=0;i<16;i++)
 { 
   
 WrDatLCD(*point);
 point++;
 }
}

/*****************************显示变量(三位数)*********************************************/
void display(int number, unsigned char address)
{
 unsigned char b,c,d;
 b = (number/100);
 c = (number/10)%10;
 d = (number/1)%10;
 WrComLCD(0x80+address);
 WrDatLCD(b+48); 
 WrDatLCD(c+48); 
 WrDatLCD(d+48); 
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132195.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月11日 上午9:00
下一篇 2022年6月11日 上午9:00


相关推荐

  • 小程序onShow

    小程序onShow/***生命周期函数–监听页面加载*/onLoad:function(options){letthat=this;constopenid=app.globalData.openid||Storage.get().openid;initNoPage(this,[{api:”getPerson”,inData:{op…

    2022年6月16日
    58
  • bson json c语言,C++ BSON使用

    bson json c语言,C++ BSON使用C BSON 使用 C BSON 主要类使用 C BSON 主要会接触到以下 4 个类 bson BSONObj 创建 BSONObj 对象 bson BSONElement BSONObj 对象由 BSONElement 对象组成 即 BSONElement 对象为 BSONObj 对象的字段或者元素 它是键值对 bson BSONObjBuild BSONObjBuild 用来实

    2026年3月26日
    1
  • linux拷贝目录并修改名字,linux复制文件夹、重命名文件夹、删除文件夹

    linux中复制命令为cp(即copy缩写),重命名使用mv命令(即move缩写)来实现,删除命令为rm(即remove缩写)。如果操作对象是单个文件,复制和删除以及重命名很简单,如下:cpa.txtA.txt(将a.txt另存为A.txt)mva.txtA.txt(将a.txt重命名为A.txt)rma.txt(删除a.txt)linux删除和复制文件夹但是如果直接用下面…

    2022年4月6日
    292
  • python和java和c语言的区别-python c 和java的区别有哪些「建议收藏」

    python和java和c语言的区别-python c 和java的区别有哪些「建议收藏」一、pythonpython比较容易学习,语法很简单,融入了很多现代编程语言的特性。python的库非常丰富,可以迅速地开发程序,无论是网站还是小游戏都非常方便。不过,python的脚本的运行效率较低,不适合对运行效率要求较高的程序。Python是一种脚本语言。它更适合用来做算法。Python简单易学,对于新手来讲是编程入门的好选择。Python其实也是基于C++创造的,它们的区别主要体现在,C+…

    2022年7月7日
    29
  • HTML页面模板_html模板

    HTML页面模板_html模板作者声明:本博客中所写的文章,都是博主自学过程的笔记,参考了很多的学习资料,学习资料和笔记会注明出处,所有的内容都以交流学习为主。有不正确的地方,欢迎批评指正HTML页面模板代码常用的页面模板<!DOCTYPEhtml><htmllang=”en”><head><metacharset=”UTF-8″>…

    2025年9月28日
    4
  • PLSQL Developer新手使用教程(图文教程)(转载)[通俗易懂]

    PLSQL Developer新手使用教程(图文教程)(转载)[通俗易懂]原文:https://www.cnblogs.com/wangfuyou/p/5915246.html PLSQLDeveloper是Oracle数据库开发工具,很牛也很好用,PLSQLDeveloper功能很强大,可以做为集成调试器,有SQL窗口,命令窗口,对象浏览器和性能优化等功能,下面简单的介绍一下如何使用PLSQLDeveloper工具,新手教程。1.基本操作1)首先确保…

    2022年5月2日
    123

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号