📄 键盘_42bygh.c
字号:
#include <AT89X52.h>
#define uint unsigned int
uint k,i,j,num,w,count;
step_index,speedlevel,
spcount,
stop_flag =0;
uint num_temp;
uint led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint vote[8]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};
sbit led0=P3^0;
sbit led1=P3^1;
sbit led2=P3^2;
sbit led3=P3^3;
void delay(void);
void ledwork(void);
void gorun();
bit turn;
void Getch ( );
void main(void)
{
count = 0;
step_index = 0;
num=6;
stop_flag = 0;
P3=0x00;
TMOD= 0x11; //////T1 , T0 16位模式
EA=1;
ET1=1;
TH1=0xff; /*设置初始值,每隔4ms一次中断*/
TL1=0x05;
TR1=1;
turn = 1;
speedlevel =1;
while(1)
{
P2=0xff;
Getch();
}
}
void delay(void) //延时程序
{
for(j=1000;j>0;j--);
}
void Getch ( )
{
unsigned char X,Y,Z;
P2=0x0f; //先对P2 置数行扫描
if(P2!=0x0f) //判断是否有键按下
{
delay(); //延时,软件去干扰
if(P2!=0x0f) //确认按键按下X = P2;
{
X=P2; //保存行扫描时有键按下时状态
P2=0xf0; //列扫描
Y=P2; //保存列扫描时有键按下时状态
Z=X|Y; //取出键值
switch ( Z ) //判断键值
{
case 0x7e: k=0; break; //对键值赋值
case 0x7d: k=1; break;
case 0x7b: k=2; break;
case 0x77: k=3; break;
case 0xbe: k=4; break;
case 0xbd: k=5; break;
case 0xbb: k=6; break;
case 0xb7: k=7; break;
case 0xde: k=8; break;
case 0xdd: k=9; break;
case 0xdb: k=10;break;
case 0xd7: k=11;break;
case 0xee: k=12;break;
case 0xed: k=13;break;
case 0xeb: k=14;break;
case 0xe7: k=15;break;
}
if(k<12)
num=k;
else if(k==12)turn=!turn;
if(num>=0&&num<10)
w=0;
else if(num>9&&num<100)
{w=1;i=i%2;}
else if(num>100&&num<1000)
{w=2;i=i%3;}
else if(num>=1000)
{w=3;i=i%4;}
for(j=0;j<20000;j++);
P2=0xff;
}
}
}
void ledwork(void) /*数码管工作函数*/
{
if(num>=0&&num<10)
w=1;
else if(num>9&&num<100)
{w=2;i=i%2;}
else if(num>100&&num<1000)
{w=3;i=i%3;}
else if(num>=1000)
{w=4;i=i%4;}
if(i==0) {P0=led[num%10];led1=1;led2=1;led3=1;led0=0;}
else if(i==1&&w>1) {P0=led[num/10%10]; led0=1;led2=1;led3=1;led1=0;}
else if(i==2&&w>2) {P0=led[num/100%10]; led1=1;led2=1;led3=1;led2=0;}
else if(i==3&&w>3) {P0=led[num/1000%10];led0=1;led1=1;led2=1;led3=0;}
}
//定时器1定时中断,驱动电机用
void timer1(void) interrupt 3
{
TH1=0xFF;
TL1=0x55; //设定时每隔0.5ms中断一次
count++;
spcount--;
if(spcount<=0)
{spcount =num*speedlevel;
gorun(); }
i++;
i=i%w;
ledwork();
}
void gorun()
{
if(stop_flag==1)
{
P1=0x00;
return;
}
P1=vote[step_index]; //给脉冲以驱动电机
if (turn==0)
{
step_index++;
if (step_index>7)
step_index=0;
}
else
{
step_index--;
if (step_index<0)
step_index=7;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -