📄 题2.c
字号:
//程序5 键功能_1
//key_164_led_2
#include <stdio.h>
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define hi 0x3c //50ms定时
#define lo 0xb0
#define hi1 0xF0
#define lo1 0x00
uchar key=10,ledk[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x73};
uchar displed[4]={11,10,10,10}; //显示数寄存器,初始显示值为P
uchar mask=0xfe;
sbit P37=P3^7; sbit clk=P0^7; sbit sda=P0^6; //74LS164
sbit key1=P2^4; sbit key2=P2^5;
sbit key3=P2^6; sbit key4=P2^7;
sbit P30=P3^0;
uchar key1_mark,key2_mark; //四个按键标志
uchar key3_mark,key4_mark;
uchar keypress=0; //有按键按下标志
uchar mark15s=0; //十五秒定时标志
uchar time15s=15; //十五秒定时变量
uchar count=0;
uchar bell=0;
uchar keymark=0xe0;
uchar key_count,i=0,key_flag=0;
void delay(unsigned int n) //延时函数
{unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++) ;
}
void shift(unsigned char dx) //数据输出函数
{static unsigned char d;
unsigned char j=0;
d=dx;
while(j<8)
{if((d&0x80)!=0) sda=1;
else sda=0;
clk=0;clk=1;
d<<=1;j++;
}
}
unsigned char get_char(void)
{unsigned char key_code;
static unsigned char column=1;
if(P37==1 && key_flag==1){key_code=column;key_flag=0;key_count=0;keypress=1;}
else key_code=0xff;
P2=keymark|(mask&0x0f);
if(key_flag==0 && P37==0)
key_flag=1;
keymark=_crol_(keymark,1);
if(keymark==0x0e) keymark=0xe0;
column++;
if(column>4) column=1;
return(key_code);
}
void key_func(key)
{switch (key)
{
case 1: displed[3]=1;break;
case 2: displed[3]=2;break;
case 3: displed[3]=3;break;
case 4: displed[3]=4;break;
default: break;}
}
void t0(void) interrupt 1
{ TH0=hi;TL0=lo;
count++;
if(count==20)
{ count=0;
time15s--;
displed[0]=time15s%10;
displed[1]=time15s/10;
if(time15s==0)
{ TR0=0; //关闭定时
mark15s=0;time15s=15;
displed[0]=11;
displed[1]=10;
displed[2]=10;
displed[3]=10;
}
if(time15s<3) TR1=1;
}
}
void t1(void) interrupt 3
{ TH1=hi1; TL1=lo1;
P30=!P30;
bell++;
if(bell==100)
{ TR1=0; bell=0;}
}
void main(void)
{ uchar i=0;
EA=1;ET0=1;ET1=1;TMOD=0X11;
TH0=hi; TL0=lo;
TH1=hi1; TL1=lo1;
while(1)
{
if(mark15s==0&&keypress==0)
key=get_char( );
if(P37==1&&keypress==1)
{ key_func(key);
TR0=1; TR1=1;
P30=1;
displed[0]=time15s%10; //赋15秒的定时
displed[1]=time15s/10;
mark15s=1;
keypress=0;
}
shift(ledk[displed[i]]);
delay(22);
mask=_crol_(mask,1);
if(mask==0xef) mask=0xfe;
if(mark15s==0) P2=keymark|(mask&0x0f);
else P2=mask;
i++;
if(i==4) i=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -