PIC:矩阵键盘扫描(if()else嵌套方式)

发布者:shiwanyongbing最新更新时间:2012-08-15 来源: 51hei关键字:矩阵键盘扫描  PIC  嵌套方式 手机看文章 扫描二维码
随时随地手机看文章

/*
为自已写的矩阵键盘检测+数码管显示+蜂鸣器响
采用if().....else嵌套方式;编译通过,却后二列显示不出来(你找出来了吗?一个不算问题的问题)
*/
//----------------------------------------------------------------

#include
#define uint unsigned int
#define uchar unsigned char
__CONFIG(0x3B31);
const unsigned char table[] = {0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,

0x5e,0x79,0x71};  //数码管数组
//--------------------变量定义------------------------------------
uint keynum,keytem,num;  //定义变量,//keynum按键端口读回值,keytem为松手检测值(以示区分),num数码管
//--------------------函数调用 声明-------------------------------
void init();    //初始化函数
void keyscan();    //矩阵键盘扫描
void didi(uchar dinum);  //蜂鸣器
void disp();  //数码管显示
//-------------------主函数---------------------------------------
void delay(x)  //延时函数,几乎每个程序都要用到,所以放在了主函数分界线内
{
uchar a,b;
for (a=x;a>0;a--)
for(b=110;b>0;b--);
}

void main()
{
init();  //初始化
while(1)
{
keyscan(); //矩阵键盘扫描
disp();  //数码管显示
}
}
//------------初始化函数-------------------------------------------
void init()
{
TRISA=0;PORTA=0x02; //38译码器

TRISB=1;                       //矩阵键盘

TRISC=0;PORTC=0x01;; //38使能
TRISD=0;PORTD=0x00;  //LED灯(数码管)
TRISE=0;PORTE=0x00;  //蜂鸣器
}
//----------要调用的函数--------------------------------------------
void keyscan()
{                           //第一列扫描

PORTB=0xef;     //送出RB4=1110  1111
keynum=PORTB;   

keynum=keynum&0x0f;

if(keynum!=0xef)  

{
  delay(5);  

  keynum=PORTB;  

  keynum=keynum&0x0f;
  if(keynum!=0x0f) 

  {
   keytem=keynum;

   didi(1);
   while(keytem!=0x0f)

    {
    keytem=PORTB;
    keytem=keytem&0x0f;

    }
  keynum=keynum|0xe0; 

  }

else       //第二列扫描
  {
  PORTB=0xdf;    

  keynum=PORTB;   

  keynum=keynum&0x0f;

  if(keynum!=0xdf) 

   {
   delay(5); 

   keynum=PORTB; 

   keynum=keynum&0x0f;
   if(keynum!=0x0f) 

    {
    keytem=keynum; 

    didi(1);
    while(keytem!=0x0f)

     {
     keytem=PORTB;
     keytem=keytem&0x0f;

     }
   keynum=keynum|0xd0; 

    }
   }
  else      

     {
   PORTB=0xbf;    

   keynum=PORTB;   

   keynum=keynum&0x0f;

   if(keynum!=0xbf) 

   {
    delay(5); 

    keynum=PORTB;  

    keynum=keynum&0x0f;
    if(keynum!=0x0f)

     {
     keytem=keynum; 

     didi(1);
     while(keytem!=0x0f)

      {
      keytem=PORTB;
      keytem=keytem&0x0f;

      }
    keynum=keynum|0xb0; 

     }
   
    else       //第四列扫描
     {
     PORTB=0x7f;  

     keynum=PORTB;  

     keynum=keynum&0x0f;

     if(keynum!=0x7f)

      {
      delay(5);   

      keynum=PORTB; 

      keynum=keynum&0x0f;
      if(keynum!=0x0f)

       {
       keytem=keynum; 

       didi(1);
       while(keytem!=0x0f)

        {
        keytem=PORTB;
        keytem=keytem&0x0f;

        }
      keynum=keynum|0x70;  

       }
      }
     } ////////

   }
  }
}
  }
}

void didi(uchar dinum)
{
uchar di_num;
for(di_num=dinum;di_num>0;di_num--)
{
RE0=1;
delay(100);
RE0=0;
delay(50);
}
}

void disp()
{
switch(keynum)
{
case 0xee:PORTD=table[1];break;
case 0xed:PORTD=table[2];break;
case 0xeb:PORTD=table[3];break;
case 0xe7:PORTD=table[4];break;
case 0xde:PORTD=table[5];break;
case 0xdd:PORTD=table[6];break;
case 0xdb:PORTD=table[7];break;
case 0xd7:PORTD=table[8];break;
case 0xbe:PORTD=table[9];break;
case 0xbd:PORTD=table[10];break;
case 0xbb:PORTD=table[11];break;
case 0xb7:PORTD=table[12];break;
case 0x7e:PORTD=table[13];break;
case 0x7d:PORTD=table[14];break;
case 0x7b:PORTD=table[15];break;
case 0x77:PORTD=table[0];break;
}
}

关键字:矩阵键盘扫描  PIC  嵌套方式 引用地址:PIC:矩阵键盘扫描(if()else嵌套方式)

上一篇:单片机中断c语言使用
下一篇:用单片机PIC18F2550设计示波器

推荐阅读最新更新时间:2024-03-16 13:05

