?? jianma.c
字號(hào):
#include<reg51.h>
#include<absacc.h>
#include<intrins.h>
//-----宏聲明-----
#define C8279 XBYTE[0xf239]
#define D8279 XBYTE[0xf238]
#define uchar unsigned char
//-----變量定義-----
uchar idata codedat[10]; //鍵碼存儲(chǔ)數(shù)組
uchar idata diss[30]; //顯示緩沖區(qū)
uchar code ledseg[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//'0,1,2,3,4,5,6,7'
0x7f,0x6f,0x77,0x7c,0x39,0x5E,0x79,0x71,//'8,9,a,b,c,d,e,f'
0x00,0x40,0x37}; //' ,-,N'
sbit CLOCK=P1^0; //時(shí)鐘脈沖
sbit DAT=P1^1; //數(shù)據(jù)串口
bit bdata error=0; //出錯(cuò)標(biāo)志
uchar dat; //鍵碼變量
//-----延時(shí)子程序-----
void delay( )
{
unsigned int k,j;
for(k=0;k<200;k++)
{
for(j=0;j<500;j++);
}
}
//-----初始化-----
void first( )
{
uchar i;
C8279=0x00; //置8279工作方式
C8279=0x2f; //置鍵盤掃描速率
C8279=0xc1; //清除LED顯示
while(C8279&0x80); //等待清除結(jié)束
for(i=0;i<8;i++)
{
diss[i]=0x11; //初始顯示送緩沖區(qū)
}
}
//----顯示-----
void disp( )
{
uchar i;
for(i=0;i<8;i++)
{
C8279=i+0x80;
D8279=ledseg[diss[7-i]];
}
}
//-----刷新顯示------
void dis0( )
{
uchar i;
for(i=0;i<8;i++)
{
diss[i]=0x11;
}
disp ( );
}
//-----負(fù)跳變-----
void tb1_0( )
{
while(1)
{
if(CLOCK==1)
{
while(CLOCK==1);
return;
}
}
}
//-----讀取一個(gè)鍵碼-----
void read( )
{
uchar i;
uchar count=0; //數(shù)據(jù)信號(hào)'1'計(jì)數(shù)器
do
{
tb1_0( );//讀起始位
}while(DAT==1);
for(i=0;i<8;i++) //讀取8位數(shù)據(jù)位
{
tb1_0();
if(DAT==1)
{
count++;
dat=_cror_(dat,1)|0x80;//移位保存
}
else
{
dat=_cror_(dat,1)&0x7f;
}
}
tb1_0( ); //讀校驗(yàn)位
if(DAT==1)
{
if((count&0x01)==0x01)//奇校驗(yàn)
{
error=1; //置出錯(cuò)標(biāo)志
return;
}
}
else
{
if((count&0x01)==0x00)//奇校驗(yàn)
{
error=1; //置出錯(cuò)標(biāo)志
return;
}
}
tb1_0( );
if(DAT==0) //讀結(jié)束位
{
error=1;
}
}
//-----出錯(cuò)顯示-----
void errordis( )
{
diss[2]=0x0e; //顯示"ERROR"
diss[3]=0x0a;
diss[4]=0x0a;
diss[5]=0x00;
diss[6]=0x0a;
}
//-----數(shù)據(jù)送顯示緩沖區(qū)-----
void disdeal(uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
diss[3*i]=codedat[i]/16;
diss[3*i+1]=codedat[i]%16;
diss[3*i+2]=0x11;
}
}
//-----動(dòng)態(tài)顯示-----
void dismove(uchar movenum,uchar movetimes)
{
uchar m,n; //定義顯示次數(shù)、移位迭代次數(shù)變量
for(m=0;m<movetimes;m++)
{
disp();
delay();
for(n=0;n<movenum;n++)
{
diss[n]=diss[n+1];
}
movenum--;
}
}
//-----讀取一組鍵碼-----
void readdata()
{
uchar i;
error=0;
read(); //讀取第一個(gè)鍵碼
if(error==1)
{
errordis(); //出錯(cuò)顯示
return;
}
else
{
codedat[0]=dat;
if(codedat[0]==0xe0)//判第一個(gè)鍵碼是否為"E0"?
{
read(); //讀第二個(gè)鍵碼
if(error==1)
{
errordis();//出錯(cuò)顯示
return;
}
else
{
codedat[1]=dat;
if(codedat[1]==0x12)//判第二個(gè)鍵碼是否為"12"?
{
for(i=2;i<10;i++)//讀取'PRNT SCRN'鍵的情況
{
read();
if(error==1)
{
errordis();//出錯(cuò)顯示
return;
}
codedat[i]=dat;
}
disdeal(10); //顯示處理
dismove(29,21); //移位動(dòng)態(tài)顯示
}
else
{
for(i=2;i<5;i++)//讀取五個(gè)鍵碼的情況
{
read();
if(error==1)
{
errordis();//出錯(cuò)顯示
return;
}
codedat[i]=dat;
}
disdeal(5); //顯示處理
dismove(14,6); //移位動(dòng)態(tài)顯示
}
}
}
else
{
if(codedat[0]==0xe1)//判第一個(gè)鍵碼是否為"E1"?
{
for(i=1;i<8;i++)//讀取'PAUSE'鍵的情況
{
read();
if(error==1)
{
errordis();//出錯(cuò)顯示
return;
}
codedat[i]=dat;
}
disdeal(8); //顯示處理
diss[24]=0x12; //為'PAUSE'鍵,最后顯示'NONE'
diss[25]=0x00;
diss[26]=0x12;
diss[27]=0x0e;
diss[28]=0x11;
dismove(29,21); //移位動(dòng)態(tài)顯示
}
else
{
for(i=1;i<3;i++)//讀取三個(gè)鍵碼的情況
{
read();
if(error==1)
{ //出錯(cuò)顯示
errordis();
return;
}
codedat[i]=dat;
}
if((codedat[1]==0xf0)&&(codedat[0]==codedat[2]))//數(shù)據(jù)校驗(yàn)
{
disdeal(3); //顯示處理
}
else
{ //出錯(cuò)顯示
errordis();
}
}
}
}
}
//-----主程序-----
main()
{ first(); //初始化
while(1)
{ dis0(); //刷新顯示
readdata(); //讀鍵碼
disp(); //顯示
delay(); //延時(shí)
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -