/**********************HJ-3G实验开发板例程************************ * 平台:HJ-3G V6.0 + Keil U3 + STC89C52 * 名称: * 公司:慧净电子科技有限公司 * 淘宝:http://shop37031453.taobao.com * 网站:www.hlmcu.com * 编写: * 日期:2008-8-08 * QQ : 121350852 398115088 * 晶振:11.0592MHZ * 说明:免费开源,不提供源代码分析,有问题直接到慧净论坛交流 * 论坛:http://hjdz.5d6d.com ****************************************************************** 程序功能:按下键盘矩阵后,在六个数码管上依次显示所按下的键所代表的数字。 按复位键可以清空显示为0 ******************************************************************/ #include #define uchar unsigned char uchar a0=16,b0=16,c0=16,d0=16,e0=16,f0=16,wei,temp,key,i,j,k; uchar a1, b1, c1, d1, e1, f1; uchar jia,jian,cheng,chu,dengyu,qianready,jia0,jian0,cheng0,chu0,qingling; uchar s0,s1,s2,s3,s4,s5; //参加运算的各个位 long qian,hou;//定义参于运算的第一个数和第二个数。 sbit en = P1^3; //片选及使能口定义 sbit dula=P1^4; sbit wela=P1^5; sbit beep=P2^3; /*共阴数码管码表*/ unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; void delay(uchar i) //延时函数 { for(j=i;j>0;j--) for(k=125;k>0;k--); } void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f) { en = 0; //使能 dula=0; P0=table[a]; //送 a 的段码 dula=1; dula=0; wela=0; //送位码,第1个数码管 P0=0xfe; wela=1; wela=0; delay(5); P0=table[b]; dula=1; dula=0; P0=0xfd; wela=1; wela=0; delay(5); P0=table[c]; dula=1; dula=0; P0=0xfb; wela=1; wela=0; delay(5); P0=table[d]; dula=1; dula=0; P0=0xf7; wela=1; wela=0; delay(5); P0=table[e]; dula=1; dula=0; P0=0xef; wela=1; wela=0; delay(5); P0=table[f]; dula=1; dula=0; P0=0xdf; wela=1; wela=0; delay(5); } void keyscan() { { P2=0xfe; //第一根行线置0 temp=P2; //读值 temp=temp&0xf0; //0xfe与0xf0位与,如果有键按下,则第一行的相应列线拉低,从而不等于0xf0 if(temp!=0xf0) //若不等于,说明有键按下 { delay(10); //延时消陡 if(temp!=0xf0) //确认是否有键按下 { temp=P2; //按下则读取P2口数值 switch(temp) //进行按键判断 { case 0xee: //若为第一列按下,则temp = 0xee,因为之前P2初始为0xfe,所以有此结果 key=0; //赋键值 wei++; //输入数字的位数标志(是几位数) break; case 0xde: key=1; wei++; break; case 0xbe: key=2; wei++; break; case 0x7e: key=3; wei++; break; } while(temp!=0xf0) //不知道啥意思,前面已经读取P2的值了,再怎么着也不可能是0xf0 { temp=P2; temp=temp&0xf0; beep=0; } beep=1; } } P2=0xfd; //进行 行线2的判断,与前同 temp=P2; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P2; //读取键值 switch(temp) //进行按键判断 { case 0xed: key=4; wei++; break; case 0xdd: key=5; wei++; break; case 0xbd: key=6; wei++; break; case 0x7d: key=7; wei++; break; } while(temp!=0xf0) //不懂 { temp=P2; temp=temp&0xf0; beep=0; } beep=1; } } P2=0xfb; //进行行线3的判断,同上 temp=P2; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P2; switch(temp) { case 0xeb: key=8; wei++; break; case 0xdb: key=9; //键值到9止, wei++; break; case 0xbb: qingling=1; //10号键为清0功能 //key=10; //wei++; break; case 0x7b: dengyu=1; //11号键为 等于 功能 //key=11; //wei++; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; } } P2=0xf7; //进行行线4的判断 temp=P2; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P2; switch(temp) { case 0xe7: //12号键为 相加 功能 jia=1; //key=12; // wei++; break; case 0xd7: //13号键为 相减 功能 jian=1; //key=13; //wei++; break; case 0xb7: //14号键为 相乘 功能 cheng=1; //key=14; //wei++; break; case 0x77: //15号键为 相除 功能 chu=1; //key=15; //wei++; break; } while(temp!=0xf0) { temp=P2; temp=temp&0xf0; beep=0; } beep=1; } } } } void display0() //显示函数 { if(key!=20) //???key最大只到9啊 { switch(wei) //显示位置 { case 1: a0=key; // a1 = key; b0=16; //16即为0x00,后续数码管全灭! c0=16; d0=16; e0=16; f0=16; break; case 2: a0=key; b0 = a1; b1 = key; c0=16; d0=16; e0=16; f0=16; break; case 3: a0=key; b0 = b1; c0 = a1; c1 = key; d0=16; e0=16; f0=16; break; case 4: a0=key; //b0 = c1; b0 = c1; c0 = b1; d0 = a1; d1 = key; e0=16; f0=16; break; case 5: a0=key; b0 = d1; c0 = c1; d0 = b1; e0 = a1; e1 = key; f0=16; break; case 6: a0=key; b0 = e1; c0 = d1; d0 = c1; e0 = b1; f0 = a1; //wei=0; break; } key=20; //用以判断是否键值改变 } display(a0,b0,c0,d0,e0,f0); //display(f0,e0,d0,c0,b0,a0); if(a0!=16) s5=a0; //如果a0亮灯,则a0为最高位 if(b0!=16) s4=b0; //如果b0亮灯,则b0为次高位 if(c0!=16) s3=c0; if(d0!=16) s2=d0; if(e0!=16) s1=e0; if(f0!=16) s0=f0; } void jieguo() //运算结果 { switch(wei) //以数值的位数来计算数值大小 { case 6: //共有6位数,计算数值是多少 hou=s5*100000+s4*10000+s3*1000+s2*100+s1*10+s0;break; case 5: //有5位数,则计算5位的数值,即最高位 乘10^4 方 hou=s5*10000+s4*1000+s3*100+s2*10+s1;break; case 4: hou=s5*1000+s4*100+s3*10+s2;break; case 3: hou=s5*100+s4*10+s3;break; case 2: hou=s5*10+s4;break; case 1: hou=s5;break; } wei=0; //数值的位数清0 s0=0;s1=0;s2=0;s3=0;s4=0;s5=0;//6个位的计算值清0 } void fenwei() { if(hou<10) { a0=hou;b0=16;c0=16;d0=16;e0=16;f0=16; } else { if(hou<100) {a0=hou/10;b0=hou%10;c0=16;d0=16;e0=16;f0=16;} else { if(hou<1000) {a0=hou/100;b0=hou%100/10;c0=hou%10;d0=16;e0=16;f0=16;} else { if(hou<10000) {a0=hou/1000;b0=hou%1000/100;c0=hou%100/10;d0=hou%10;e0=16;f0=16;} else { if(hou<100000) {a0=hou/10000;b0=hou%10000/1000;c0=hou%1000/100;d0=hou%100/10;e0=hou%10;f0=16;} else { if(hou<1000000) {a0=hou/100000;b0=hou%100000/10000;c0=hou%10000/1000;d0=hou%1000/100;e0=hou%100/10;f0=hou%10;} } } } } } display(a0,b0,c0,d0,e0,f0); P1=hou; } void main() { uchar gongneng,yunsuan; while(1) { keyscan(); gongneng=jia|jian|cheng|chu|dengyu|qingling; //加减乘除、清0只要有一个按下,就进行后续处理 if(gongneng==0) //如果没有功能键按下,则进行键值显示 { display0(); } else //否则只要加减乘除有一个按下,就进行运算处理 { yunsuan=jia|jian|cheng|chu; if(yunsuan) //如果有运算键按下 { a0=16; //6个位全灭 b0=16; c0=16; d0=16; e0=16; f0=16; //wei=0; if(jia) //如果 加 按下 { jia=0; jia0=1;jian0=0;cheng0=0;chu0=0; if(qianready) //判断是否已经输入了一个数值 { jieguo(); //若输入了一个数值,则读取此数值 hou=hou+qian; //前后两数相加 fenwei(); } } if(jian) { jian=0;jia0=0;jian0=1;cheng0=0;chu0=0; jieguo(); hou=qian-hou; fenwei(); } if(cheng) { cheng=0;jia0=0;jian0=0;cheng0=1;chu0=0; jieguo(); hou=qian*hou; fenwei(); } if(chu) { chu=0; jia0=0;jian0=0;cheng0=0;chu0=1; jieguo(); hou=qian/hou; fenwei(); } if(qianready==0) { switch(wei) { case 6: qian=s5*100000+s4*10000+s3*1000+s2*100+s1*10+s0;break; case 5: qian=s5*10000+s4*1000+s3*100+s2*10+s1;break; case 4: qian=s5*1000+s4*100+s3*10+s2;break; case 3: qian=s5*100+s4*10+s3;break; case 2: qian=s5*10+s4;break; case 1: qian=s5;break; } qianready=1; } wei=0; s0=0;s1=0;s2=0;s3=0;s4=0;s5=0; display(a0,b0,c0,d0,e0,f0); //P1=0x55; } if(dengyu) { dengyu=0; //display(16,16,16,16,16,16); jieguo(); if(jia0) {jia0=0; hou=qian+hou;} if(jian0) {jian0=0; hou=qian-hou;} if(cheng0) {cheng0=0; hou=qian*hou;} if(chu0) {chu0=0; hou=qian/hou;} fenwei(); } if(qingling) { a0=16;b0=16;c0=16;d0=16;e0=16;f0=16; s0=0;s1=0;s2=0;s3=0;s4=0;s5=0; jia=0;jian=0;cheng=0;chu=0; jia0=0;jian0=0;cheng0=0;chu0=0; qingling=0;dengyu=0; qian=0;hou=0; display(a0,b0,c0,d0,e0,f0); } } } }