51单片机数码管显示

我要用数码管显示4位数,要求是这样的,键盘输入的第一个数显示在最右边的数码管,键盘输入的第二位后原来的那位显示在右二个数码管,右一显示刚输入的那个数字,输入第三个数依次类推。请问要怎么写程序?给个思路也行

我写过8位的,带有删除功能,这是自己写的东西。我单片机有外接753芯片的,相当于io口扩展,所以可以用8个io口控制8跟数码管。输出为P1,程序里的LATCH1和LATCH2是用来控制753芯片的。

我的数码管是动态扫描显示的,不知道你单片机的电路长啥样。不过大致原理就是在main函数里不断扫描按键,如果有扫描到按键,就更新我所要显示的变量(val[i])。然后用定时器(scheduler())的部分来动态扫描我的数码管,每隔2.4微妙切换到下一个数码管(我用12兆晶振)。

我是没试过,不过我估计也可以用定时器来安排按键扫描,然后在main循环里面扫描数码管。或者更牛的就是两项工作全部弄在一个定时器里,这种方法叫做scheduler,可以用来做简单的多任务单片机。

#include <reg52.h>

unsigned char code tubePos[] = {0x80,0x40,0x20,0x10,0x8,0x4,0x2,0x1};
unsigned char code tubeNum[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};//0xff为不显示

sbit LATCH1 = P2^0;
sbit LATCH2 = P2^1;
sbit LATCH3 = P3^5;
int i,j,pos,val[8]={16,16,16,16,16,16,16,16}; //8个数码管都不显示
unsigned char k;
void shift(num)
{

for(k=7;k>0;k--)
{
val[k]=val[k-1];
}
val[0]=num;
}

void Delete()
{
for(k=0;k<7;k++)
{
val[k]=val[k+1];
}
val[7]=16;
}

void display(num,pos)
{
P1=tubeNum[num];
LATCH1=1;
LATCH1=0;

P1=tubePos[pos];
LATCH2=1;
LATCH2=0;
}

void DelayUs2x(unsigned char t)
{
while(--t);
}

void main()
{
unsigned char keyr,keyc,key;

LATCH3=0;
TMOD=0x01;
EA=1;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
ET0=1;
TR0=1;

while(1)
{

P3=0xf0;
keyr=P3;
keyr=keyr&0xf0;
if(keyr!=0xf0)
{
DelayUs2x(300);
if(keyr!=0xf0)
{
keyr=P3&0xf0;
keyr=keyr|0x0f;
P3=keyr;
keyc=P3;
keyc=keyc&0x0f;
keyr=keyr&0xf0;
key=keyr+keyc;

switch (key)
{
case 0xe7: shift(1);break;
case 0xeb: shift(2);break;
case 0xed: shift(3);break;
case 0xee: break;
case 0xd7: shift(4);break;
case 0xdb: shift(5);break;
case 0xdd: shift(6);break;
case 0xde: break;
case 0xb7: shift(7);break;
case 0xbb: shift(8);break;
case 0xbd: shift(9);break;
case 0xbe: break;
case 0x77: break;
case 0x7b: shift(0);break;
case 0x7d: break;
case 0x7e: Delete();break; //删除键

}
}
P3=0xf0;
while(P3!=0xf0)
{
DelayUs2x(300);
while(P3!=0xf0);

}
}
}
}

void scheduler() interrupt 1
{
TH0=(65536-480)/256;
TL0=(65536-480)%256;

if(i%5==0) //当i等于0或5时,更新数码管pos
{
display(val[pos],pos);
pos++;
if(pos>7)
{
pos=0;
}
}

i++;
if(i>9)
{
i=0;
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-31
假设:显缓a(0),a(1),a(2),a(3)对应从左到右4位显示,b为刚输入的数据,每次有输入时
a(0)=a(1);a(1)=a(2);a(2)=a(3);a(3)=b;
第2个回答  2013-05-31
程序太复杂了,不出血谁能白给你做。追问

要分是有 ,要钱是木有滴。俺是穷光蛋

追答

汇编语言500条以上不出钱行吗?
好力工一天要多少钱?

追问

需要500条吗????我自己做出来了,几十行而已

相似回答