專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

基于PIC16F877單片機(jī)數(shù)碼管顯示矩陣鍵值

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2013年04月04日   【字體:

    PIC16F877單片機(jī)數(shù)碼管顯示矩陣鍵值,4X4矩陣鍵盤(pán)一共有16個(gè)按鍵,對(duì)應(yīng)的是0~F,十六進(jìn)制數(shù),本程序是利用行掃描法,進(jìn)行循環(huán)掃描矩陣鍵盤(pán),當(dāng)每一行有一個(gè)按鍵被按下,它都會(huì)檢測(cè)得到鍵值,然后數(shù)碼管就會(huì)顯示對(duì)應(yīng)的數(shù)值啦。

 

#include <pic.h>  

typedef unsigned char  uchar;  

typedef unsigned int   uint;  

uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //數(shù)碼管共陽(yáng)段碼  

uchar table_we[]={0xfe,0xfd,0xfb,0x7f,0xef,0xdf}; // 位碼

uchar temp;  

//***********延時(shí)z毫秒***********/  

void delay(uint z)  

{  

uint x,y;  

for(x=z;x>0;x--)  

for(y=110;y>0;y--);  

}  

void init()  

{  

TRISC=0X0f;//設(shè)置c端口高4位為輸出,低4位為輸入;  

TRISD=0;  //設(shè)D口為輸出

TRISB=0;  //設(shè)B口為輸出

PORTB=0XFF;  

}  

void keyscan()  //矩陣鍵盤(pán)掃描子程序

{  

//uchar temp;  

//第一行掃描  

PORTC=0X7f;//1110 1111  

temp=PORTC;  

temp=temp&0x0f;  

if(temp!=0x0f)//有鍵按下  

   {  

       delay(10);  

           temp=PORTC;  

       temp=temp&0x0f;  

       if(temp!=0x0f)  

       {  

       temp=temp|0x70;  

       }  

   }  

else  

{  

//第二行掃描  

PORTC=0Xbf;  

temp=PORTC;  

temp=temp&0x0f;  

   if(temp!=0x0f)  

   {  

       delay(10);  

           temp=PORTC;  

       temp=temp&0x0f;  

       if(temp!=0x0f)  

       {  

       temp=temp|0xb0;  

       }  

   }  

else  

{  

//第三行掃描  

PORTC=0Xdf;  

temp=PORTC;  

temp=temp&0x0f;  

   if(temp!=0x0f)  

   {  

       delay(10);  

           temp=PORTC;  

       temp=temp&0x0f;  

       if(temp!=0x0f)  

       {  

           temp=temp|0xd0;  

       }  

   }  

else  

{  

//第四行掃描  

PORTC=0Xef;  

temp=PORTC;  

temp=temp&0x0f;  

   if(temp!=0x0f)  

   {  

       delay(10);  

           temp=PORTC;  

       temp=temp&0x0f;  

       if(temp!=0x0f)  

       {  

           temp=temp|0xe0;  

       }  

   }  

     }  

   }  

 }  

}  

void display()  //數(shù)碼管顯示函數(shù)

{  

   switch(temp)  

   {  

       case 0xee:PORTD=table[0];break;  //0

       case 0xed:PORTD=table[1];break;  //1

       case 0xeb:PORTD=table[2];break;  //2

       case 0xe7:PORTD=table[3];break;  //3  

       case 0xde:PORTD=table[4];break;  //4

       case 0xdd:PORTD=table[5];break;  //5  

       case 0xdb:PORTD=table[6];break;  //6

       case 0xd7:PORTD=table[7];break;  //7

       case 0xbe:PORTD=table[8];break;  //8

       case 0xbd:PORTD=table[9];break;  //9

       case 0xbb:PORTD=table[10];break;  //A

       case 0xb7:PORTD=table[11];break;  //B

       case 0x7e:PORTD=table[12];break;  //C

       case 0x7d:PORTD=table[13];break;  //D

       case 0x7b:PORTD=table[14];break;  //E

       case 0x77:PORTD=table[15];break;  //F

   }  

}  

void main() //主函數(shù)  

{  

 init();//端口初始化  

 while(1)   //無(wú)限循環(huán)

 {  

   keyscan();  //按鍵掃描

   display();  //顯示鍵值

 }  

}
關(guān)閉窗口

相關(guān)文章