1.数码管显示
PIC驱动数码码的电路图及仿真结果如下图所示:
程序清单如下:
#include
#defineucharunsignedchar
#defineuintunsignedint
__CONFIG(0x3B31);
voiddelay(uintx)
{
uinta,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
voidmain()
{
TRISB=0;
TRISD=0;
while(1)
{
PORTB=0x01;//00111000
PORTD=0x5b;
delay(1);
PORTB=0x02;//00111000
PORTD=0x4f;
delay(1);
PORTB=0x04;//00111000
PORTD=0x66;
delay(1);
PORTB=0x08;//00111000
PORTD=0x6d;
delay(1);
PORTB=0x10;//00111000
PORTD=0x7d;
delay(1);
PORTB=0x20;//00111000
PORTD=0x06;
delay(1);
}
}
出现问题:在使用ULN2003进行仿真的时候,没有出现预期的结果,这也许是软件仿真的不
稳定造成的,在实际的硬件电路设计中,驱动芯片是一定要有的。另外在仿真的时候,片选信号
使用RA口时,RA4不怎么怎么的,输出总是高阻态。换成RB口后没有出现这样的问题。
2.独立键盘与蜂鸣器及数码管综合实验
独立键盘电路如下图所示,蜂鸣器电路如图(2.3)所示,数码管电路参见图(2.1)。该实
验实验的效果是:当按键K1按下时,蜂鸣器“滴”一声,同时数码管位1变为1,当按键K2按下
时,蜂鸣器“滴”两声,同时数码管1变为2......当按键K4按下时,蜂鸣器“滴”四声,同时数码
管1变为4。
程序清单如下:
#include
#defineucharunsignedchar
#defineuintunsignedint
__CONFIG(0x3B31);
constuchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
ucharkey_num;
voiddelay(uintx);
voidinit();
voidscan();
voiddidi(ucharnum);
voiddisp(ucharnum1,ucharnum2,ucharnum3,ucharnum4,ucharnum5,ucharnum6);
voidmain()
{
init();
while(1)
{
scan();
disp(key_num,2,3,4,5,6);
}
}
voiddelay(uintx)
{
uinta,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
voidinit()
{
TRISB=0xff;
TRISD=0;
TRISA=0;
TRISE0=0;
RE0=0;
PORTD=0;
PORTA=0;
}
voidscan()
{
if(RB0==0)
{
delay(10);
if(RB0==0)
{
didi(1);
while(!RB0)
{
disp(key_num,2,3,4,5,6);
key_num=1;//PORTD=0x01;
}
}
}
if(RB1==0)
{
delay(10);
if(RB1==0)
{
didi(2);
while(!RB1)
{
disp(key_num,2,3,4,5,6);
key_num=2;//PORTD=0x02;}
}
}
}
if(RB2==0)
{
delay(10);
if(RB2==0)
{
didi(3);
while(!RB2)
{
disp(key_num,2,3,4,5,6);
key_num=3;//PORTD=0x04;
}
}
}
if(RB3==0)
{
delay(10);
if(RB3==0)
{
didi(4);
while(!RB3)
{
disp(key_num,2,3,4,5,6);
key_num=4;//PORTD=0x08;
}
}
}
}
voiddidi(ucharnum)
{
uchardi_num;
for(di_num=num;di_num>0;di_num--)
{
RE0=1;
delay(50);
RE0=0;
delay(20);
}
}
voiddisp(ucharnum1,ucharnum2,ucharnum3,ucharnum4,ucharnum5,ucharnum6)
{
PORTD=table[num1];//显示第一个数码管
PORTA=0x20;//00100000
delay(2);
PORTD=table[num2];//显示第二个数码管
PORTA=0x10;//00010000
delay(2);
PORTD=table[num3];//显示第三个数码管
PORTA=0x08;//00001000
delay(2);
PORTD=table[num4];//显示第四个数码管
PORTA=0x04;//00000100
delay(2);
PORTD=table[num5];//显示第五个数码管
PORTA=0x02;//00000010
delay(2);
PORTD=table[num6];//显示第六个数码管
PORTA=0x01;//00000001
delay(2);
}