高级会员
主题
帖子
积分1159
阅读权限30
注册时间2012-3-25
最后登录1970-1-1
在线时间 小时
|
本帖最后由 lxclia 于 2019-8-22 09:00 编辑
是很脑抽的原因。仿真用的是AT的52单片机,没有Xdata,编译的时候某些函数优化到Xdata里面了,导致仿真不正常。
仿真的软件里面加了256B的Xdata就正常了。
代码很简单,就是一个用两个595带8个7段的数码管。直接给数字可以显示,但是替换成变量就无法显示了……
比如这里
Display(0,1);第0个数字显示1,这样就是正常的
要是换成
Display(0,a);,哪怕这个a=1也是无法正常显示的。
附上完整代码,希望各位老司机带带我
#include <reg52.h>
#include <intrins.h>
sbit SCK = P3^5; // 数据输入时钟线,脉冲
sbit SI = P3^6; // 数据线
sbit RCK = P3^7; // 锁存
unsigned char code SMG[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90,0x83,0xc6,0xa1,0x86,0x8e}; // 段码
unsigned char code Wei[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // 位选
unsigned char Val[8] = {0}; // 要显示的数据
//************************ 函数声明 ************************
//控制74HC595输出数据
void Output(void)
{
RCK = 0;
RCK = 1;
}
//向74HC595中写入一字节数据
void Write_Byte(unsigned char dat)
{
unsigned char i = 0;
for(i=0; i<8; i++)
{
SCK = 0;
SI = dat & 0x80;
dat <<= 1;
SCK = 1;
}
}
//显示函数
void Display(unsigned char n,unsigned char m)
{
Write_Byte(Wei[n]);
Write_Byte(SMG[m]);
Output();
}
int main(void)
{
while(1)
{
unsigned char a;
a++;
if(a>10000000)a=0;
Display(0,1);
Display(1,2);
Display(2,3);
Display(3,4);
Display(4,5);
Display(5,(a/1000%10));
Display(6,(a/100%10));
Display(7,(a/10%10));
}
}
8x8+8x16.rar
(45.59 KB, 下载次数: 24)
|
|