| 
 23. 模拟计算器数字输入及显示  1. 实验任务  (1. 开机时,显示“0”  (2. 第一次按下时,显示“D1”;第二次按下时,显示“D1D2”;第三按下时,显示“D1D2D3”,8个全显示完毕,再按下按键下时,给出“嘀”提示音。  2. 电路原理图  file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps886C.tmp.png 图4.23.1  3. 系统板上硬件连线  (1. 把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上;  (2. 把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;  (3. 把“单片机系统”区域中的P0.0-P0.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;  (4. 把“单片机系统:区域中的P2.0-P2.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;  4. 相关程序设计内容  (1. 行列式键盘输入及按键功能设定;  (2. 动态数码显示;  (3. 数码显示方式处理; 
5. 汇编源程序 
(略) 
6. C语言源程序 
#include <AT89X51.H> 
 
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,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; 
unsigned char dispbuf[8]={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(count>0) 
{ 
*(p+count)=*(p+count-1); 
count--; 
} 
} 
 
void 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;i>0;i--) 
for(j=200;j>0;j--); 
temp=P3; 
temp=temp & 0x0f; 
if (temp!=0x0f) 
{ 
temp=P3; 
temp=temp & 0x0f; 
switch(temp) 
{ 
case 0x0e: 
key=7; 
break; 
case 0x0d: 
key=8; 
break; 
case 0x0b: 
key=9; 
break; 
case 0x07: 
key=10; 
break; 
} 
if ((key>=0) && (key<10)) 
{ 
keypos++; 
if(keypos<8) 
{ 
change(dispbuf,keypos); 
dispbuf[0]=key; 
} 
else 
{ 
keypos=8; 
alarmflag=1; 
} 
} 
temp=P3; 
P1_0=~P1_0; 
temp=temp & 0x0f; 
while(temp!=0x0f) 
{ 
temp=P3; 
temp=temp & 0x0f; 
} 
alarmflag=0; 
} 
} 
 
P3=0xff; 
P3_5=0; 
temp=P3; 
temp=temp & 0x0f; 
if (temp!=0x0f) 
{ 
for(i=50;i>0;i--) 
for(j=200;j>0;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; 
case 0x07: 
key=11; 
break; 
} 
if ((key>=0) && (key<10)) 
{ 
keypos++; 
if(keypos<8) 
{ 
change(dispbuf,keypos); 
dispbuf[0]=key; 
} 
else 
{ 
keypos=8; 
alarmflag=1; 
} 
} 
temp=P3; 
P1_0=~P1_0; 
temp=temp & 0x0f; 
while(temp!=0x0f) 
{ 
temp=P3; 
temp=temp & 0x0f; 
} 
alarmflag=0; 
} 
} 
 
P3=0xff; 
P3_6=0; 
temp=P3; 
temp=temp & 0x0f; 
if (temp!=0x0f) 
{ 
for(i=50;i>0;i--) 
for(j=200;j>0;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) && (key<10)) 
{ 
keypos++; 
if(keypos<8) 
{ 
change(dispbuf,keypos); 
dispbuf[0]=key; 
} 
else 
{ 
keypos=8; 
alarmflag=1; 
} 
} 
temp=P3; 
P1_0=~P1_0; 
temp=temp & 0x0f; 
while(temp!=0x0f) 
{ 
temp=P3; 
temp=temp & 0x0f; 
} 
alarmflag=0; 
} 
} 
 
P3=0xff; 
P3_7=0; 
temp=P3; 
temp=temp & 0x0f; 
if (temp!=0x0f) 
{ 
for(i=50;i>0;i--) 
for(j=200;j>0;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) && (key<10)) 
{ 
keypos++; 
if(keypos<8) 
{ 
change(dispbuf,keypos); 
dispbuf[0]=key; 
} 
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=dispcode[dispbuf[dispbitcount]]; 
P2=dispbitcode[dispbitcount]; 
dispbitcount++; 
if (dispbitcount==8) 
{ 
dispbitcount=0; 
} 
if (alarmflag==1) 
{ 
P1_1=~P1_1; 
} 
}    
 |