📄 main.c
字号:
db_clear(t_m/10,t_m%10,t_s/10,t_s%10);
break;
}
else if(freq==2)
{
P1_7=0;
P1_5=0;
P0_0=1;
pread=0x1b02;
idamin_l=*pread++;
idamin_h=*pread;
while(KEY==0);
db_clear(idamin_h/10,idamin_h%10,idamin_l/10,idamin_l%10);
break;
}
else if(freq==3)
{
P1_7=0;
P1_5=1;
P0_0=0;
pread=0x1b04;
idamax_l=*pread++;
idamax_h=*pread;
while(KEY==0);
db_clear(idamax_h/10,idamax_h%10,idamax_l/10,idamax_l%10);
break;
}
else
{
freq=0;
P1_7=0;
P1_5=0;
P0_0=0;
while(KEY==0);
break;
}
}
default: break;
}
}
else
{
break;
}
}while(1);
}
}while((S2!=0)&&(P0_5==1)); //S2没有接通且无外部屏蔽信号,继续脉冲计数
P1_0=0;
}while(P0_5==0); //S2没有接通且外部有屏蔽信号,程序重新开始执行(外屏需保持一段时间)
P1_0=0;
db4=count/1000;
db3=count/100-db4*10;
db2=count/10-db4*100-db3*10;
db1=count%10;
db_clear(db1,db2,db3,db4); //S1脉冲计数值用数码管显示,不超过2000;
IDA0L=Get_DAL(count*1023/2000);
IDA0H=Get_DAH(count*1023/2000);
P1_1=1; //触发K2
delay_10ms(100); //延时1s
if(count>=2) //输入信号正常
{ //S3还未接通,键盘输入可修改数字
do
{
if ((KEY==0)&&(S3!=0))
{
CS = 0;
delay_short();
SEND_BUF=0X15; // 写入读键盘数据指令
send7289();
delay_short();
symbol = read_key(); // 读出按键的值
ACC=symbol;
CS = 1;
delay_long();
switch(symbol)
{
case(2):
{
freq++;
if(freq==1)
{
P1_7=1;
P1_5=0;
P0_0=0;
pread=0x1b00;
t_s=*pread++;
t_m=*pread;
while(KEY==0);
db_clear(t_m/10,t_m%10,t_s/10,t_s%10);
break;
}
else if(freq==2)
{
P1_7=0;
P1_5=0;
P0_0=1;
pread=0x1b02;
idamin_l=*pread++;
idamin_h=*pread;
while(KEY==0);
db_clear(idamin_h/10,idamin_h%10,idamin_l/10,idamin_l%10);
break;
}
else if(freq==3)
{
P1_7=0;
P1_5=1;
P0_0=0;
pread=0x1b04;
idamax_l=*pread++;
idamax_h=*pread;
while(KEY==0);
db_clear(idamax_h/10,idamax_h%10,idamax_l/10,idamax_l%10);
break;
}
else
{
freq=0;
P1_7=0;
P1_5=0;
P0_0=0;
while(KEY==0);
db_clear(db1,db2,db3,db4);
break;
}
}
default: break;
}
}
else if(S3==0) //S3接通;
{
P1_1=0; //K2停止;
break;
}
else //S3未接通且无键盘信号时等待S3信号
{
;
}
}while (1);
}
else
{
break; //S1少于两个脉冲,跳出程序
}
}while(1); //输出故障,数码管闪动;
CS=0;
delay_short();
SEND_BUF=0X88;
send7289();
delay_short();
SEND_BUF=0xF0;
send7289();
CS=1;
delay_long();
do
{
;
}while(1);
}
void SysClk_Init(void) /***配置系统时钟***/
{
//配置内部高频振荡器为系统时钟
OSCICN=0X82; //系统时钟允许,为振荡器两分频
OSCICL=OSCICL+22; //设置片内振荡器为22.1184MHZ
CLKSEL=0X00; //系统时钟选择内部高频振荡器
}
void WDT_Init(void) /***使能看门狗初始化***/
{
PCA0MD=0X00; //系统时钟的12分频
PCA0CPL2=0Xff; //超时时间间隔70ms
PCA0CPH2=0Xff;
PCA0MD=0X60;
EA=1;
}
void port_Init(void) /***端口初始化,没有用内部数字IO资源,外部晶振,DAC输出***/
{
//P0MDIN=0XF3; //P0.2,P0.3全为模拟输入(外部晶振)
P0MDIN=0XFF; //P0全为数字输入
P0MDOUT=0X00; //P0.1(DAC0)开漏输出
P0SKIP=0X02; //跳过P0.1(DAC)
// P0SKIP=0X0E; //跳过P0.2,P0.3(外部晶振)
P0=0XFE;
P1MDIN=0XFF; //P1全为数字输入
P1MDOUT=0X00; //P1全为推挽输出
P1SKIP=0X00; //无跳过引脚
P1=0X00;
P2MDOUT=0Xff; //P2全为推挽输出
P2=0X00;
XBR0=0X00; //没有设置数字资源输出到引脚
XBR1=0XC0; //允许交叉开关,弱上拉
}
void timer_Init(void) /***定时器0初始化***/
{
TMOD=0X01; //定时器0工作于方式1;
TL0=0XB0; //定时器0初始值;
TH0=0X3C;
CKCON=0X00; //使用系统时钟;
TR0=1; //开中断
ET0=1;
EA=1;
}
void timer0_Isr(void) interrupt 1 /***定时器0 中断服务程序***/
{
PCA0CPL2=0Xff; //超时时间间隔70ms
PCA0CPH2=0Xff;
TMOD=0X01; //50ms中断一次;
TL0=0XB0;
TH0=0X3C;
din_50++;
setcan++;
if((din_50==5000)||(setcan==5000))
{
din_50=0;
setcan=0;
}
}
void DAC_Init(void) /***DAC初始化***/
{
IDA0CN=0XF1; //DAC允许,写IDA0H触发输出更新,1mA满度输出
}
unsigned char Get_DAH(unsigned int count) /***得到IDA0H值***/
{
unsigned char da_h;
count <<= 6;
count=(count&0xff00)>>8;
da_h=(unsigned char)count;
return da_h;
}
unsigned char Get_DAL(unsigned int count) /***得到IDA0L值***/
{
unsigned char da_l;
count <<= 6;
count=count&0x00ff;
da_l=(unsigned char)count;
return da_l;
}
void send7289() //7289送指令和数据函数
{
unsigned char BIT_CNT;
BIT_CNT=0x08;
delay_long();
while( BIT_CNT!=0)
{
DIO=((SEND_BUF>>(BIT_CNT-1))&0x01);
CLK=1;
delay_short();
CLK=0;
delay_short();
BIT_CNT--;
}
DIO=0;
}
void delay_short(void) //短延时
{
unsigned char j;
for(j=0;j<20;j++);
}
void delay_long(void) //长延时
{
unsigned char j;
for(j=0;j<120;j++)
{;}
}
void delay_10ms(unsigned int time) //延时10ms
{
unsigned int i,j,k;
for(i=0;i<time;i++)
for(j=0;j<10;j++)
for(k=0;k<120;k++)
;
}
unsigned char read_key() //7289读键盘代码
{
unsigned char i;
unsigned char temp=0;
unsigned char aa=0;
for(i=0;i<8;i++)
{
temp = temp<<1;
aa = DIO;
if(aa==1)
temp=temp+1;
CLK=1;
delay_short();
CLK=0;
}
return (temp);
}
void db_clear(int a,int b,int c,int d) //4位数码管显示
{
CS=0;
CLK=0;
delay_short();
SEND_BUF=0xA4; //7289复位
send7289();
CS = 0; // 选择驱动第1个数码管显示
delay_short();
SEND_BUF=0XC8;
send7289();
delay_short();
SEND_BUF=a;
send7289();
CS = 1;
delay_long();
CS = 0; // 选择驱动第2个数码管显示
delay_short();
SEND_BUF=0XC9;
send7289();
delay_short();
SEND_BUF=b;
send7289();
CS = 1;
delay_long();
CS = 0; // 选择驱动第3个数码管显示
delay_short();
SEND_BUF=0XCA;
send7289();
delay_short();
SEND_BUF=c;
send7289();
CS = 1;
delay_long();
CS = 0; // 选择驱动第4个数码管显示
delay_short();
SEND_BUF=0XCB;
send7289();
delay_short();
SEND_BUF=d;
send7289();
CS = 1;
delay_long();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -