📄 bh1415.c
字号:
#define uchar unsigned char
#define uint unsigned int
#include "REG52.H"
#include "BH1415.H"
//按键定义
sbit key_select=P1^0;//频率位数选择
sbit key_add =P1^1;//频率值加一
sbit key_del =P1^2;//频率值减一
uchar code num[]={ 0x3F,0x06,0x5B,0x4F,
0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,
0x39,0x5E,0x79,0x71};
uchar fre[4]; //要设定的四位发射频率,如99.90MHz
uchar key; //频率的第几位数的选择
bit flag; //频率是否已更改
uchar count,count2; //count2 用于brind()闪烁函数作延时是否到了的标志
//count 用于标志当前状态,为1则进入了频率设置
void display(uchar *p);
void delayms(uchar i);
void scankey(void);
void brind();
//功能: 主程序
void main(void)
{
fre[0]=1;
fre[1]=0;
fre[2]=1;
fre[3]=8;
/////////////////////////////////////////////////////
while(1)
{
display(fre); //显示四位频率值
scankey();
//-----------------
if(flag==1)
{
writefrequency(fre);
flag=0;
}
//-----------------
if(count==1)//如果处于设置状态则设置位正在闪烁
brind();
}
/////////////////////////////////////////////////////
}
//功能: 显示四位频率值
void display(uchar *p)
{
if( ((count==1)&&(key!=0)) || (count!=1) ){
P2=0x0fe;//数码管位选1
P3=num[*(p+0)];
delayms(2);
P2=0x0ff;
}
if( ((count==1)&&(key!=1)) || (count!=1) ){
P2=0xffd;//数码管位选2
P3=num[*(p+1)];
delayms(2);
P2=0x0ff;
}
if( ((count==1)&&(key!=2)) || (count!=1) ){
P2=0xfb;//数码管位选3
P3=num[*(p+2)]|0x80;//显示小数点
delayms(2);
P2=0xff;
}
if( ((count==1)&&(key!=3)) || (count!=1) ){
P2=0xf7;//数码管位选4
P3=num[*(p+3)];
delayms(2);
P2=0xff;
}
}
//功能: 选择中的频率位闪烁
void brind()
{
uchar i,temp;
switch(key)
{
case 0:temp=0xfe;break;
case 1:temp=0xfd;break;
case 2:temp=0xfb;break;
case 3:temp=0xf7;break;
default:break;
}
count2++;
if(count2>40)
{
count2=0;
///////////
for(i=20;i>0;i--)
{
P2=temp;//数码管位选
P3=num[*(fre+key)];//当前正在操作的数据位闪烁
delayms(2);
P2=0xff;
display(fre);
}
//////////
}
}
//功能: 通用延时程序
void delayms(uchar i)
{
uchar n=10;
while(i--)
while(n--);
}
//功能: 按键扫描,执行后可能改变的值:flag,key,fre[key]
void scankey(void)
{
//数码管位选择按键 key_select
if(key_select==0) //频率位选择
{
delayms(5);
if(key_select==0)
{
while(key_select==0)
display(fre); //在按键未松开时进行显示,避免按下不放时没有显示数值
if(count==0) count=1; //这样可以识别key_select这个按键是否是第一次按下
//也提供了一个count==1的标志给其它函数指示
else
{
key++;
if(key>3)
{
key=0;
flag=1;
count=0;//当最后一位频率值设定后再按此键就标志完成一次频率修改
//这样就可以减少一个确定按键的使用
}
else
switch(key)
{
case 2:if((fre[0]==1)&&(fre[1]>=2)) {fre[2]=0;fre[1]=2;}
else if((fre[0]==0)&&(fre[1]<7)) fre[1]=7;break;
case 3:if((fre[0]==1)&&(fre[1]==2)) fre[2]=fre[3]=0;break;
default:break;
}
}
}
}
//频率值加一按键 key_add
if(key_add==0) //频率值增加
{
delayms(5);
if(key_add==0)
{
while(key_add==0) display(fre);
fre[key]++;
switch(key)
{
case 0:if(fre[key]>1) fre[key]=0;break;
case 1:if((fre[0]==1)&&(fre[1]>2)) fre[key]=0;
else if((fre[0]==0)&&(fre[key]>9)) fre[key]=7;
else if((fre[0]==0)&&(fre[key]<7)) fre[key]=9;
else if(fre[key]>9) fre[key]=0;break;
case 2:if((fre[0]==1)&&(fre[1]>=2)) {fre[2]=0;fre[1]=2;}
else if(fre[key]>9) fre[key]=0;
if((fre[0]==0)&&(fre[1]<7)) fre[1]=7;
break;
case 3:if((fre[0]==1)&&(fre[1]==2)) fre[2]=fre[3]=0;
else if(fre[key]>9) fre[key]=0;break;
default:break;
}
}
}
//频率值减一按键 key_del
if(key_del==0) //频率值减小
{
delayms(5);
if(key_del==0)
{
while(key_del==0) display(fre);
if(fre[key]==0)
fre[key]=9;
else
fre[key]--;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -