1、23模拟计算器数字输入及显示23 模拟计算器数字输入及显示1 实验任务 (1 开机时,显示“0”(2 第一次按下时,显示“D1”;第二次按下时,显示“D1D2”;第三按下时,显示“D1D2D3”,8个全显示完毕,再按下按键下时,给出“嘀”提示音。2 电路原理图 图4.23.13 系统板上硬件连线 (1 把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上;(2 把“单片机系统“区域中的P3.0P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1C4R1R4端口上;(3 把“单片机系统”区域中的P0.0P0.7端口用8芯排线连接到“动态数码显示”区域
2、中的AH端口上;(4 把“单片机系统:区域中的P2.0P2.7端口用8芯排线连接到“动态数码显示”区域中的S1S8端口上;4 相关程序设计内容 (1 行列式键盘输入及按键功能设定;(2 动态数码显示;(3 数码显示方式处理;5 汇编源程序 (略)6 C语言源程序 #include unsigned char code dispcode=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00; unsigned char code dispbitcode=0xfe,0xfd,0xf
3、b,0xf7,0xef,0xdf,0xbf,0x7f; unsigned char dispbuf8=0,16,16,16,16,16,16,16; unsigned char dispbitcount; unsigned char temp; unsigned char i,j; unsigned char key; unsigned char keypos; bit alarmflag; void change(unsigned char *p,unsigned char count) while(count0) *(p+count)=*(p+count-1); count-; void
4、main(void) TMOD=0x01; TH0=(65536-4000) / 256; TL0=(65536-4000) % 256; TR0=1; ET0=1; EA=1; while(1) P3=0xff; P3_4=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) for(i=50;i0;i-) for(j=200;j0;j-); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: key=7; break;
5、 case 0x0d: key=8; break; case 0x0b: key=9; break; case 0x07: key=10; break; if (key=0) & (key10) keypos+; if(keypos0;i-) for(j=200;j0;j-); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: key=4; break; case 0x0d: key=5; break; case 0x0b: key=6; break; ca
6、se 0x07: key=11; break; if (key=0) & (key10) keypos+; if(keypos0;i-) for(j=200;j0;j-); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: key=1; break; case 0x0d: key=2; break; case 0x0b: key=3; break; case 0x07: key=12; break; if (key=0) & (key10) keypos+;
7、 if(keypos0;i-) for(j=200;j0;j-); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: key=0; break; case 0x0d: key=13; break; case 0x0b: key=14; break; case 0x07: key=15; break; if (key=0) & (key10) keypos+; if(keypos8) change(dispbuf,keypos); dispbuf0=key;
8、else keypos=8; alarmflag=1; temp=P3; P1_0=P1_0; temp=temp & 0x0f; while(temp!=0x0f) temp=P3; temp=temp & 0x0f; alarmflag=0; void t0(void) interrupt 1 using 0 TH0=(65536-4000) / 256; TL0=(65536-4000) % 256; P0=dispcodedispbufdispbitcount; P2=dispbitcodedispbitcount; dispbitcount+; if (dispbitcount=8) dispbitcount=0; if (alarmflag=1) P1_1=P1_1;