📄 -
字号:
#include<regx51.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
uchar aa,bb,cc,dd,jj,ii,jjj,iii,key,j;
uchar time1=0;
sbit led1=P2^0;
sbit led2=P2^1;
sbit ce=P2^4;
#define timer0_count 0xfc18//定时器初值,设置time0 1/1000秒中断一次
const seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管的显示
const seg_point[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//有小数点的数码管显示
uchar scan1;//用来分别显示2个数码管
uchar scan2;
uchar counter[2]={0xf1,0xf2};
uchar vout=0; //j_片选,vout_电压输出
static void timer0_initialize(void)//timer0的初始化
//定时器的初始化程序
{
EA=0; //中断控制器IE--停止接受中断
TR0=0; //停止计时
TMOD=0x01; //设置工作方式为1
TL0=(timer0_count & 0x00ff);
TH0=(timer0_count>>8); //设置time0 初值
PT0=1; //设置timer0高优先级
ET0=1; //允许timer0中断
TR0=1; //开始计时
EA=1; //开所有中断
}
void delay(uint t) //tms的延时
{
uchar i;
uint j;
for(j=0;j<t;j++)
for(i=0;i<40;i++);
}
void shuc(void)
{
uchar nn;
vout=2*(scan2*10+scan1);//输出的数字量
P1=vout;
for(nn=0;nn<250;nn++)
;
nn=0;//输出是存在D/A转换时间差所以要延时
}
void shaom(void)
{
P3=0x0f;//扫描是否有按键按下
if((P3&0x0f)!=0x0f)
dd=0;
else
dd=1;
}
void zdbj(void) //自动步进
{
uchar rr;
jj=scan2;
ii=scan1;
shaom();
for(;jj<10;jj++)
{
for(;ii<10;ii++)
{
if(dd)
{
scan1=ii;
scan2=jj;
shuc();
for(rr=0;rr<250;rr++)
{
shaom();
if(dd)
delay(70);
else
break;
}
if(jj==9&&ii==9)
{
ii=0;
jj=0;
}
}
else
{
jj=10;
ii=10;
}
}
ii=0;
}
jj=0;
shaom();
for(;dd==0;)
shaom();
}
void sjb(void) //三角波
{
uchar max;
max=vout;
shaom();
for(;dd;)
{
for(iii=0;iii<=max;iii=iii+2)
{
P1=iii;
shaom();
delay(10);
if(dd==0)
break;
}
if(dd==0)
break;
for(;iii>0;iii=iii-2)
{
P1=iii;
shaom();
delay(5);
if(dd==0)
break;
}
if(dd==0)
break;
}
P1=max;
shaom();
for(;dd==0;)
shaom();
}
unsigned char keyscan(void) //键盘扫描函数,使用行列反转扫描法
{
unsigned char cord_h,cord_l;//行列值中间变量
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(70); //去抖
if((P3&0x0f)!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值 ;;
while((P3&0xf0)!=0xf0);//等待松开并输出
{
time1=time1+1;
return(cord_h+cord_l);//键盘最后组合码值
}
}
}return(0); //返回该值
}
void timer0_isr(void) interrupt 1 //timer0中断
//用于LED数码管的动态显示
{
TR0=0; //停止时钟0
P2=counter[j];
switch(j)
{
case 0:P0=seg[scan1];break;
case 1:P0=seg_point[scan2];break;
default:break; //j为其他情况是跳出循环
}
j++;
if(j==2)
j=0;
TL0=(timer0_count & 0x00ff);
TH0=(timer0_count>>8); //设置time0 初值
TR0=1; //开时钟
}
void main(void)
{
ce=0;
delay(5);
scan1=(P3/2)%10;
scan2=P3/20;
ce=1;
delay(5);
shuc();
timer0_initialize(); //定时器初始化用于LED显示
do
{
key=keyscan();
if(time1==1)
switch( key)
{
case 0xee:aa=1;break;//1 按下相应的键显示相对应的码值
case 0xed:aa=2;break;
case 0xeb:aa=3;break;
case 0xe7:aa=4;break;//4
case 0xde:aa=5;break;//5
case 0xdd:aa=6;break;//5
case 0xdb:aa=7;break;//6
case 0xd7:aa=8;break;//7
case 0xbe:aa=9;break;//8
case 0xbd:aa=0;break;//9
case 0xbb:time1--;break;//确认
case 0xb7: //三角波
{
time1=0;
sjb();
}
break;
case 0x7e: //加
{
time1=0;
scan1++;
if(scan1==10)
{
scan1=0;
scan2++;
if(scan2==10)
scan2=0;
}
shuc();
}break;//c
case 0x7d: //减
{
time1=0;
scan1--;
if(scan1==-1)
{
scan1=9;
scan2--;
if(scan2==-1)
scan2=9;
}
shuc();
}break;
case 0x7b: //自动步进
{
time1=0;
zdbj();
}break;//e
case 0x77: time1--;break;
}
if(time1==2)
switch( key)
{
case 0xee:bb=1;break;//0 按下相应的键显示相对应的码值
case 0xed:bb=2;break;//1
case 0xeb:bb=3;break;//2
case 0xe7:bb=4;break;//3
case 0xde:bb=5;break;//4
case 0xdd:bb=6;break;//5
case 0xdb:bb=7;break;//6
case 0xd7:bb=8;break;//7
case 0xbe:bb=9;break;//8
case 0xbd:bb=0;break;//9
case 0xbb: //确认
{
scan2=0;
scan1=aa;
time1=0;
shuc();
}break;
case 0xb7://三角波
{
time1=0;
sjb();
}
break;
case 0x7e: //加
{
time1=0;
scan1++;
if(scan1==10)
{
scan1=0;
scan2++;
if(scan2==10)
scan2=0;
}
shuc();
}break;//c
case 0x7d: //减
{
time1=0;
scan1--;
if(scan1==-1)
{
scan1=9;
scan2--;
if(scan2==-1)
scan2=9;
}
shuc();
}break;
case 0x7b: //自动步进
{
time1=0;
zdbj();
}break;//e
case 0x77: time1--;break;
}
;
if(time1>2)
switch( key)
{
case 0xee:time1--;break;//0 按下相应的键显示相对应的码值
case 0xed:time1--;break;//1
case 0xeb:time1--;break;//2
case 0xe7:time1--;break;//3
case 0xde:time1--;break;//4
case 0xdd:time1--;break;//5
case 0xdb:time1--;break;//6
case 0xd7:time1--;break;//7
case 0xbe:time1--;break;//8
case 0xbd:time1--;break;//9
case 0xbb: //确认
{
time1=0;
scan2=aa;
scan1=bb;
time1=0;
shuc();
}break;
case 0xb7://三角波
{
time1=0;
sjb();
}
break;
case 0x7e: //加
{
scan1++;
if(scan1==10)
{
scan1=0;
scan2++;
if(scan2==10)
scan2=0;
}
shuc();
}break;//c
case 0x7d: //减
{
time1=0;
scan1--;
if(scan1==-1)
{
scan1=9;
scan2--;
if(scan2==-1)
scan2=9;
}
shuc();
} break;
case 0x7b: //自动步进
{
time1=0;
zdbj();
}break;//e
case 0x77: time1--;break;
}
}
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -