永发信息网

各位大虾:我的八位数码管老是显示乱码,不能消隐,望帮忙解决,深表感谢!

答案:3  悬赏:50  手机版
解决时间 2021-02-15 05:32
#include // 引用标准库的头文件
#include #include
#include #include
#define uchar unsigned char #define uint unsigned int
#define DIGPORT XBYTE[0x0200]// 定义字位口
#define WORDPORT XBYTE[0x0100]// 定义字型口
#define fosc11.0592// 晶振频率 #define time020000// 定时2000us
sbit DIN = P3^0;// 串行数据输入sbit CLK = P3^1;// 串行时钟
sbit LOAD = P3^4;// 显示数据锁存控制
#define NoOp 0x00 // 空操作寄存器#define Digit0 0x01 // 数码管1寄存器
#define Digit1 0x02 // 数码管2寄存器#define Digit2 0x03 // 数码管3寄存器
#define Digit3 0x04 // 数码管4寄存器#define Digit4 0x05 // 数码管5寄存器
#define Digit5 0x06 // 数码管6寄存器#define Digit6 0x07 // 数码管7寄存器
#define Digit7 0x08 // 数码管8寄存器
#define DecodeMode 0x09 // 译码模式寄存器
#define Intensity 0x0a // 亮度寄存器#define ScanLimit 0x0b // 扫描位数寄存器
#define ShutDown 0x0c // 低功耗模式寄存器#define DisplayTest 0x01 // 显示测试寄存器#define ShutdownMode 0x00 // 低功耗方式
#define NormalOperation 0x01 // 正常操作方式
#define ScanDigit 0x07 // 扫描位数设置,显示8位数码管
#define DecodeDigit 0xff // 译码设置,8位均为BCD码
#define IntensityGrade 0x0b // 亮度级别设置
uchar DisBuffer[8]={0,0,0,0,0,0,0,0}; // 显示缓存区
uchar digbit;// 字位uchar wordbuf[4];// 字型码缓冲区void display(void);// 显示函数
void delay(uint t)
{uint i;
while(t--)
{

for (i=0;i<125;i++)
{}
}}

void SendChar (uchar ch)
{uchar i,temp;
_nop_();
for (i=0;i<8;i++)
{temp=ch&0x80;
ch=ch<<1;
if(temp)
{ DIN=1;
CLK=0;
CLK=1;}
else
{DIN=0;
CLK=0;
CLK=1;}}}

void WriteWord (uchar addr,uchar num)
{ LOAD=0;
_nop_();
SendChar(addr);
_nop_();
SendChar(num);
_nop_();
LOAD=1;// 锁存进相应寄存器
}

void InitDisplay (void)
{
WriteWord (ScanLimit,ScanDigit); // 设置扫描界限
WriteWord (DecodeMode,DecodeDigit); // 设置译码模式
WriteWord (Intensity,IntensityGrade); // 设置亮度
WriteWord (ShutDown,NormalOperation); // 设置为正常工作模式
}


void main(void)
{uchar i,j;
uchar db[]={0,0,0,0,0,0,0,0};
InitDisplay ();// MAX7219初始化

for (j=0;j<=7;j++)
db[j]=j;

for (i=0;;i++)
{

delay(200);
WriteWord (Digit0,DisBuffer[(0+i)%8]);
WriteWord (Digit1,db[(1+i)%8]);
WriteWord (Digit2,db[(2+i)%8]);
WriteWord (Digit3,db[(3+i)%8]);
WriteWord (Digit4,db[(4+i)%8]);
WriteWord (Digit5,db[(5+i)%8]);
WriteWord (Digit6,db[(6+i)%8]);
WriteWord (Digit7,db[(7+i)%8]);
}

}
我还是希望得到满意回答



最佳答案
我没有仔细研究你的电路,但能大致理解你的软件的作用。给你提供几点排查问题的思路。
 
能否实现8个数码管同时静态地显示数字?例如可以在main()函数里这样写:
void main(void)
{
// MAX7219初始化
InitDisplay();
// 在8个数码管分别静态地显示数字0~7
WriteWord(Digit0, 0);
WriteWord(Digit1, 1);
WriteWord(Digit2, 2);
WriteWord(Digit3, 3);
WriteWord(Digit4, 4);
WriteWord(Digit5, 5);
WriteWord(Digit6, 6);
WriteWord(Digit7, 7);
// 无限循环
while (1) ;
}如果这一步还做不到,有可能的原因是:
1) 电路有问题;
2) MAX7219初始化函数InitDisplay()有问题;
3) WriteWord()函数有问题。
你需要再去仔细查看芯片的Datasheet。
 
如果这一步可以做到,那么主要问题就在main()函数里。
按照我的理解,你是想在无限循环体里,依次往Digit0~Digit7写入0~7,期望显示出来的效果是
01234567 --> 12345670 --> 23456701 --> ......
但你目前的main()函数有几个可能存在问题的地方:
1) 往Digit0写入的是DisBuffer数组的值;而写入Digit1~Digit7的是db数组的值。DisBuffer初始化为全0后就没有修改过,那么写入Digit0的就总是0。
2) 在8位C51单片机上做求余运算是很费CPU资源的。而且db数组的内容在初始化之后就没有变,实际上只是当做常量来使用。优化的写法是:
void main(void)
{
uchar i;
// MAX7219初始化
InitDisplay();
i = 0;
#define WRITE_WORd(n) \
WriteWord(Digit##n, ((i++) & 0x7))
while (1)
{
delay(200);
WRITE_WORd(0);
WRITE_WORd(1);
WRITE_WORd(2);
WRITE_WORd(3);
WRITE_WORd(4);
WRITE_WORd(5);
WRITE_WORd(6);
WRITE_WORd(7);
}
#undef WRITE_WORD
}++运算和按位与运算都是很快的。
全部回答
消影了吗?
完全不懂。表示关注。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
青岛到三亚多少公里
佳丽童装地址在哪,我要去那里办事
开光吉祥物第一次佩戴的最佳时间是什么时候
求泰勒斯威夫特歌曲资源(有歌词)。
你的世界就让你拥有,不打扰是我最后的温柔,
请问:我和他感情不和已经分居一年了。有两个
开个五金店月营业额10000块,利润是多少?
天龙八部可以摘除万宝省钱
金盛我想知道这个在什么地方
复仇小说,女主有四个,最后女主的养父娶了个后
读下图为某城市星级饭店与快餐店布图,据此回
日语中像ショ、デュ怎么读
畯腾染织在什么地方啊,我要过去处理事情
疝气手电筒闪烁是怎么回事?
做三角形abc关于直线l的对称图形,要图,越完整
推荐资讯
我想知道如何查找一个城市到另一个城市的距离
1974年9月9日农历晚上23.多子时女子的八字如
三溪乡信用社地址在什么地方,想过去办事
多芬的沐浴露哪一种最香?只求香!
央视新闻联播主持人罗京逝世的具体原因?
flashfxp上传速度大概多少
平安树叶子发黑,干枯
阳明区牡丹江市第二人民医院胸痛中心地址在什
小米和魅族用哪个好?求推荐 发热控制 性能
欧尚美容美体会所地址在哪,我要去那里办事
佳乐财税信息咨询服务所在什么地方啊,我要过
成华区家家康顺大药房地址在什么地方,想过去
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?