/*******************************************************************
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<pic18.h>
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(); //無按鍵按下
}
}