程序放在了压缩包里,我是用c语言写的,要求是要使用8255,但我可能还是不太会用,我把代码贴在下面了,求大佬相助~
- #include <stdio.h>
- #include <reg51.h>
- #include <intrins.h>
- #include <math.h>
- #include <ctype.h>
- #include <absacc.h>
- #define PA PBYTE[0X00]
- #define PB PBYTE[0X20]
- #define Cont PBYTE[0X60]
- #define E 1000000
- #define uchar unsigned char
- #define uint unsigned int
- #define Lint unsigned long int
- uchar operand1[7], operand2[7]; /* 操作数 */
- uchar operator; /* 操作符 */
-
- Lint number(uchar* );//将字符串化为整数
- uchar keyscan(); //键盘扫描
- void buf(Lint value); //更新显示缓存
- void disp(void);//显示
- void delay(uint);//延时
- Lint compute(Lint va1,Lint va2,uchar opera);//运算
- uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};
- uchar dbuf[6] = {16,16,16,16,16,16}; /* 显示缓存 */
- /* 延时函数 */
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*******************************************
- 键盘扫描程序
- 将按键转化为字符并作为输出
- ','#'分别表示清零键和没有键按下
- *******************************************/
-
- uchar keyscan()
- {
- uchar key;/* 按键值标记变量 */
-
- P1=0xfe; //扫描键盘第1行
- while((P1 & 0xf0) != 0xf0) /* 有按键按下 */
- {
- delay(3); /* 去抖动延时 */
- while((P1 & 0xf0) != 0xf0) /* 再次确认 */
- {
- switch(P1)
- {
- case 0xee: key='7';break;
- case 0xde: key='8';break;
- case 0xbe: key='9';break;
- case 0x7e: key='/';break;
- default: key='#';
- }
- while((P1&0xf0)!=0xf0);
- }
- }
-
- P1=0xfd; //扫描键盘第2行
- while((P1 & 0xf0) != 0xf0) /* 有按键按下 */
- {
- delay(3); /* 去抖动延时 */
- while((P1 & 0xf0) != 0xf0) /* 再次确认 */
- {
- switch(P1)
- {
- case 0xed: key='4';break;
- case 0xdd: key='5';break;
- case 0xbd: key='6';break;
- case 0x7d: key='*';break;
- default: key='#';
- }
- while((P1&0xf0)!=0xf0);
- }
- }
-
- P1=0xfb; //扫描键盘第3行
- while((P1 & 0xf0) != 0xf0) /* 有按键按下 */
- {
- delay(3); /* 去抖动延时 */
- while((P1 & 0xf0) != 0xf0) /* 再次确认 */
- {
- switch(P1)
- {
- case 0xeb: key='1';break;
- case 0xdb: key='2';break;
- case 0xbb: key='3';break;
- case 0x7b: key='-';break;
- default: key='#';
- }
- while((P1&0xf0)!=0xf0);
- }
- }
-
- P1=0xf7; //扫描键盘第4行
- while((P1 & 0xf0) != 0xf0) /* 有按键按下 */
- {
- delay(3); /* 去抖动延时 */
- while((P1 & 0xf0) != 0xf0) /* 再次确认 */
- {
- switch(P1)
- {
- case 0xe7: key=';break;
- case 0xd7: key='0';break;
- case 0xb7: key='=';break;
- case 0x77: key='+';break;
- default: key='#';
- }
- while((P1&0xf0)!=0xf0);
- }
- }
-
- return key;
-
- }
- void main()
- {
-
- Lint value1, value2, result; /* 数值1,数值2,结果 */
- uchar ckey, cut1 = 0, cut2 = 0; /* ckey键盘输入字符 */
- uchar operator; /* 运算符 */
- uchar i, bool = 0, t=0 ;
- Cont=0x81;
- P1=0xff;
- init:
- buf(0);//初始化
- disp();
- value1=value2=0 ;
- result = 0;
- cut1 = cut2 = 0;
- bool = 0; /*操作数标识符*/
-
- t = 0 ; /*连续运算*/
-
- for(i = 0;i < 7;i++)
- {
- operand1[i] = '\0';
- operand2[i] = '\0';
- } /* 初始化 */
-
- while(1)
- {
- ckey=keyscan();//读键盘值
- if(ckey!='#')
- {
- if(isdigit(ckey))/* isdigit函数,字符是阿拉伯数字返回非0值,否则返回0 */
- {
- switch(bool)
- {
- case 0:
- if(cut1>5)
- {
- value1=E;buf(value1);disp();break;
- }
- operand1[cut1] = ckey;
- operand1[cut1+1] = '\0';
- value1 = number(operand1); /* 将字符串转化为整数 */
- cut1++;
- buf(value1);
- disp();
- break;
- case 1:
- if(cut2 > 5)
- {
- value2 = E ; buf(value2); disp() ; break ;
- }
- t = 1 ;
- operand2[cut2] = ckey;
- operand2[cut2+1] = '\0';
- value2 = number(operand2);
- cut2++;
- buf(value2);
- disp();
- break;
- default: break;
- }
- }
- else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/')
- {
- bool=1;
- if(t==1) //判断是否为连续运算
- {
- value1=compute(value1,value2,operator); /* 显示上一步运算结果 */
- cut2 = 0 ;
- }
- buf(value1);
- disp();
- operator = ckey;
- //s = 0 ;
- }
- else if(ckey=='=') //计算结果
- {
- result= compute(value1,value2,operator);
- buf(result);
- disp();
- while(1)
- {
- ckey=keyscan();
- if(ckey==') //若按下清零键跳回开始
- goto init;
- else{
- buf(result);
- disp();
- }
- }
- }
- else if(ckey==') //若按下清零键跳回开始
- {
- goto init;
- }
- }
- disp();
- }
- }
- /******************************************
- number函数
- 将字符串转化为整数
- *******************************************/
- Lint number(uchar operand[] )
- {
- Lint n=0, i, j ;
- for(i=0 ; i<6 ; i++ )
- {
- if(operand[i]=='\0'){ break ; }
- n=n*10 ;
- j=operand[i]-'0' ;
- n=n+j ;
- }
- return n ;
- }
- /******************************************
- 运算函数
- 输入:操作数和操作符
- 输出:计算结果
- *******************************************/
- Lint compute(Lint va1,Lint va2,uchar opera)
- {
- Lint result;
- switch(opera)
- {
- case '+':
- result=va1+va2;
- break;
- case '-':
- if(va1<va2){
- result=E;
- break;
- }
- else{
- result=va1-va2;
- break;
- }
- case '*':
- result=va1*va2;
- break;
- case '/':
- if(va2==0){
- result=E;
- break;
- }
- else{
- result=va1/va2;
- break;
- }
- default:
- result=E;
- break;
- }
- return result;
- }
- /*******************************************
- 更新显示缓存
- 输入:无符号整数
- 输出:将输入送入显示缓存,溢出或出错显示E
- *******************************************/
- void buf(Lint value)
- {
- uchar i;
- if(value==0)
- {
- dbuf[5]=0;
- i=4;
- }
- else if(value==E||value>99999)
- {
- dbuf[5]=15;///////////////////////////////////////
- i=4;
- }
- else{
- for(i=5;value>0;i--){
- dbuf[i]=value%10;
- value/=10;
- }
- }
- for(i=i+1;i>0;i--){
- dbuf[i-1]=16;
- }
- }
- /*******************************************
- 显示函数
- *******************************************/
- void disp(void)
- {
- uchar i,j;
- i=0xfe;
- for(j=0;j<6;j++)
- {
- PB=i;
- PA=table[dbuf[j]];
- i=_crol_(i,1);
- delay(3);
- PA=0xff;
- }
- }
复制代码 |