*******************************************************************
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;
//*****************************************************************
int main()
{
init(); //調用初始I/O口函數
result = 0xff;
if (RB0==0)
{
asm("nop"); //插入一定延時,確保電平穩定 //插入一定延時,確保電平穩定這裡為消除抖動
result = 0x01;
}
if (RB1==0)
{RBPU = 0; //使能B口的內部上拉INTCON2中斷寄存器
asm("nop"); //插入一定延時,確保電平穩定
result = 0x02;
}
if (RB2==0)
{
asm("nop"); //插入一定延時,確保電平穩定 //插入一定延時,確保電平穩定這裡為消除抖動
result = 0x03;
}
if (RB3==0)
{
asm("nop"); //插入一定延時,確保電平穩定 //插入一定延時,確保電平穩定這裡為消除抖動
// if (RB0==0) //無需消除抖動,有此語句是按鍵失效
// {
result = 0x04;
// }
}
if (RB4==0)
{
asm("nop"); //插入一定延時,確保電平穩定 //插入一定延時,確保電平穩定這裡為消除抖動
result = 0x05;
}
display(result);
}
//******************************************************************
void delay() //延時函數
{
int i;
for (i=100; i>0; i--){;}
}
//*******************************************************************
void init() //I/O口初始化函數
{
ADCON1 = 0x07; //設定A口為普通I/O口
TRISA = 0x33; //設定(開啟第3和4數位管)
TRISD = 0x00; //數位管的位設定全部輸出
TRISB = 0x1f; //設定B口低5位為輸入其他未用到
PORTA = 0xff;
PORTD = 0xff; //剛開始所有燈熄滅
//CONFIG3H =0x05; //PBADEN = 0; CONFIG3H是配置位中的寄存器,PBADEN=0是把RB0-RB4配置為數字I/O
RBPU = 0; //使能B口的內部上拉INTCON2中斷寄存器
}
//****************************************************************
void display(int x) //顯示函數:按鍵按下,顯示其序號,用中間兩數位管顯示
{
switch(result)
{
case 0x01:
PORTA = 0x37; //開啟第4個數位管
PORTD = 0xc0; //顯示0
delay(); //延時
PORTA = 0X3b; //開啟第3個數位管
PORTD = 0xf9; //顯示1
delay(); break;
case 0x02:
PORTA = 0x37; //開啟第4個數位管
PORTD = 0xc0; //顯示0
delay(); //延時
PORTA = 0X3b; //開啟第3個數位管
PORTD = 0xa4; //顯示1
delay(); break;
case 0x03:
PORTA = 0x37; //開啟第4個數位管
PORTD = 0xc0; //顯示0
delay(); //延時
PORTA = 0X3b; //開啟第3個數位管
PORTD = 0xb0; //顯示1
delay(); break;
case 0x04:
PORTA = 0x37; //開啟第4個數位管
PORTD = 0xc0; //顯示0
delay(); //延時
PORTA = 0X3b; //開啟第3個數位管
PORTD = 0x99; //顯示1
delay(); break;
case 0x05:
PORTA = 0x37; //開啟第4個數位管
PORTD = 0xc0; //顯示0
delay(); //延時
PORTA = 0X3b; //開啟第3個數位管
PORTD = 0x92; //顯示1
delay(); break;
case 0xff:
PORTA = 0x37; //開啟第4個數位管
PORTD = 0x89; //顯示0
delay(); //延時
PORTA = 0X3b; //開啟第3個數位管
PORTD = 0x89; //顯示1
delay(); break;
}
}