如题,求大神帮写程序,键盘包括0~9十个数字按键以及加减乘除等号五个运算符按键和shift按键,实现按下shift与其他某一运算符按键后实现拓展功能:括号功能(包括左括号与右括号两个按键)、开方功能、清屏功能、十进制二进制转换功能
若是不好实现的话请先发实现加减乘除等号清屏的程序
比较赶时间急求!感谢大神们~
再附上电路图
没æ液æ¶çï¼ä»¥ååäºä¸ä¸ªæä¸ä¸ªæ°ç 管çï¼åç»ä½ ä¾åèã
#include<reg51.h>
#define uchar unsigned char;
uchar LED1,LED2,LED3,LED4;
uchar keyval,calflag,s_dat,d_dat;
uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
unsigned int number,r_dat;
void delay(unsigned int a)
{
unsigned int i,j;
for(i=0;i<a;i++)
for(j=0;j<1000;j++);
}
void dealdat()
{
switch(calflag)
{
case 0:
r_dat=s_dat+d_dat;
break;
case 1:
r_dat=s_dat-d_dat;
break;
case 2:
r_dat=s_dat*d_dat;
break;
case 3:
r_dat=s_dat/d_dat;
break;
default:break;
}
LED1=(r_dat/1000)%10;
LED2=(r_dat/100)%10;
LED3=(r_dat/10)%10;
LED4=r_dat%10;
}
uchar kbscan(void)
{
unsigned char sccode,recode;
P3=0x0f; //å0æ«æ,å线è¾å
¥
if ((P3 & 0x0f) != 0x0f) //æé®æä¸
{
delay(20); //延æ¶å»æå¨
if ((P3&0x0f)!= 0x0f)
{
sccode = 0xef; //éè¡æ«æåå¼
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return 0; //æ é®æä¸ï¼è¿å0
}
void getkey(void)
{
unsigned char key;
key=kbscan();
if(key==0){keyval=0xff;return;}
switch(key)
{
case 0x11:keyval=7;break;
case 0x12:keyval=4;break;
case 0x14:keyval=1;break;
case 0x18:keyval=10;break;
case 0x21:keyval=8;break;
case 0x22:keyval=5;break;
case 0x24:keyval=2;break;
case 0x28:keyval=0;break;
case 0x41:keyval=9;break;
case 0x42:keyval=6;break;
case 0x44:keyval=3;break;
case 0x48:keyval=11;break;
case 0x81:keyval=12;break;
case 0x82:keyval=13;break;
case 0x84:keyval=14;break;
case 0x88:keyval=15;break;
default:keyval=0xff;break;
}
}
void t0isr() interrupt 1
{
TH0=0xf4;
TL0=0x48;
switch(number)
{
case 0:P2=0x04;P0=distab[LED1];break;
case 1:P2=0x08;P0=distab[LED2];break;
case 2:P2=0x01;P0=distab[LED3];break;
case 3:P2=0x02;P0=distab[LED4];break;
default:break;
}
number++;
if(number>3)number=0;
}
main()
{
TMOD = 0x01;
number = 0;
TH0=0xf4;
TL0=0x48;
TR0=1;
ET0=1;
EA=1;
LED1=0;
LED2=0;
LED3=0;
LED4=0;
while(1)
{
getkey();
switch(keyval)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
LED3=LED4;
LED4=keyval;
LED1=0;
LED2=0;
break;
case 10:break; //"ON"
case 11: //"="
d_dat=LED3*10+LED4;
dealdat();
break;
case 12: //"/"
calflag=3;
s_dat=LED3*10+LED4;
LED3=0;
LED4=0;
break;
case 13: //"*"
calflag=2;
s_dat=LED3*10+LED4;
LED3=0;
LED4=0;
break;
case 14: //"-"
calflag=1;
s_dat=LED3*10+LED4;
LED3=0;
LED4=0;
break;
case 15: //"+"
calflag=0;
s_dat=LED3*10+LED4;
LED3=0;
LED4=0;
break;
default:break;
}
}
}
é¢ï¼è¯·é®æ°ç 管è·æ¶²æ¶è½¯ä»¶ä¸åºè¯¥æ²¡åºå«å§ï¼
追çæç¹åºå«ï¼å¦æ液æ¶ä¸å¸¦ååºçè¯ï¼æ¾ç¤ºçå符éè¦èªå·±åç¹éµãç°å¨æä¸æ²¡æç°æçï¼ä»¥ååçä¸å¨æè¾¹ã
追é®é¢ï¼ä½ çè½ä¸è½ç»å¼å¼
追çå°è¿æ®µ1602驱å¨ç¨åºç»ä½ ï¼èªå·±è°è¯å§ã
#define lcd_FLAG
#define lcd_PORT P0
#include
#include
#define int8u unsigned char/?
sbit lcd_rs=P2^4;
sbit lcd_e=P2^3;
sbit lcd_rw=P2^0;
sbit lcd_busy=P0^7;
void lcd_CheckBusy()
{
do
{
lcd_busy=1;
lcd_rs=0;
lcd_rw=1;
lcd_e=0;
lcd_e=1;
}
while(lcd_busy);
}
void lcd_WCmd(const INT8U cmd)
{
lcd_CheckBusy();
lcd_rs=0;
lcd_rw=0;
lcd_e=1;
lcd_PORT=cmd;
lcd_e=0;
}
void lcd_WData(const INT8U c)
{
lcd_CheckBusy();
lcd_rs=1;
lcd_rw=0;
lcd_e=1;
lcd_PORT=c;
lcd_e=0;
}
void lcd_Init()
{
lcd_WCmd(0x38); //æ¾ç¤ºæ¨¡å¼ä¸º8ä½2è¡5*7ç¹éµ
lcd_WCmd(0x0f); //display enable,flag enable,flash enable,
lcd_WCmd(0x06); //flag move to right,screen don't move
lcd_WCmd(0x01); //clear screen
}
void lcd_Display(const INT8U *ptr)
{
INT8U data i=0;
INT8U *data q;
q=ptr;
lcd_WCmd(0x80);
while(q!=NULL && (*q!='\0') && i=16 && i<32)
{
lcd_WData(*q);
q++;
i++;
}
}
}
用 PROTEUS 软件仿真的:
额,由于我们器材有限没有门电路,另外能不能给出具体程序
追答器材?
难道楼主想要制作实物样机?
搞制作,对动手能力,有些要求,一般应该从简单的项目开始练习。
本电路,有些复杂,如果出来异常情况,排错,较难。
-----------
如果侧重于编程,用软件仿真,即可,不用搞硬件制作。
PROTEUS 就是常用的仿真软件。
上图的电路,就是该软件附带的例子。
安装了 PROTEUS 软件之后,你即可找到它们,包括程序。
看看我的百度空间吧,实例多的很。
我就是在制作实物样机,电路已焊好就等程序了……
追答哦,可以先试试时钟、日历这些程序。
这样的项目,数据都是确定性的,显示位置,也比较固定,容易成功。
而计算器的数据,都是现场操作,随机性较强,程序,就很容易出错。