永发信息网

51单片机数码管显示

答案:4  悬赏:50  手机版
解决时间 2021-03-05 01:42
我要用数码管显示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;
}
}
全部回答
原发布者:787028221 项目二数码管显示本项目涉及数码管在实际应用中的各种不同情况,附有电路图以及例程。数码管实物一LED显示器(数码管)的结构与原理1.数码管的结构LED显示器(数码管)系发光器件的一种。常用的LED发光器件有两类:数码管和点阵。数码管内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的亮暗组合成字符。常见数码管有10根管脚。管脚排列如下图所示。其中COM为公共端,根据内部发光二极管的接线形式可分为共阴极和共阳极两种。使用时,共阴极数码管公共端接地,共阳极数码管公共端接电源。每段发光二极管需5~10mA的驱动电流才能正常发光,一般需加限流电阻控制电流的大小。一LED显示器的结构与原理a+5VabbccCOM109gfafgb8a7b6ddeefedge1d23c4dp5dpCOMGNDdpgcf(a)(b)(c)管脚排列共阴极数码管共阳极数码管一LED显示器的结构与原理2.数码管显示原理LED数码管的a~g七个发光二极管。加正电压的发光,加零电压的不能发光,不同亮暗的组合就能形成不同的字型,这种组合称为字型码。共阳极和共阴极的字型码是不同的,下面我们分析一下。如下图所示,把一个共阳极的数码管接到STC89C52RC单片机的P0口上,思考,怎样让此数码管显示数字0?分析:共阳极的数码管,COM端为高电平,数据段为低电平时,对应的段亮。则p0.7p0.6p0.5p0.4p0.3p0.2p0.1p0.0接dpgfedcba
程序太复杂了,不出血谁能白给你做。
假设:显缓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;
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
事业和工作有什么区别?
大马榴芒在哪里啊,我有事要去这个地方
跑车怎么才能做到 排气管有 噼里啪啦 的声音
没有人有《大男仆小情夫》这部电影吗?就是这
tenda无线路由器被人更改密码
美国UCC洗衣古河店在哪里啊,我有事要去这个
哥哥开车不小心把人家的车擦花了。陪九千块。
硚口区武汉金辉宾馆这个地址怎么能查询到,着
王卡激活后如果第二个月一直不缴费,是不是这
一个女人对你说:心情是自己给的,看你怎么去面
关于电影【寂静岭2】的几个疑问
九代雅阁方向盘下一扣手干嘛的
女朋友前男友从牢里出来要杀我
从上海坐游轮去日本韩国,国际漫游怎么开通
六年级同学体育测试,跳远不及格是及格的1/7,
推荐资讯
下列学术观点与科学家相匹配的是①“人的结构
city hall市政厅演BB的那个演员
请问Inetel(R) Core(TM) i3-2350M CPU @2.30G
澳大利亚的面积是多少?
专本连读,哪个专业比较好考?
现在学什么技术工作后一个月能赚个七八千的?
6.26x7.5+0.75×37.4的简便计算
谁知道(爱玛力鹰)电动车大灯是多少V的,也
前功尽弃是成语吗
【黑超特警2】黑衣人2结尾是什么意思
英语中如果不知性别用什么主语
由于变质作用导致岩石原先的结构、矿物成分等
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?