📄 复件 jmq1.c
字号:
#define POD8751
#include <reg51.h>
#include <math.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
/*define MAX7219*/
sbit led_din=P1^7;
sbit led_clk=P1^6;
sbit led_ena=P1^5;
/*define MAX7219 end */
/*define x25045*/
sbit xicorcs=P1^0;
sbit xicorsi=P1^1;
sbit xicorsck=P1^2;
sbit xicorso=P1^3;
/*define x25045 end*/
/*define sub of x25045*/
void wren_cmd(void);
void wrsr_cmd(void);
void rdsr_cmd(void);
void tbyte_write(uchar);
void tbyte_read(uchar);
void out_byte(uchar);
void in_byte(void);
void wip_poll(void);
/*define sub of x25045 end*/
/*define 89c51*/
sbit inc=P3^4;
sbit dec=P3^6;
sbit set=P3^3;
sbit save=P3^7;
sbit clear=P0^4;
sbit restart=P0^5;
sbit out1=P0^6;
sbit out2=P0^7;
uint mode,num,disp;
float meter,r;
uchar sdata;
bdata uchar rdata;
union {uint word;struct{uchar hi;uchar lo;}bytes;}alldata;
bit oldsave,oldset;
uchar code ledmtab[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x00};
sbit fwip=rdata^0;
void service_int0();
void displ(uint,uchar);
void send(uint);
void wdelay(void);
void ldelay(void);
void deal();
void int7219();
void main(void)
{
meter=0;
disp=meter;
out1=1;
out2=1;
IT0=1;
EX0=1;
PX0=1;
EA=1;
mode=0;
num=0;
set=1;
clear=1;
inc=1;
dec=1;
save=1;
oldsave=save;
oldset=set;
restart=1;
int7219();
for(;;)
{
if(mode!=0) deal();/*判断SET键的状态,若SET键按下,则转DEAL()子程序*/
if(!restart)
{meter=0;IT0=1;EX0=1;PX0=1;EA=1;}
disp=meter;
displ(disp,mode);
wren_cmd();wrsr_cmd();tbyte_read(0x00);/*计米到设置1时,OUT1灯亮,指示开始减速*/
if((meter==(float)alldata.word)&&(meter!=0))
{out1=0;send(0x500+(uint)(0x40));}
wren_cmd();wrsr_cmd();tbyte_read(0x02); /*计米到设置2时,OUT2灯亮,指示停止*/
if((meter==(float)alldata.word) &&(meter!=0))
{ out2=0;IT0=0;EX0=0;PX0=0;EA=0;send(0x500+(uint)(0x08));}
if (!clear) {meter=0;IT0=0;EX0=0;PX0=0;EA=0;}
if (oldset!=set)/*按下SET键时的工作*/
{ ldelay(); mode++;oldset=set;}
wren_cmd();wrsr_cmd();tbyte_read(0x04);
r=(float)alldata.word/10;
}
}
void service_int0() interrupt 0 using 1 /*计算送一次脉冲的米数*/
{
num++;/*统计误差*/
meter=meter+2*3.14159*r;
if (!(num%5)) meter=meter+1.0;
}
void deal()
{
if (mode==1)/*模式1状态下的工作*/
{ wren_cmd();wrsr_cmd();/*读取设置1的值并显示*/
tbyte_read(0x00); disp=alldata.word;displ(disp,mode);}
if (mode==2) /*模式2状态下的工作*/
{ wren_cmd();wrsr_cmd();/*读取设置2的值并显示*/
tbyte_read(0x02);disp=alldata.word;displ(disp,mode); }
if (mode==3) /*模式3状态下的工作*/
{ wren_cmd();wrsr_cmd();/*读取设置3的值并显示*/
tbyte_read(0x04);disp=alldata.word;displ(disp,mode);}
for(;;)
{
if (oldset!=set)
{ wdelay();mode++;oldset=set;if(mode>3) mode=0;break;}
if (!inc)/*按下INC键时的工作*/
{ wdelay();
if (!inc)
{
if (disp==9999) disp=0;else disp++;
displ(disp,mode);
}
}
if (!dec) /*按下DEC键时的工作*/
{ wdelay();
if (!dec)
{
if (disp==0) disp=9999;else disp--;
displ(disp,mode);
}
}
if (oldsave==!save) /*按下SAVE键时的工作*/
{ ldelay();
if (mode==1){alldata.word=disp;wren_cmd();tbyte_write(0x00);}
if (mode==2){alldata.word=disp;wren_cmd();tbyte_write(0x02);}
if (mode==3){alldata.word=disp;wren_cmd();tbyte_write(0x04);}
oldsave=save;
mode++;
if(mode>=3) mode=0;
break;
}
}
}
void displ(uint n,uchar cap)/*显示程序*/
{
uchar temp[4];
uint d,i;
if (cap==0) send(0x0500+(uint)(0x00));/*模式0下,第5位无显示*/
if (cap==1) send(0x0500+(uint)(0x30));/*模式1下,第5位显示1*/
if (cap==2) send(0x0500+(uint)(0x6d));/*模式2下,第5位显示2*/
if (cap==3) send(0x0500+(uint)(0x79));/*模式3下,第5位显示3*/
d=n;
temp[3]=0;while(d>=1000) {temp[3]++; d-=1000;}
temp[2]=0;while(d>=100) {temp[2]++;d-=100;}
temp[1]=0;while(d>=10) {temp[1]++;d-=10;}
temp[0]=(uchar)d;
for(i=0;i<4;i++)
{ temp[i]=ledmtab[temp[i]];
if ((i==1)&&(cap==3)) temp[i]|=0x80;
}
d=n;
if (d<10)
{ send(0x0400+(uint)(0x00));
send(0x0300+(uint)(0x00));
if (mode!=3)
send(0x0200+(uint)(0x00));
else
send(0x0200+(uint)(0x7e+0x80));
send(0x0100+(uint)(temp[0]));}
else
{ if (d<100)
{ send(0x0400+(uint)(0x00));
send(0x0300+(uint)(0x00));
send(0x0200+(uint)(temp[1]));
send(0x0100+(uint)(temp[0]));}
else { if (d<1000)
{ send(0x0400+(uint)(0x00));
send(0x0300+(uint)(temp[2]));
send(0x0200+(uint)(temp[1]));
send(0x0100+(uint)(temp[0]));}
else
{ send(0x0400+(uint)(temp[3]));
send(0x0300+(uint)(temp[2]));
send(0x0200+(uint)(temp[1]));
send(0x0100+(uint)(temp[0]));}
}
}
}
void send(sh1)
uint sh1;
{uchar i;
led_clk=0;
led_ena=1;
for(i=0;i<16;i++)
{led_clk=0;
sh1<<=1;
led_din=CY;
led_clk=0;
led_clk=1;
}
led_clk=0;
led_ena=0;led_ena=1;led_ena=0;
}
void wdelay(void)
{ uchar i,j;
for (i=0;i<50;i++)
for(j=0;j<200;j++)
{;}
}
void wren_cmd(void)
{
xicorsck=0;
xicorcs=0;
out_byte(0x06);
xicorsck=0;xicorcs=1;;;
}
void wrsr_cmd(void)
{xicorsck=0;xicorcs=0;;;
out_byte(0x01);
out_byte(0x00);
xicorsck=0;xicorcs=1;;
wip_poll();
}
void rdsr_cmd(void)
{xicorsck=0;xicorcs=0;
out_byte(0x05);;;
in_byte();;;
xicorsck=0;xicorcs=1;;
}
void tbyte_write(uchar twaddress)
{xicorsck=0;xicorcs=0;;;
out_byte(0x02);
out_byte(twaddress);
out_byte(alldata.bytes.hi);
out_byte(alldata.bytes.lo);
xicorsck=0;xicorcs=1;;
wip_poll();
}
void tbyte_read(uchar traddress)
{xicorsck=0;xicorcs=0;;
out_byte(0x03);;
out_byte(traddress);
in_byte();;
alldata.bytes.hi=rdata;
in_byte();;
alldata.bytes.lo=rdata;
xicorsck=0;xicorcs=1;;
}
void out_byte(sdata)
uchar sdata;
{uchar scount=0x08;
while(scount){
xicorsck=0;;;
sdata<<=1;
xicorsi=CY;;
xicorsck=1;;
--scount;
}
xicorsi=0;
}
void in_byte(void)
{uchar rcount=0x08,subbyte;
rdata=0;
while(rcount){
xicorsck=1;;
xicorsck=0;;;
CY=xicorso;
subbyte=(uchar)CY;
rdata*=2;
rdata+=subbyte;
--rcount;
}
}
void wip_poll(void)
{uchar max=0x99;
do{
rdsr_cmd();
rdata=rdata;
--max;
}while(fwip&&(max!=0));
}
void ldelay(void)
{uchar i,j;
for(i=0;i<120;i++){
for(j=0;j<150;j++){;}
}
}
void int7219(void)
{
send(0x0900); send(0x0a01); send(0x0b04); send(0x0c01);
send(0x010f);send(0x020f);send(0x030f);send(0x040f);send(0x050f);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -