?? ir.c
字號:
/*******************************************
數碼管顯示遙控器鍵值程序
********************************************
功能:每按下一鍵時數碼管顯示一位,當8個數碼管顯示完畢,重新從第一個開始顯示
作者:偉納電子網友 dk_wang
出處:偉納電子論壇 www.willar.com
********************************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
/*******************************************
函數定義聲明區
*******************************************/
uchar m;
void delay(unsigned char m);
bit k_scan_estimate(void); //flag 為1時表明有按鍵;按下否則無;
bit flag; //按鍵有無按下標志位;
uchar key_initialization; //按鍵初始化值;
uchar key_prevenvient; //按鍵前一狀態值
uchar key_dispose();
uchar key_h;
uchar key_l;
uchar key;
uchar key_before;//鍵值前一狀態;
uchar key_word(uchar key_m);//由鍵碼值得出按鍵所對應的狀態值;
uchar code digital_val[]={0xc0,0xf9,0xa4,0xb0,//0123
0x99,0x92,0x82,0xf8,//4567
0x80,0x90,0x88,0x00,//89AB
0x46,0x40,0x86,0x8e};//CDEF
uchar word_inx_before;
uchar word_inx;
uchar data display_buffer[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
uchar buffer_i;//計數變量
uchar f;//位碼變量
uchar r;//段碼變量
uchar k;
void buzzer(void);//響片驅動程序
uchar buzzer_i;
sbit buzzer_voice=P3^7;
uchar buzzer_ii;
/********************************************/
void main(void)
{
f=0;
r=0xfe;
TMOD=0x01;
EA=1;
ET0=1;
TH0=-2000/256;
TL0=-2000%256;
TR0=1;
while(1)
{
k_scan_estimate();
if(flag)
{
key_dispose();
if(flag)
{ buzzer();
if(buffer_i==0)
{
for(k=0;k<8;k++)
{display_buffer[k]=0xff;}
}
display_buffer[buffer_i]=digital_val[key_word(key_dispose())];
buffer_i++;
buffer_i&=0x07;
flag=0;
}
}
}
}
/*******************************
定時器0中斷入口
********************************/
void timer0(void) interrupt 1
{
TR0=0;
TH0=-2000/256;
TL0=-2000%256;
P0=display_buffer[f];
f++;
f&=0x07;
P2=r;
r=_crol_(r,1);
TR0=1;
}
bit k_scan_estimate(void) //鍵盤狀態判斷,當有按下時標志位置位否則標志位為0;
{
key_initialization=0xf0;
P1=key_initialization;
key_initialization=P1;
if(key_initialization^key_prevenvient)
{
delay(50);
if(key_initialization^key_prevenvient)
{
key_prevenvient=key_initialization;
return(flag=1);
}
}
else return(flag=0);
}
uchar key_dispose()//按鍵處理,當有按鍵按下時將返回鍵碼值
{key_before=key;
key_l=0xfe;
while(1)
{
P1=key_l;
key_h=key_l=P1;
if((key_l&0xf0)!=0xf0)
{
key_l&=0x0f;
key_h=P1&0xf0;
key=key_l|key_h;
return(key);
}
else
{
key_l=_crol_(key_l,1);
if((key_l&0x0f)==0x0f)
{
flag=0;
return(key_before);
}
}
}
}
uchar key_word(uchar key_m)//輸入鍵碼值返回段碼值;
{
uchar data key_val[]={0xee,0xed,0xeb,0xe7,//0,1,2,3
0xde,0xdd,0xdb,0xd7,//4,5,6,7
0xbe,0xbd,0xbb,0xb7,//8,9,A,B
0x7e,0x7d,0x7b,0x77};//C,D,E,F;
uchar *pp=key_val;
word_inx=0;
for(;*pp!=key_m;pp++)
{ word_inx++;
if(pp>(key_val+0x0f)){return(word_inx_before);}
}
word_inx_before=word_inx;
return(word_inx);
}
void delay(uchar m) //延時程式
{
uchar n;
while(m--)
{
for(n=250;n>0;n--);
}
}
void buzzer(void)
{
for(buzzer_ii=150;buzzer_ii>0;buzzer_ii--)
{
for(buzzer_i=250;buzzer_i>0;buzzer_i--)
{
buzzer_voice=~buzzer_voice;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -