主程序
#include <stc8a8k.h>
#include <stdio.h>
#include <math.h>
#include "oled.h"
#include "key44.h"
unsigned int flag1;
unsigned int count1;
unsigned int count2;
unsigned char KeyValue;
#define xzdir 1
#define xfdir 0
#define yzdir 1
#define yfdir 0
#define movex 0
#define movey 1
sbit xdir=P3^4;
sbit xpu=P6^4;
sbit ydir=P3^5;
sbit ypu=P6^7;
sbit beep=P5^5;
sbit shache=P0^3;
sbit xoriginLED=P0^4;
sbit yoriginLED=P0^5;
sbit xtriginLED=P0^6;
sbit ytriginLED=P0^7;
unsigned char key1count=0;
unsigned char key2count=0;
unsigned char key3count=0;
unsigned char key4count=0;
unsigned char key5count=0;
unsigned char key6count=0;
unsigned char key7count=0;
int parnum=0;
float stepnum=0.01;
int freq[10]={1000,2000,3000,4000,5000,6000,7000,8000,9000,10000};
int freqnum=1;
float pulmm=49.5;
int pulnum;
int movesel=0;
int xo,yo;
int xstart,ystart;
int xm,ym;
int xm1,ym1;
int xend,yend;
int stepsum;
int ixx;
int fm;fm1;
float kb;
float linelength;
int xoflag=0,yoflag=0;
int jiting=0;
int taskflag=0;
void runtask0(int i);
void runtask1(float xeo,float yeo);
void runtask2(float kbtemp,float linelengthtemp);
void runtask3(float xa,float ya,float xb,float yb);
void runtask4(float xra,float yra,float xyradius,unsigned char i);
unsigned char judgexx(float xa,float ya,float xb,float yb);
void diyi(float xa,float ya,float xb,float yb);
void dier(float xa,float ya,float xb,float yb);
void disan(float xa,float ya,float xb,float yb);
void disi(float xa,float ya,float xb,float yb);
void xposstep();
void xnegstep();
void yposstep();
void ynegstep();
void delayms(int tt)
{
int i,j;
for(i=tt;i>0;i--)
for(j=5000;j>0;j--);
}
void dididi(int tt,int ss)
{
for(tt;tt>0;tt--)
{
beep=1;
delayms(ss);
beep=0;
delayms(ss);
}
}
void delayus(int tt)
{
int i,j;
for(i=tt;i>0;i--)
for(j=100;j>0;j--);
}
void port_init()
{
P0M0=0x00;P0M1=0x00;
P1M0=0x00;P1M1=0x00;
P2M0=0x00;P2M1=0x00;
P3M0=0x00;P3M1=0x00;
P4M0=0x00;P4M1=0x00;
P5M0=0x00;P5M1=0x00;
P6M0=0x00;P6M1=0x00;
P7M0=0x00;P7M1=0x00;
}
void main()
{
unsigned char disbuf[9];
int bb;
port_init();
OLED_Init();
flag1=0;
kb=0.2;
linelength=10;
beep=0;
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = 0x66;
TH0 = 0xEA;
TF0 = 0;
ET0=1;
IT0=1;
EX0=1;
IT1 = 1;
EX1 = 1;
INTCLKO = EX2|EX3|EX4;
EA=1;
OLED_ShowString(0,0,"start ok!");
xm=0;
ym=0;
xend=100;
yend=200;
kb=0.01;
linelength=100;
OLED_ShowString(80,0,"key");
while(1)
{
KeyScan();
OLED_ShowNum(105,0,KeyValue,2,12);
if(KeyValue==1)
{
KeyValue=200;
switch(key1count)
{
case 0://任务0,原点出发,直线插补
OLED_ShowString(20,1,"runT0!");
xend=(int)(20*xend);
yend=(int)(19.3*yend);
break;
case 1://回0
OLED_ShowString(20,1,"runT1!");
break;
case 2:
OLED_ShowString(20,1,"runT2!");
break;
case 3:
OLED_ShowString(20,1,"runT3!");
break;
case 4:
OLED_ShowString(20,1,"runT4!");
break;
default:break;
}
}
else if(KeyValue==2)
{
KeyValue=200;
key1count++;
OLED_ShowString(0,1,"t");
OLED_ShowNum(0,10,key1count,2,12);
if(key1count==5)
{
key1count=0;
}
}
else if(KeyValue==3)
{
KeyValue=200;
key2count++;
if(key2count==7)
key2count=1;
switch(key2count)
{
case 1://xm
parnum=1; OLED_ShowString(50,2,"p=xm!");break;
case 2://xend
parnum=2; OLED_ShowString(50,2,"p=xe!");break;
case 3://ym
parnum=3; OLED_ShowString(50,2,"p=ym!");break;
case 4://yend
parnum=4; OLED_ShowString(50,2,"p=ye!");break;
case 5://kb
parnum=5; OLED_ShowString(50,2,"p=kb!");break;
case 6://linelenth
parnum=6; OLED_ShowString(50,2,"p=li!");break;
default:break;
}
}
else if(KeyValue==4)
{
key3count++;
if(key3count==6)
key3count=1;
KeyValue=200;
switch(key3count)
{
case 1:
stepnum=0.01;break;
case 2:
stepnum=0.1;break;
case 3:
stepnum=1;break;
case 4:
stepnum=10;break;
case 5:
stepnum=100;break;
default:break;
}
OLED_ShowNum(0,3,stepnum,3,12);
}
else if(KeyValue==5)
{
KeyValue=200;
switch(parnum)
{
case 1://起点加1毫米
if(xm>500)
xm=0;
else
xm=xm+stepnum;
break;
case 2://终点加1毫米
if(xend>500)
xend=0;
else
xend=xend+stepnum;
break;
case 3://起点加1毫米
if(ym>500)
ym=0;
else
ym=ym+stepnum;
break;
case 4://终点加1毫米
if(yend>500)
yend=0;
else
yend=yend+stepnum;
break;
case 5://斜率加0.01
if(kb>1)
kb=0;
else
kb=kb+0.01;
break;
case 6://长度加1毫米
if(linelength>500)
linelength=0;
else
linelength=linelength+stepnum;
break;
default:break;
}
}
else if(KeyValue==6)
{
KeyValue=200;
switch(parnum)
{
case 1://起点加1毫米
if(xm<-500)
xm=500;
else
xm=xm-stepnum;
break;
case 2://终点加1毫米,
if(xend<-500)
xend=0;
else
xend=xend-stepnum;
break;
case 3://起点加1毫米
if(ym<-500)
ym=0;
else
ym=ym-stepnum;
break;
case 4://终点加1毫米
if(yend<-500)
yend=0;
else
yend=yend-stepnum;
break;
case 5://斜率加0.01
if(kb<0)
kb=1;
else
kb=kb-0.01;
break;
case 6://长度加1毫米
if(linelength<-500)
linelength=500;
else
linelength=linelength-stepnum;
break;
default:break;
}
}
else if(KeyValue==7)
{
KeyValue=200;
key7count++;
if(key7count==6)
key7count=1;
switch(key7count)
{
case 1:
freqnum=1;break;
case 2:
freqnum=2;break;
case 3:
freqnum=3;break;
case 4:
freqnum=4;break;
case 5:
freqnum=5;break;
default:break;
}
}
else if(KeyValue==12)
{
KeyValue=200;
OLED_ShowString(60,3,"x+="); OLED_ShowNum(85,3,jiting,1,12);
while(jiting==0)xposstep();
OLED_ShowNum(85,3,jiting,1,12);
dididi(3,20);
jiting=0;
}
else if(KeyValue==13)
{KeyValue=200;
OLED_ShowString(60,3,"x-="); OLED_ShowNum(85,3,jiting,1,12);
while(jiting==0)xnegstep();
OLED_ShowNum(85,3,jiting,1,12);
dididi(3,20);
jiting=0;
}
else if(KeyValue==14)
{KeyValue=200;
OLED_ShowString(60,3,"y+="); OLED_ShowNum(85,3,jiting,1,12);
while(jiting==0)yposstep();
OLED_ShowNum(85,3,jiting,1,12);
dididi(3,20);
jiting=0;
}
else if(KeyValue==15)
{KeyValue=200;
OLED_ShowString(60,3,"y-="); OLED_ShowNum(85,3,jiting,1,12);
while(jiting==0)ynegstep();
OLED_ShowNum(85,3,jiting,1,12);
dididi(3,20);
jiting=0;
}
KeyValue=100;
OLED_ShowString(0,4,"kb=");
sprintf(disbuf,"%.2f",kb);
OLED_ShowString(24,4,disbuf);
OLED_ShowString(60,4,"le=");
if(linelength>0)
{
OLED_ShowChar(90,4,'+');
OLED_ShowNum(98,4,linelength,3,12);
}
else
{
OLED_ShowChar(90,4,'-');
OLED_ShowNum(98,4,abs(linelength),3,12);
}
OLED_ShowString(0,5,"xm=");
if(xm>0)
{
OLED_ShowChar(24,5, '+');
OLED_ShowNum(32,5,xm,3,12);
}
else
{
OLED_ShowChar(24,5,'-');
OLED_ShowNum(32,5,abs(xm),3,12);
}
OLED_ShowString(60,5,"ym=");
if(ym>0)
{
OLED_ShowChar(90,5, '+');
OLED_ShowNum(98,5,ym,3,12);
}
else
{
OLED_ShowChar(90,5,'-');
OLED_ShowNum(98,5,abs(ym),3,12);
}
OLED_ShowString(0,6,"xe=");
if(xend>0)
{
OLED_ShowChar(24,6, '+');
OLED_ShowNum(32,6,abs(xend),3,12);
}
else
{
OLED_ShowChar(24,6,'-');
OLED_ShowNum(32,6,abs(xend),3,12);
}
OLED_ShowString(60,6,"ye=");
if(yend>0)
{
OLED_ShowChar(90,6, '+');
OLED_ShowNum(98,6,yend,3,12);
}
else
{
OLED_ShowChar(90,6,'-');
OLED_ShowNum(98,6,abs(yend),3,12);
}
}
}
void exint0() interrupt 0
{
xoriginLED=1;
xoflag=1;
TR0=0;
xpu=0;
dididi(5,10);
}
void exint1() interrupt 2
{
yoriginLED=1;
yoflag=1;
TR0=0;
ypu=0;
dididi(5,20);
}
void INT2_Isr() interrupt 10 using 1
{
xoriginLED=1;
xoflag=1;
TR0=0;
xpu=0;
dididi(3,50);
}
void INT3_Isr() interrupt 11 using 1
{
yoriginLED=1;
yoflag=1;
TR0=0;
ypu=0;
dididi(6,80);
}
void INT4_Isr() interrupt 16 using 1
{
jiting=1;
}
void Timer0() interrupt 1
{
TL0 = 0x66;
TH0 = 0x7E;
count1++;
if(count1>=10)
{
count1=0;
flag1=1;
}
else
{
if(movesel==movex)
xpu=!xpu;
else if(movesel==movey)
ypu=!ypu;
}
}
void xposstep()
{
movesel=movex;
xdir=xzdir;
TR0=1;
while(flag1==0);
flag1=0;
TR0=0;
}
void xnegstep()
{
movesel=movex;
xdir=xfdir;
TR0=1;
while(flag1==0);
flag1=0;
TR0=0;
}
void yposstep()
{
movesel=movey;
ydir=yzdir;
TR0=1;
while(flag1==0);
flag1=0;
TR0=0;
}
void ynegstep()
{
movesel=movey;
ydir=yfdir;
TR0=1;
while(flag1==0);
flag1=0;
TR0=0;
}
void runtask0(int i)
{
switch(i)
{
case 0:
while(xoflag==0)
xposstep();
delayms(10);
xoflag=0;
break;
case 1:
while(yoflag==0)
yposstep();
delayms(100);
yoflag=0;
break;
case 2:
while(xoflag==0)
xposstep();
delayms(100);
xoflag=0;
while(yoflag==0)
yposstep();
delayms(100);
yoflag=0;
break;
default:break;
}
}
void runtask1(float xeo,float yeo)
{
diyi(0,0,xeo,yeo);
}
void runtask2(float kbtemp,float linelengthtemp)
{
float xend2;
float yend2;
xend2=linelengthtemp*cos(kbtemp);
yend2=linelengthtemp*sin(kbtemp);
diyi(0,0,xend2,yend2);
}
void runtask3(float xa,float ya,float xb,float yb)
{
int i;
i=judgexx(xa,ya,xb,yb);
switch(i)
{
case 1:
diyi(xa,ya,xb,yb);
break;
case 2:
dier(xa,ya,xb,yb);
break;
case 3:
disan(xa,ya,xb,yb);
break;
case 4:
disi(xa,ya,xb,yb);
break;
default:break;
}
}
void diyi(float xa,float ya,float xb,float yb)
{
xstart=xa;
ystart=ya;
xend=xb;
yend=yb;
stepsum=(xend-xstart)+(yend-ystart);
fm=0;
while(stepsum>=0)
{
if(fm<0)
{
yposstep();
fm=fm+xend;
}
else
{
xposstep();
fm=fm-yend;
}
stepsum--;
}
TR0=0;
}
void dier(float xa,float ya,float xb,float yb)
{
xstart=abs(xa);
ystart=abs(ya);
xend=abs(xb);
yend=abs(yb);
stepsum=abs(xend-xstart)+abs(yend-ystart);
fm=0;
while(stepsum>=0)
{
if(fm<0)
{
yposstep();
fm=fm+xend;
}
else
{
xnegstep();
fm=fm-yend;
}
stepsum--;
}
}
void disan(float xa,float ya,float xb,float yb)
{
xstart=abs(xa);
ystart=abs(ya);
xend=abs(xb);
yend=abs(yb);
stepsum=abs(xend-xstart)+abs(yend-ystart);
fm=0;
while(stepsum>=0)
{
if(fm<0)
{
ynegstep();
fm=fm+xend;
}
else
{
xnegstep();
fm=fm-yend;
}
stepsum--;
}
}
void disi(float xa,float ya,float xb,float yb)
{
xstart=abs(xa);
ystart=abs(ya);
xend=abs(xb);
yend=abs(yb);
stepsum=abs(xend-xstart)+abs(yend-ystart);
fm=0;
while(stepsum>=0)
{
if(fm<0)
{
ynegstep();
fm=fm+xend;
}
else
{
xposstep();
fm=fm-yend;
}
stepsum--;
}
}
unsigned char judgexx(float xa,float ya,float xb,float yb)
{
float xtemp,ytemp;
unsigned char resultxx;
xtemp=xb-xa;
ytemp=yb-ya;
if(xtemp>0)
{
if(ytemp>0)
resultxx=1;
else
resultxx=4;
}
else
{
if(ytemp>0)
resultxx=2;
else
resultxx=3;
}
return resultxx;
}
oled.c
#include "oled.h"
#include "oledfont.h"
#if OLED_MODE==1
void OLED_WR_Byte(u8 dat,u8 cmd)
{
DATAOUT(dat);
if(cmd)
OLED_DC_Set();
else
OLED_DC_Clr();
OLED_CS_Clr();
OLED_WR_Clr();
OLED_WR_Set();
OLED_CS_Set();
OLED_DC_Set();
}
#else
void OLED_WR_Byte(u8 dat,u8 cmd)
{
u8 i;
if(cmd)
OLED_DC_Set();
else
OLED_DC_Clr();
delay4us_tOLED(1);
OLED_CS_Clr();
delay4us_tOLED(1);
for(i=0;i<8;i++)
{
OLED_SCLK_Clr();
delay4us_tOLED(1);
if(dat&0x80)
OLED_SDIN_Set();
else
OLED_SDIN_Clr();
OLED_SCLK_Set();
dat<<=1;
}
delay4us_tOLED(1);
OLED_CS_Set();
delay4us_tOLED(1);
OLED_DC_Set();
}
#endif
void OLED_Set_Pos(unsigned char x, unsigned char y)
{
OLED_WR_Byte(0xb0+y,OLED_CMD);
OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD);
}
void OLED_Display_On(void)
{
OLED_WR_Byte(0X8D,OLED_CMD);
OLED_WR_Byte(0X14,OLED_CMD);
OLED_WR_Byte(0XAF,OLED_CMD);
}
void OLED_Display_Off(void)
{
OLED_WR_Byte(0X8D,OLED_CMD);
OLED_WR_Byte(0X10,OLED_CMD);
OLED_WR_Byte(0XAE,OLED_CMD);
}
void OLED_Clear(void)
{
u8 i,n;
for(i=0;i<8;i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD);
OLED_WR_Byte (0x00,OLED_CMD);
OLED_WR_Byte (0x10,OLED_CMD);
for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
}
}
void OLED_ShowChar(u8 x,u8 y,u8 chr)
{
unsigned char c=0,i=0;
c=chr-' ';
if(x>Max_Column-1){x=0;y=y+2;}
OLED_Set_Pos(x,y+1);
for(i=0;i<6;i++)
OLED_WR_Byte(F6x8[c][i],OLED_DATA);
}
u16 oled_pow(u8 m,u8 n)
{
u16 result=1;
while(n--)result*=m;
return result;
}
void OLED_ShowNum(u8 x,u8 y,u16 num,u8 len,u8 size0)
{
u8 t,temp;
u8 enshow=0;
for(t=0;t<len;t++)
{
temp=(num/oled_pow(10,len-t-1))%10;
if(enshow==0&&t<(len-1))
{
if(temp==0)
{
OLED_ShowChar(x+((size0/2)+1)*t,y,' ');
continue;
}else enshow=1;
}
OLED_ShowChar(x+((size0/2)+1)*t,y,temp+'0');
}
}
void OLED_ShowString(u8 x,u8 y,u8 *chr)
{
unsigned char j=0;
while (chr[j]!='\0')
{ OLED_ShowChar(x,y,chr[j]);
x+=8;
if(x>120){x=0;y+=2;}
j++;
}
}
void OLED_Init(void)
{
P4M0 =0;
P4M1 =0;
P7M0=0;
P7M1=0;
delay_tmsOLED(5);
OLED_RST_Set();
delay_tmsOLED(5);
OLED_RST_Clr();
delay_tmsOLED(5);
OLED_RST_Set();
OLED_WR_Byte(0xAE,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0x10,OLED_CMD);
OLED_WR_Byte(0x40,OLED_CMD);
OLED_WR_Byte(0x81,OLED_CMD);
OLED_WR_Byte(0xCF,OLED_CMD);
OLED_WR_Byte(0xA1,OLED_CMD);
OLED_WR_Byte(0xC8,OLED_CMD);
OLED_WR_Byte(0xA6,OLED_CMD);
OLED_WR_Byte(0xA8,OLED_CMD);
OLED_WR_Byte(0x3f,OLED_CMD);
OLED_WR_Byte(0xD3,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0xd5,OLED_CMD);
OLED_WR_Byte(0x80,OLED_CMD);
OLED_WR_Byte(0xD9,OLED_CMD);
OLED_WR_Byte(0xF1,OLED_CMD);
OLED_WR_Byte(0xDA,OLED_CMD);
OLED_WR_Byte(0x12,OLED_CMD);
OLED_WR_Byte(0xDB,OLED_CMD);
OLED_WR_Byte(0x40,OLED_CMD);
OLED_WR_Byte(0x20,OLED_CMD);
OLED_WR_Byte(0x02,OLED_CMD);
OLED_WR_Byte(0x8D,OLED_CMD);
OLED_WR_Byte(0x14,OLED_CMD);
OLED_WR_Byte(0xA4,OLED_CMD);
OLED_WR_Byte(0xA6,OLED_CMD);
OLED_WR_Byte(0xAF,OLED_CMD);
OLED_WR_Byte(0xAF,OLED_CMD);
OLED_Clear();
OLED_Set_Pos(0,0);
}
void OLED_SCLK_Clr()
{
OLED_SCLK=0;
}
void OLED_SCLK_Set()
{
OLED_SCLK=1;
}
void OLED_SDIN_Clr()
{
OLED_SDIN=0;
}
void OLED_SDIN_Set()
{
OLED_SDIN=1;
}
void OLED_RST_Clr()
{
OLED_RST=0;
}
void OLED_RST_Set()
{
OLED_RST=1;
}
void OLED_DC_Clr()
{
OLED_DC=0;
}
void OLED_DC_Set()
{
OLED_DC=1;
}
void OLED_CS_Clr()
{
OLED_CS=0;
}
void OLED_CS_Set()
{
OLED_CS=1;
}
void OLED_ShowFloatii(u8 x,u8 y,float num,u8 ii)
{
u8 i,j,mm;
float mmd;
i=x*8;
j=y;
mm=8;
mmd=0.125;
switch(ii)
{
case 43://1234.456
OLED_ShowNum(i,j,(int)(num/1000)%10,1,12);
OLED_ShowNum(i+mm,j,(int)(num/100)%10,1,12);
OLED_ShowNum(i+2*mm,j,(int)(num/10)%10,1,12);
OLED_ShowNum(i+3*mm,j,(int)(num)%10,1,12);
OLED_ShowString(i+4*mm,j,".");
OLED_ShowNum(i+5*mm,j,(int)(num*10)%10,1,12);
OLED_ShowNum(i+6*mm,j,(int)(num*100)%10,1,12);
OLED_ShowNum(i+7*mm,j,(int)(num*1000)%10,1,12);
break;
case 42://1234.45
OLED_ShowNum(i,j,(int)(num/1000)%10,1,12);
OLED_ShowNum(i+mm,j,(int)(num/100)%10,1,12);
OLED_ShowNum(i+2*mm,j,(int)(num/10)%10,1,12);
OLED_ShowNum(i+3*mm,j,(int)(num)%10,1,12);
OLED_ShowString(i+4*mm,j,".");
OLED_ShowNum(i+5*mm,j,(int)(num*10)%10,1,12);
OLED_ShowNum(i+6*mm,j,(int)(num*100)%10,1,12);
break;
case 33://123.456
OLED_ShowNum(i,j,(int)(num/100)%10,1,12);
OLED_ShowNum(i+mm,j,(int)(num/10)%10,1,12);
OLED_ShowNum(i+2*mm,j,(int)(num*1)%10,1,12);
OLED_ShowString(i+3*mm,j,".");
OLED_ShowNum(i+4*mm,j,(int)(num*100)%10,1,12);
OLED_ShowNum(i+5*mm,j,(int)(num*100)%10,1,12);
OLED_ShowNum(i+6*mm,j,(int)(num*1000)%10,1,12);
break;
case 32://123.45*100=12345 1,5
OLED_ShowNum(i,j,(int)(num/100)%10,1,12);
OLED_ShowNum(i+mm,j,(int)(num/10)%10,1,12);
OLED_ShowNum(i+2*mm,j,(int)(num*10)%10,1,12);
OLED_ShowString(i+3*mm,j,".");
OLED_ShowNum(i+4*mm,j,(int)(num*10)%10,1,12);
OLED_ShowNum(i+5*mm,j,(int)(num*100)%10,1,12);
break;
case 31:
OLED_ShowNum(i,j,(int)(num/100)%10,1,12);
OLED_ShowNum(i+mm,j,(int)(num/10)%10,1,12);
OLED_ShowNum(i+2*mm,j,(int)(num*1)%10,1,12);
OLED_ShowString(i+3*mm,j,".");
OLED_ShowNum(i+4*mm,j,(int)(num*10)%10,1,12);
break;
case 23:
OLED_ShowNum(i,j,(int)(num/10)%10,1,12);
OLED_ShowNum(i+mm,j,(int)(num*1)%10,1,12);
OLED_ShowString(i+2*mm,j,".");
OLED_ShowNum(i+3*mm,j,(int)(num*10)%10,1,12);
OLED_ShowNum(i+4*mm,j,(int)(num*100)%10,1,12);
OLED_ShowNum(i+5*mm,j,(int)(num*1000)%10,1,12);
break;
case 22:
OLED_ShowNum(i,j,(int)(num/10)%10,1,12);
OLED_ShowNum(i+mm,j,(int)(num)%10,1,12);
OLED_ShowString(i+2*mm,j,".");
OLED_ShowNum(i+3*mm,j,(int)(num*10)%10,1,12);
OLED_ShowNum(i+4*mm,j,(int)(num*100)%10,1,12);
break;
case 21:
OLED_ShowNum(i,j,(int)(num/10)%10,1,12);
OLED_ShowNum(i+mm,j,(int)(num)%10,1,12);
OLED_ShowString(i+2*mm,j,".");
OLED_ShowNum(i+3*mm,j,(int)(num*10)%10,1,12);
break;
case 13:
OLED_ShowNum(i,j,(int)(num)%10,1,12);
OLED_ShowString(i+2*mm,j,".");
OLED_ShowNum(i+2*mm,j,(int)(num*10)%10,1,12);
OLED_ShowNum(i+3*mm,j,(int)(num*100)%10,1,12);
OLED_ShowNum(i+4*mm,j,(int)(num*1000)%10,1,12);
break;
case 12:
OLED_ShowNum(i,j,(int)(num)%10,1,12);
OLED_ShowString(i+mm,j,".");
OLED_ShowNum(i+2*mm,j,(int)(num*10)%10,1,12);
OLED_ShowNum(i+3*mm,j,(int)(num*100)%10,1,12);
break;
case 11:
OLED_ShowNum(i,j,(int)(num*10/10)%10,1,12);
OLED_ShowString(i+mm,j,".");
OLED_ShowNum(i+2*mm,j,(int)(num*10)%10,1,12);
break;
default :break;
}
}
void delay_tmsOLED(unsigned int ms0)
{
unsigned char i, j;
unsigned int tms;
for(tms=ms0;tms>0;tms--)
for(i=20;i>0;i--)
for(j=136;j>0;j--);
}
void delay4us_tOLED(int us)
{
int i;
for(i=us;i>0;i--);
}
key44,c
#include <key44.h>
void KeyScan()
{
char a = 0;
GPIO_KEY=0x0f;
P1M1=0x00;
P1M0=0x00;
if(GPIO_KEY!=0x0f)
{Delay10ms(1);
if(GPIO_KEY!=0x0f)
{
P1M1=0x00;
P1M0=0x01;
GPIO_KEY=0X0F;
P1M1=0x00;
P1M0=0x00;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=4;break;
case(0X0d): KeyValue=8;break;
case(0X0e): KeyValue=12;break;
}
P1M1=0x00;
P1M0=0x01;
GPIO_KEY=0XF0;
P1M1=0x00;
P1M0=0x00;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue+3;break;
case(0Xb0): KeyValue=KeyValue+2;break;
case(0Xd0): KeyValue=KeyValue+1;break;
case(0Xe0): KeyValue=KeyValue;break;
}
while((a<20) && (GPIO_KEY!=0xf0))
{
Delay10ms(2);
a++;
}
}
}
}
unsigned char KeyScan0()
{
unsigned char key=0xff;
unsigned char scancode,recode,tmp;
P0M0=0x00;
P0M1=0x00;
GPIO_KEY=0x0f;
GPIO_KEY=0x0f;
Delay10ms(1);
if(GPIO_KEY!=0x0f)
{
Delay10ms(2);
if(GPIO_KEY!=0x0f)
{
scancode=0xef;
while((scancode&0xf0)!=0xf0)
{
GPIO_KEY=scancode;
if((GPIO_KEY&0x0f)!=0x0f)
{
recode=GPIO_KEY|0xf0;
while((GPIO_KEY&0x0f)!=0x0f);
tmp=(~scancode)+(~recode);
break;
}
else
scancode=(scancode<<1)|0x01;
}
}
}
switch (tmp)
{
case 0x18:key=0;break;
case 0x14:key=4;break;
case 0x12:key=8;break;
case 0x11:key=12;break;
case 0x28:key=1;break;
case 0x24:key=5;break;
case 0x22:key=9;break;
case 0x21:key=13;break;
case 0x48:key=2;break;
case 0x44:key=6;break;
case 0x42:key=10;break;
case 0x41:key=14;break;
case 0x88:key=3;break;
case 0x84:key=7;break;
case 0x82:key=11;break;
case 0x81:key=15;break;
}
return(key);
}
void Delay10ms(unsigned int c)
{
unsigned char a, b;
for (;c>0;c--)
{
for (b=144;b>0;b--)
{
for (a=157;a>0;a--);
}
}
}
key44.h
#include <stc8a8k.h>
#define GPIO_KEY P1
extern unsigned char KeyValue;
void KeyScan();
void Delay10ms(unsigned int c);
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c3658f49c7e0335b72031bcba18eba56.png)