📄 jianma.c
字号:
#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]; //键码存储数组
uchar idata diss[30]; //显示缓冲区
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; //时钟脉冲
sbit DAT=P1^1; //数据串口
bit bdata error=0; //出错标志
uchar dat; //键码变量
//-----延时子程序-----
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); //等待清除结束
for(i=0;i<8;i++)
{
diss[i]=0x11; //初始显示送缓冲区
}
}
//----显示-----
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 ( );
}
//-----负跳变-----
void tb1_0( )
{
while(1)
{
if(CLOCK==1)
{
while(CLOCK==1);
return;
}
}
}
//-----读取一个键码-----
void read( )
{
uchar i;
uchar count=0; //数据信号'1'计数器
do
{
tb1_0( );//读起始位
}while(DAT==1);
for(i=0;i<8;i++) //读取8位数据位
{
tb1_0();
if(DAT==1)
{
count++;
dat=_cror_(dat,1)|0x80;//移位保存
}
else
{
dat=_cror_(dat,1)&0x7f;
}
}
tb1_0( ); //读校验位
if(DAT==1)
{
if((count&0x01)==0x01)//奇校验
{
error=1; //置出错标志
return;
}
}
else
{
if((count&0x01)==0x00)//奇校验
{
error=1; //置出错标志
return;
}
}
tb1_0( );
if(DAT==0) //读结束位
{
error=1;
}
}
//-----出错显示-----
void errordis( )
{
diss[2]=0x0e; //显示"ERROR"
diss[3]=0x0a;
diss[4]=0x0a;
diss[5]=0x00;
diss[6]=0x0a;
}
//-----数据送显示缓冲区-----
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;
}
}
//-----动态显示-----
void dismove(uchar movenum,uchar movetimes)
{
uchar m,n; //定义显示次数、移位迭代次数变量
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(); //读取第一个键码
if(error==1)
{
errordis(); //出错显示
return;
}
else
{
codedat[0]=dat;
if(codedat[0]==0xe0)//判第一个键码是否为"E0"?
{
read(); //读第二个键码
if(error==1)
{
errordis();//出错显示
return;
}
else
{
codedat[1]=dat;
if(codedat[1]==0x12)//判第二个键码是否为"12"?
{
for(i=2;i<10;i++)//读取'PRNT SCRN'键的情况
{
read();
if(error==1)
{
errordis();//出错显示
return;
}
codedat[i]=dat;
}
disdeal(10); //显示处理
dismove(29,21); //移位动态显示
}
else
{
for(i=2;i<5;i++)//读取五个键码的情况
{
read();
if(error==1)
{
errordis();//出错显示
return;
}
codedat[i]=dat;
}
disdeal(5); //显示处理
dismove(14,6); //移位动态显示
}
}
}
else
{
if(codedat[0]==0xe1)//判第一个键码是否为"E1"?
{
for(i=1;i<8;i++)//读取'PAUSE'键的情况
{
read();
if(error==1)
{
errordis();//出错显示
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); //移位动态显示
}
else
{
for(i=1;i<3;i++)//读取三个键码的情况
{
read();
if(error==1)
{ //出错显示
errordis();
return;
}
codedat[i]=dat;
}
if((codedat[1]==0xf0)&&(codedat[0]==codedat[2]))//数据校验
{
disdeal(3); //显示处理
}
else
{ //出错显示
errordis();
}
}
}
}
}
//-----主程序-----
main()
{ first(); //初始化
while(1)
{ dis0(); //刷新显示
readdata(); //读键码
disp(); //显示
delay(); //延时
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -