/*******************************************************************
Name: 唐湘衡
Copyright:
Author:
Date: 26-10-09 17:52
Description:
********************************************************************/
/*******************************************************************
功能:检测4*4键盘是否按下,如有按下,在中间两数码管显示按键序号
如无按键,显示HH s5开启3,4拨码开关,s6 8个开关全开
定义C口进行输出,选XT震荡,关闭看门狗定时器,低电压复位
器件:pic DEMOII 工程板,pic18f4520芯片,pic16-mcd2
在线调试器
********************************************************************/
#include
void delay(); //延时函数申明
void init(); //I/O口初始化函数申明
void display(int x); //显示函数申明
int result;
//*****************************************************************
void main()
{
init() ;
PORTC = 0xf7; //开通Rc3
if (RC3==0&& RC4==0) //判断k1是否被按下
{
asm("nop"); //插入一定延时,确保电平稳定
result = 0x01;
}
if (RC3==0 && RC5==0) //判断k5是否被按下
{
asm("nop"); //插入一定延时,确保电平稳定
result = 0x05;
}
if (RC3==0 && RC6==0) // 判断k9是否被按下
{
asm("nop"); //插入一定延时,确保电平稳定
result = 0x09;
}
if (RC3==0 && RC7==0) // 判断k13是否被按下
{
asm("nop"); //插入一定延时,确保电平稳定
result = 0x13;
}
//******************************************************
PORTC = 0xfb; //开通Rc2
if (RC2==0&& RC4==0) //判断k2是否被按下
{
asm("nop"); //插入一定延时,确保电平稳定
result = 0x02;
}
if (RC2==0 && RC5==0) //判断k6是否被按下
{
asm("nop"); //插入一定延时,确保电平稳定
result = 0x06;
}
if (RC2==0 && RC6==0) //判断k10是否被按下
{
asm("nop"); //插入一定延时,确保电平稳定
result = 0x10;
}
if (RC2==0 && RC7==0) //判断k14是否被按下
{
asm("nop"); //插入一定延时,确保电平稳定
result = 0x14;
}
//*****************************************************
PORTC = 0xfd; //开通Rc1
if (RC1==0&& RC4==0) //判断k3是否被按下
{
asm("nop"); //插入一定延时,确保电平稳定
result = 0x03;
}
if (RC1==0 && RC5==0) //判断k7是否被按下
{
asm("nop"); //插入一定延时,确保电平稳定
result = 0x07;
}
if (RC1==0 && RC6==0) //判断k11是否被按下
{
asm("nop"); //插入一定延时,确保电平稳定
result = 0x11;
}
if (RC1==0 && RC7==0) //判断k15是否被按下
{
asm("nop"); //插入一定延时,确保电平稳定
result = 0x15;
}
//****************************************************
PORTC = 0xfe; //开通Rc0
if (RC0==0&& RC4==0) //判断k4是否被按下
{
asm("nop"); //插入一定延时,确保电平稳定
result = 0x04;
}
if (RC0==0 && RC5==0) //判断k8是否被按下
{
asm("nop"); //插入一定延时,确保电平稳定
result = 0x08;
}
if (RC0==0 && RC6==0) //判断k12是否被按下
{
asm("nop"); //插入一定延时,确保电平稳定
result = 0x12;
}
if (RC0==0 && RC7==0) //判断k6是否被按下
{
asm("nop"); //插入一定延时,确保电平稳定这里为1us
result = 0x16;
}
//*************************************************
PORTC = 0xf0;
if (PORTC==0xf0)
{
asm("nop");
result = 0xff;
}
display(result);
}
//*********************************************************************
void delay()
{
int i;
for (i=1000; i>0; i--){;}
}
//******************************************************************
//初始化函数
void init()
{
ADCON1=0X07; //设置A口为普通I/O口
TRISA=0X33; //设置(打开第3和4数码管)
TRISC=0XF0; //设置C口高4位为输入,低4位为输出
TRISD=0X00; //设置D口为输出
PORTA=0XFF;
PORTD=0XFF; //先清除所有显示
}
//********************************************************************
void display(int x)
{
switch(result)
{
case 0x01:
PORTD=0xc0;PORTA=0x37;delay();PORTD=0xf9;PORTA=0X3b;delay();break; //k1按下
case 0x02:
PORTD=0xc0;PORTA=0x37;delay();PORTD=0xa4;PORTA=0x3b;delay();break; //k1按下
case 0x03:
PORTD=0xc0;PORTA=0x37;delay();PORTD=0xb0;PORTA=0x3b;delay();break; //k1按下
case 0x04:
PORTD=0xc0;PORTA=0x37;delay();PORTD=0x99;PORTA=0x3b;delay();break; //k1按下
case 0x05:
PORTD=0xc0;PORTA=0x37;delay();PORTD=0x92;PORTA=0x3b;delay();break; //k1按下
case 0x06:
PORTD=0xc0;PORTA=0x37;delay();PORTD=0x82;PORTA=0x3b;delay();break; //k1按下
case 0x07:
PORTD=0xc0;PORTA=0x37;delay();PORTD=0Xf8;PORTA=0x3b;delay();break; //k1按下
case 0x08:
PORTD=0xc0;PORTA=0x37;delay();PORTD=0X80;PORTA=0x3b;delay();break; //k1按下
case 0x09:
PORTD=0xc0;PORTA=0x37;delay();PORTD=0X90;PORTA=0x3b;delay();break; //k1按下
case 0x10:
PORTD=0xf9;PORTA=0x37;delay();PORTD=0Xc0;PORTA=0x3b;delay();break; //k1按下
case 0x11:
PORTD=0xf9;PORTA=0x37;delay();PORTD=0xf9;PORTA=0x3b;delay();break; //k1按下
case 0x12:
PORTD=0xf9;PORTA=0x37;delay();PORTD=0xa4;PORTA=0x3b;delay();break; //k1按下
case 0x13:
PORTD=0xf9;PORTA=0x37;delay();PORTD=0xb0;PORTA=0x3b;delay();break; //k1按下
case 0x14:
PORTD=0xf9;PORTA=0x37;delay();PORTD=0x99;PORTA=0x3b;delay();break; //k1按下
case 0x15:
PORTD=0xf9;PORTA=0x37;delay();PORTD=0x92;PORTA=0x3b;delay();break; //k1按下
case 0x16:
PORTD=0xf9;PORTA=0x37;delay();PORTD=0x82;PORTA=0x3b;delay();break; //k1按下
case 0xff:
PORTD=0x89;PORTA=0x37;delay(); PORTD=0x89; PORTA=0x3b; delay(); //无按键按下
}
}