📄 key_ultmate.c
字号:
#include <reg51.h>
#include <stdio.h>
#define uchar unsigned char
#include <math.h>
uchar key_all=0;
uchar in_number=0;
uchar data12[9]={0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f};
int speed=4;int jieju;
const uchar data_void[9]={0x00,0x00,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f};
unsigned char anticlock[8]= { 0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
unsigned char clock[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
uchar in_status;
int temp;
uchar m;
sbit DIN=P3^5;
sbit LOAD=P3^6;
sbit CLP=P3^7;
bit yes;
//sbit my=P1^7;
void delay(void);
void send(uchar add,uchar );
void s_seg(uchar *p);
void keyscan(void); //键盘扫描函数
void clear_all(void);
void my_delay(void);
void zhengzhuan(int );
void fanzhuan(int ) ;
void key_process(void);
void main()
{
//uchar key_get=15;
in_status=0;
while(1)
{
keyscan();
key_process();
if(yes){ zhengzhuan(speed); yes=0;}
}
}
void key_process(void)
{
// in_number=0;
if((key_all==13 )||( key_all==14))
{
if(key_all==13) in_status=1;
else in_status= 2;
clear_all();
}
if((in_status!=0)&&(key_all>=1)&&(key_all<=10))
{
for(m=8;m>1;m--)
{
data12[m]=data12[m-1];
}
data12[1]=key_all-1;
in_number++;
s_seg(data12);
if( in_number >7 ) in_number=0;
}
if(key_all==11)
{
temp=0;
for(m=1;m<=in_number;m++)
{
temp+=data12[m]*pow(10,(m-1));
// temp=data12[1];
}
switch(in_status)
{
case 1: speed=temp;break;
case 2: jieju=temp;break;
}
yes=1;
}
if(key_all==12)
{
clear_all();
}
}
void clear_all(void)
{
uchar j;
in_number=0;
for( j=1;j<9;j++)
{
data12[j]=0x0f;
}
s_seg(data_void);
}
void delay(void) //延时函数
{
int i;
for (i=4800;i>0;i--);
}
void keyscan(void) //键盘扫描函数
{
uchar scan,tep;
key_all=0;
P2=0xf0;
if((P2&0xf0)!=0xf0) //若有键盘按下
{
delay();
if((P2&0xf0)!=0xf0) //若有键盘按下
{
P2=0xfe; // 发全0扫描码
if((P2&0xf0)!=0xf0) //若有键盘按下
{
delay();
if((P2&0xf0)!=0xf0) //若有键盘按下
{
scan=P2&0xf0;
switch( scan)
{
case 0xe0: key_all= 1;break;
case 0xd0: key_all= 2;break;
case 0xb0: key_all= 3;break;
case 0x70: key_all= 4;break;
}
while((P2&0xf0)!=0xf0);
}
return ;
}
P2=0xfd; // 发全0扫描码
if((P2&0xf0)!=0xf0) //若有键盘按下
{
delay();
if((P2&0xf0)!=0xf0) //若有键盘按下
{
scan=P2&0xf0;
switch( scan)
{
case 0xe0: key_all= 5;break;
case 0xd0: key_all= 6;break;
case 0xb0: key_all= 7;break;
case 0x70: key_all= 8;break;
}
while(( P2&0xf0)!=0xf0);
}
return ;
}
P2=0xfb; // 发全0扫描码
if((P2&0xf0)!=0xf0) //若有键盘按下
{
delay();
if((P2&0xf0)!=0xf0) //若有键盘按下
{
scan=P2&0xf0;
switch( scan)
{
case 0xe0: key_all= 9;break;
case 0xd0: key_all= 10;break;
case 0xb0: key_all= 11;break;
case 0x70: key_all= 12;break;
}
while(( P2&0xf0)!=0xf0);
}
return;
}
P2=0xf7; // 发全0扫描码
if((P2&0xf0)!=0xf0) //若有键盘按下
{
delay();
if((P2&0xf0)!=0xf0) //若有键盘按下
{
scan=P2&0xf0;
switch( scan)
{
case 0xe0: key_all= 13;break;
case 0xd0: key_all= 14;break;
case 0xb0: key_all= 15;break;
case 0x70: key_all= 16;break;
}
while(( P2&0xf0)!=0xf0);
}
return;
}
}
}
}
void send(uchar add,uchar dat)
{
uchar ADS,i,j;
CLP=0;
LOAD=0;
DIN=0;
i=4;
while(i<16)
{
if(i<8)
{
ADS=add;
}
else
{
ADS=dat;
}
for(j=8;j>=1;j--)
{
if((ADS&0x80)==0)
{ DIN=0 ;}
else
{ DIN=1;}
ADS=ADS<<1;
CLP=1;
CLP=0;
}
i=i+8;
}
LOAD=1;
}
void s_seg(uchar *p)
{
send(0x0c,0x01);//正常状态
send(0x0b,0x07);//设置扫描范围DIG0-7
send(0x0a,0x05);//设置亮度11/32
send(0x09,0xff);//采用译码方式
send(0x01,p[8]);
send(0x02,p[7]);
send(0x03,p[6]);
send(0x04,p[5]);
send(0x05,p[4]);
send(0x06,p[3]);
send(0x07,p[2]);
send(0x08,p[1]);
}
/*void zhengzhuan(int step)
{
int i; unsigned char pos;
for (i=0;i<step;i++)
{
if(pos>7) pos=0;
P1=clock[pos];
pos++;
my_delay();
}
}
void fanzhuan(int step)
{
int i; unsigned char pos;
my_delay();
for (i=0;i<step;i++)
{
if(pos>7) pos=0;
P1=anticlock[pos];
pos++;
my_delay();
}
}
*/
void zhengzhuan(int step)
{
int i; unsigned char pos;
for (pos=0;pos<step;pos++)
{
for (i=0;i<8;i++)
{
P1=clock[i];
my_delay();
}
}
}
void fanzhuan(int step)
{
int i; unsigned char pos;
for (pos=0;pos<step;pos++)
{
for (i=0;i<8;i++)
{
P1=anticlock[i];
my_delay();
}
}
}
void my_delay(void)
{
int i,j;
for (i=0;i<10000;i++);
{
for(j=0;j<10000;j++);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -