PNP三极管作为驱动,基极输入低电平三极管导通(即位选线置低电平时 位选有效)位选接有上拉电阻(bilibili编程一时爽 第九_集)
按键扫描(key=扫描到的按键值)、数码管显示结束一次;key赋一个无关值,不然会每个位一直显示上一个显示的数(在动态显示的情况下)**/还没找到别的解决办法
**
————————————————————————————————————————
下面是我的代码,和仿真图,不管按下0~9哪个键都显示0,调试看没什么问题??
—————————————————————————————————————————————
程序源码
——————————————————————————————————————
unchar code seg[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90};
unchar count=0;
unchar key=16;
unchar array;
unchar sum;
unchar scan_key();
void Display(unchar S);//cou=count
unchar input(unchar k);
void delayms(unchar t);
//*****************************************************
void main()
{
P3=0xff; //位选,开始全1,PNP驱动 低电平导通,
P2=0xff; //段选,共阳极
array=(unchar)malloc(sizeof(unchar)sum);
while(1)
{
scan_key();//return key=扫描到的按键值
sum=input(key);//return count ; sum=count 已经从按键输入的数据(0~9)个数
Display(sum);
key=16;
}
}
//*****************************************************
unchar scan_key()
{
unchar hang,lie;
P1=0x0f;
if(P1!=0x0f)
delayms(10);
if(P1!=0x0f)
{
switch(P1&0x0f)
{
case 0x0e:hang=0;break;
case 0x0d:hang=1;break;
case 0x0b:hang=2;break;
case 0x07:hang=3;break;
}
P1=0xf0;
switch(P1&0xf0)
{
case 0xe0:lie=0;break;
case 0xd0:lie=1;break;
case 0xb0:lie=2;break;
case 0x70:lie=3;break;
}
P1=0x0f;
while(P1!=0x0f);
key=hang*4+lie;
}
return (key);
}
//*******************************************************************
unchar input(unchar k)//k=key 扫描到的按键值存入到array[]数组
{
if(count>8)
count=0;
if(k>=0&&k<=9)
{
array[count]=k;//save input digit
count++; //the number of 'number[]'
}
return count;//count : the number of inputed digit
}
///*****************************************************************
void Display(unchar S)//S = sum = the number of 'array[]'
{
unchar i,j;
for(i=1,j=0;i<=S,j<S;i++,j++)
{
P3=~(0x80>>j);
P2=seg[array[S-i]];
delayms(5);
P2=0xff;
}
}
//***********************************************************
void delayms(unchar t)
{
unchar i,j;
for(i=t;i>0;i--)
for(j=120;j>0;j--);
}