PIC12F629 硬件调试器
手头上就一个PIC的编程器,留有ICSP下载接口,目标板上没有ICSP接口,所以为了硬件调试方便,自己用PIC12F629做了一个简单的调试器。其实就是一个扩展板,焊接了一个PIC12F629芯片,引出DIP-8来,可以接到目标板上进行调试,通过目标板供电或是USB供电,程序是通过ICSP下载。今天临时焊接的,样子不是很好看,但是很有用,调试时候省心了很多。 硬件实物图:
[单片机]
<font color='red'>PIC</font>12F629 硬件调试器
PIC32MZ tutorial -- UART Communication
  At this moment, I accomplish the interface of UART communication for PIC32MZ EC Starter Kit. This interface configures the PIC32MZ for communication with a host PC at 115200 baud. There are five functions in the interface -- Uart_Init(), Uart_Getc(), Uart_Gets(), Uart_Putc() and Uart_Puts().   Uart_Init() configure
[单片机]
PIC单片机的bank和PC的出错问题分析
   1、 BANK设置错误:   先来看一段程序:   include   PORTDB EQU 20H   ……   START   movlw b‘11110000’   movwf PORTDB   clrf TRISD   MAIN   bcf STATUS,C   rlf PORTDB,1   btfsc STATUS,C   bsf PORTDB,0   movf PORTDB,W   movwf PORTD   call DELAY   goto MAIN   ……   上面的是一个将D口的发光二极管循环点亮的小程序,实际运行
[单片机]
PIC16C74单片机SPI方式读写串行EEPROM程序
; list p=16C74, st=off ; PORTC PIN DESCRIPTION ; SCK bit 3, SDI bit 4, SDO bit 5, CS bit 7 ; Fosc = 10.0 MHz, thus each instr. cycle = 400ns ;***************Ram Register Definitions******************************* rxdata equ 25h addr equ 26h loops equ 27h ;***************Bit Definitions***************************
[单片机]
基于AT45DB161B存储器和PIC16LC73B单片机实现微型压力测量装置设计
1、概述 Flash存储器按其接口可分为串行和并行两大类。串行Flash存储器大多采用I2C接口或SPI接口进行读写;与并行Flash存储器相比,所需引脚少、体积小、易于扩展、与单片机或控制器连接简单、工作可靠,所以串行Flash存储器越来越多地用在各类电子产品和工业测控系统中。 DataFlash是美国Atmel公司新推出的大容量串行Flash存储器产品,采用NOR技术制造,可用于存储数据或程序代码,其产品型号为AT45DBxxxx。此系列存储器容量较大,从1Mb~256Mb;封装尺寸小,最小封装型式(CBGA)尺寸为6mm8mm;采用SPI接口进行读写,硬件连线少;内部页面尺寸较小,8Mb容量的页面尺寸为264字节,16M
[单片机]
基于AT45DB161B存储器和<font color='red'>PIC</font>16LC73B单片机实现微型压力测量装置设计
采用TCP协议的PIC32MZ ethernet bootloader
  趁热打铁,在上一PIC32MZ UDP ethernet bootloader的基础上我又完成了采用TCP协议的PIC32MZ ethernet bootloader。两款ethernet bootloader基本架构都一样,数据包格式也一样。TCP ethernet bootloader 也分两部分,我将他们命名为PhnLoader_v4.0和PhnBoot_v4.0。 PhnLoader_v4.0   PhnLoader_v4.0 是PC端host 程序。 运行环境:Window + .NET Framework 4.5 开发语言:C# 通信类型:TCP Server IP 地址: 192.1
[单片机]
采用TCP协议的<font color='red'>PIC</font>32MZ ethernet bootloader
武林教你学PIC32(十一)模数转换ADC10
PIC32MX 10 位模数 (Analog-to-Digital, A/D)转换器 (或 ADC)具有以下特性: • 逐次逼近寄存器 (Successive Approximation Register, SAR)转换 • 最多 16 个模拟输入引脚 • 外部参考电压输入引脚 • 一个单极性差分采样 / 保持放大器 (Sample-and-Hold Amplifier, SHA) • 自动通道扫描模式 • 可选择的转换触发源 • 16 字的转换结果缓冲区 • 可选择的缓冲区填充模式 • 8 个转换结果格式选项。 用户可以选择整数、有符号整数、小数或有符号小数作为 16 位或 32 位结果。 • 可在 CPU SLEEP (休眠)
[单片机]
武林教你学<font color='red'>PIC</font>32(十一)模数转换ADC10
Microchip 推出内置分流稳压器的 PIC 单片机
PIC16F616/HV616 系列可提供低成本电机及风扇控制所需的专用外设   全球领先的单片机和模拟半导体供应商 —— Microchip Technology (美国微芯科技公司)近日宣布推出首款配备多种外设的通用闪存 PIC 单片机,有助于实现更具成本效益的风扇或小型电机控制。全新 14 引脚 PIC16F616/610 和 8 引脚 PIC12F615/609 单片机集成了多种专用外设,可大大减少系统所需的元件数及成本。这些外设包括具有死区控制的全桥脉宽调 制 ( PWM ) 、用于脉宽测量的 Timer1 门、霍尔效应传感器接口比较器,以及具
[新品]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

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

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