📄 jisuanqu.c
字号:
/*键盘输入数据完成乘法计算程序*/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit pclk = P0 ^ 2;
sbit sdata =P0 ^ 3;
sbit smg4 = P0 ^ 7;
sbit smg3 = P0 ^ 6;
sbit smg2 = P0 ^ 5;
sbit smg1 = P0 ^ 4;
uchar idata disp[ 4 ];
code uchar dispcode[10] = {0xb7,0x90,0x3d,0xb9,0x9a,
0xab,0xaf,0xb0,0xbf,0xbb};//数码管对应的顺序码
/* 名称: delay1ms
* 说明:
* 功能: 延时
* 调用:_nop_
* 输入: 延时长短数据
* 返回值: 无*/
void delay1ms(uchar j)//延迟1MS
{
uchar i;
while(j)
{
for( i = 248; i > 0; i-- )
{
_nop_( );//延时
_nop_( );
}
j--;
}
}
/* 名称: send_0
* 说明:
* 功能:把一个字节按段的顺序送到数码管显示
* 调用:
* 输入:要显示的十六进制码
* 返回值: 无*/
void send_0(uchar ch)
{
uchar i;
for(i=0;i<8;i++)
{
pclk = 0;
ch<<=1; //右移一位
sdata = CY;
pclk = 1;
pclk = 0;
}
}
/*
*名称:senf_f
* 说明:
* 功能:发送四字节到数码管
* 调用:send_0()
* 输入: 四位要显示得的数值
* 返回值: 无*/
void sent_f(uchar s3,uchar s2,uchar s1,uchar s0)
{
P0 = 0x00; //初始化
send_0(dispcode[s3]);//第一个数码管显示
smg1 = 1;
delay1ms(1);// 延时
P0 = 0x00;
send_0(dispcode[s2]);//第二个数码管显示
smg2 = 1;
delay1ms(1);
P0 = 0x00;
send_0(dispcode[s1]);//第三个数码管显示
smg3 = 1;
delay1ms(1);
P0 = 0x00;
send_0(dispcode[s0]);//第四个数码管显示
smg4 = 1;
delay1ms(1);
P0 = 0x00;
}
/*名称: sure_disk
* 说明:
* 功能: 按键识别
* 调用:sent_f()
* 输入:
* 返回值: 按键对应的数值*/
uchar sure_disk()
{
uchar j;
uchar key,keyvalue;
uchar sccode,recode;
P2=0x0f; /*发0行扫描码*/
if((P2 & 0x0f)!= 0x0f) /*若有键按下*/
{
delay1ms(1); //去抖
if((P2&0x0f)!= 0x0f) /*逐行扫描初值*/
{
sccode=0xfe;
for(j=4;j>0;j--)
{
while((sccode&0x10)!=0)
{
P2=sccode; /*输出行扫描码*/
if((P2&0xf0)!=0xf0) /*本行有键按下*/
{
recode=(P2&0xf0)|0x0f;
key=((~sccode)+(~recode)); /*返回特征字节码*/
}
else
sccode=(sccode<<1)|0x01; /*行扫描码左移一位*/
}
}
}
}
switch(key) //判断键特征值
{
case 0x88: keyvalue=0;
break;
case 0x84: keyvalue=1;
break;
case 0x82: keyvalue=2;
break;
case 0x81: keyvalue=3;
break;
case 0x48: keyvalue=4;
break;
case 0x44: keyvalue=5;
break;
case 0x42: keyvalue=6;
break;
case 0x41: keyvalue=7;
break;
case 0x28: keyvalue=8;
break;
case 0x24: keyvalue=9;
break;
case 0x22: keyvalue=10;
break;
case 0x21: keyvalue=11;
break;
case 0x18: keyvalue=12;
break;
case 0x14: keyvalue=13;
break;
case 0x12: keyvalue=14;
break;
case 0x11: keyvalue=15;
break;
default: keyvalue=16; //无键按下,返回0值
break;
}
return(keyvalue);
}
/*主函数*/
void main ( void )
{
uchar j,a=0;
char i;
uint add,c1,c2;
for(j=0;j<4;j++)//赋初值
disp[j]=0;
sent_f(disp[0],disp[1],disp[2],disp[3]);
j=2;
while(1)
{
P2=0xf0;
if((P2&0xf0)!=0xf0)//判断是否有按键
{
delay1ms(1);//延时
if((P2&0xf0)!=0xf0)//判断是否有按键
{
if(sure_disk()<10)//判断返回数值
{ if(a==0)
disp[3]=sure_disk();
if(a==1)
{
a=0;
disp[2]=disp[3];
disp[3]=sure_disk();
}a++;
}
if(sure_disk()==10)
{
c1=disp[2]*10+disp[3];//存储数据
for(i=3;i>=0;i--)
disp[i]=0;
}
if(sure_disk()==11)
{
c2=disp[2]*10+disp[3];
for(i=3;i>=0;i--)
disp[i]=0;
add=c1*c2;
disp[0]=add/1000;
disp[1]=(add/100)%10;
disp[2]=(add/10)%10;
disp[3]=add%10;
}
}
}
sent_f(disp[0],disp[1],disp[2],disp[3]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -