📄 bh1415_new.c
字号:
#define uchar unsigned char
#define uint unsigned int
#include "DS89C4xx.h"
#include "BH1415.H"
//按键定义
sbit key_select=P1^6;//频率位数.选择 也是dat
sbit key_add =P1^7;//频率值加一 也是clk
uchar code num[]={ 0x3F,0x06,0x5B,0x4F,
0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,
0x39,0x5E,0x79,0x71};
uchar fre[4]; //要设定的四位发射频率,如099.9MHz
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]=0;
fre[1]=9;
fre[2]=6;
fre[3]=7;
en=0;
clk=0;
//while(1)
writefrequency(fre);
/////////////////////////////////////////////////////
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))&&((*p)!=0) ){
P3=0xfe;//数码管位选1
P0=num[*(p+0)];
delayms(2);
P3=0xff;
}
if( ((count==1)&&(key!=1)) || (count!=1) ){
P3=0xfd;//数码管位选2
P0=num[*(p+1)];
delayms(2);
P3=0xff;
}
if( ((count==1)&&(key!=2)) || (count!=1) ){
P3=0xfb;//数码管位选3
P0=num[*(p+2)]|0x80;//显示小数点
delayms(2);
P3=0xff;
}
if( ((count==1)&&(key!=3)) || (count!=1) ){
P3=0xf7;//数码管位选4
P0=num[*(p+3)];
delayms(2);
P3=0xff;
}
}
//功能: 选择中的频率位闪烁
void brind()
{
uchar i;
uchar 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--)
{
P3=temp;//数码管位选
P0=num[*(fre+key)];//当前正在操作的数据位闪烁
delayms(2);
P3=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;//当最后一位频率值设定后再按此键就标志完成一次频率修改
//这样就可以减少一个确定按键的使用
if((fre[0]==1)&&(fre[1]==2)) fre[2]=fre[3]=0;
}
else
switch(key)
{
case 1:if(fre[0]>1) fre[0]=1;break;
case 2:if((fre[0]==1)&&(fre[1]>=2)) 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]++;
if(fre[key]>9) fre[key]=0;
if((key==0)&&(fre[key]>1)) fre[key]=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -