C51 程序求解(扫描数码管,);有图!求解释
有图示:
程序 就是这些程序;
有个51的开发板;编写好后,下载到板子上调试;
为什么一直这个板子上的8个数码管一直显示8个 “8” 也不流动;
很是不解啊?
小弟刚学51勿见怪;
不知说的清楚否?
程序如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71 }; //定义编码数?
void delay(uchar);
sbit wela=P2^7; //位选
sbit dela=P2^6; //段选
uchar i;
void main()
{
wela=1;
P1=0x00;
wela=0;
while(1)
{
for(i=0;i<16;i++)
{
dela=1;
P1=table;
dela=0;
delay(1100);
}
}
}
void delay(uchar a)
{
uchar x,y;
for(x=a;x<a;x--)
for(y=0;y<100;y++);
}
贴文字不行吗,看不清
P27,P26用法好像有问题吧
要是小编的初衷是是 让8个数码管依次扫描显示的话, 位选的使用是不正确的,
要是本来就做个小测试,8个数码管一起显示同样的数据的话,ok,可以这么用
小编说,为什么总是显示 8 ,我估计是 延时太短了,可以把延时加长试试。
小编,这两个P2^6和P2^7,没有问题哦
我不让他流动,只显示一个数码管亮,是没问题的;
就是在想让他如程序中,让他流动时,一直显示一个字不动?
很是不解/
小编,能不说的清楚些?
是啊,就是不能依次扫描啊,如果只让一个管子亮,是没问题的、位怎么选 ,
谢谢
我试下,加上延时,
这是几个管子的接法,
请指示?
里面用for语句就是不行啊,,一直显示一个“8”
而用if 语句,就可以依次扫描,但是,出现的不是“0-F”
是乱码,不知为何
?请高手指教?
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
//#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^2;//定义锁存使能端口 段锁存
sbit wela=P2^3;// 位锁存
uchar code dofly_DuanMa[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71 }; // 显示段码值01234567
uchar code dofly_WeiMa[]={ 0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
void Delay(uint t); //函数声明
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
unsigned char i=0;
wela=1; //打开位远
P0=0xcd;
wela=0; //位锁存
while(1)
{
dula=1; //打开段选
P0=dofly_DuanMa[i]; //取显示数据,段码
i++;
dula=0; //段锁存
Delay(60000); // 扫描间隙延时,时间太长会闪烁,太短会造成重影,
//这里故意延长时间,方便直观看出动态扫描原理
if(i==16)
i=0; //检测8位扫描完全结束?如扫描完成则从第一个
//开始再次扫描8位
}
}
/*------------------------------------------------
延时函数,含有输入参数 unsigned int t,无返回值
unsigned int 是定义无符号整形变量,其值的范围是
0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}
很是奇怪,为什么是,乱码呢?
开发板应该不会有问题啊
亲 你的延时函数的参数类型是uchar 但是你的实参却是1000,你绝得没有问题?自己看看那个uchar的范围吧,然后考虑用多重循环来延时或者是中断延时
小编要的是8个数码管流动显示0-F吗?
你的dela=1,但是dela不是断码么,这样直接赋值成1了,所以ABCDEFG都是高电平,当然会一直全亮啊