单片机连接74hc595驱动数码管 但是亮度不均匀,最高位正常显示,后几位就会闪烁,不知道问题出在哪。
#include<reg52.h>#include<intrins.h>sbitsck=P0^4;//输入时钟sbitrck=P2^3;//输出锁存sbitsi=P0^2...
#include<reg52.h>
#include<intrins.h>
sbit sck = P0^4; //输入时钟
sbit rck = P2^3; //输出锁存
sbit si = P0^2; //串行数据输入
char code tableduan[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
char code tablewei[] = {0x08,0x04,0x02,0x01,0x80,0x40,0x20,0x10};
void delay1(unsigned int i)
{
unsigned int j;
for(j = 0;j<i;j++)
{
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
}
}
void init() //输入初始化
{
si = 1;
rck = 0;
}
void sclwei(unsigned char num) //位地址
{
unsigned char i,temp;
temp = tablewei[num];
for(i = 0;i<8;i++)
{
if(temp & 0x80)
{
si = 1;
}
else
{
si = 0;
}
_nop_();
temp = temp<<1;
sck = 1;
_nop_();
sck = 0;
}
}
void sclduan(unsigned char num) //段码数据
{
unsigned char i,temp;
temp = tableduan[num];
for(i = 0;i<8;i++)
{
if(temp & 0x80)
{
si = 1;
}
else
{
si = 0;
}
_nop_();
temp = temp<<1;
sck = 1;
_nop_();
sck = 0;
}
}
void leddisplay(unsigned char duan,unsigned char wei) //每一位对应的数字
{
init();
sclduan(duan);
_nop_();
sclwei(wei);
_nop_();
rck = 1;
_nop_();
rck = 0;
_nop_();
}
void led_caculate(unsigned int numb) //输入数字判断计算显示
{
unsigned int gewei;
unsigned int shiwei;
unsigned int baiwei;
gewei = numb%10;
shiwei = numb/10%10;
baiwei = numb/100%10;
if(numb<10)
{
leddisplay(gewei,3);
delay1(50);
}
else if(numb>=10 && numb<100)
{
leddisplay(gewei,3);
delay1(10);
leddisplay(shiwei,2);
delay1(10);
}
else if(numb>= 100 && numb<1000)
{
leddisplay(gewei,3);
delay1(50);
leddisplay(shiwei,2);
delay1(50);
leddisplay(baiwei,1);
delay1(50);
}
}
void main()
{
unsigned int i;
while(1)
{
for(i = 0;i<30;i++)
{
led_caculate(i) ;
delay(200);
}
}
} 展开
#include<intrins.h>
sbit sck = P0^4; //输入时钟
sbit rck = P2^3; //输出锁存
sbit si = P0^2; //串行数据输入
char code tableduan[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
char code tablewei[] = {0x08,0x04,0x02,0x01,0x80,0x40,0x20,0x10};
void delay1(unsigned int i)
{
unsigned int j;
for(j = 0;j<i;j++)
{
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
}
}
void init() //输入初始化
{
si = 1;
rck = 0;
}
void sclwei(unsigned char num) //位地址
{
unsigned char i,temp;
temp = tablewei[num];
for(i = 0;i<8;i++)
{
if(temp & 0x80)
{
si = 1;
}
else
{
si = 0;
}
_nop_();
temp = temp<<1;
sck = 1;
_nop_();
sck = 0;
}
}
void sclduan(unsigned char num) //段码数据
{
unsigned char i,temp;
temp = tableduan[num];
for(i = 0;i<8;i++)
{
if(temp & 0x80)
{
si = 1;
}
else
{
si = 0;
}
_nop_();
temp = temp<<1;
sck = 1;
_nop_();
sck = 0;
}
}
void leddisplay(unsigned char duan,unsigned char wei) //每一位对应的数字
{
init();
sclduan(duan);
_nop_();
sclwei(wei);
_nop_();
rck = 1;
_nop_();
rck = 0;
_nop_();
}
void led_caculate(unsigned int numb) //输入数字判断计算显示
{
unsigned int gewei;
unsigned int shiwei;
unsigned int baiwei;
gewei = numb%10;
shiwei = numb/10%10;
baiwei = numb/100%10;
if(numb<10)
{
leddisplay(gewei,3);
delay1(50);
}
else if(numb>=10 && numb<100)
{
leddisplay(gewei,3);
delay1(10);
leddisplay(shiwei,2);
delay1(10);
}
else if(numb>= 100 && numb<1000)
{
leddisplay(gewei,3);
delay1(50);
leddisplay(shiwei,2);
delay1(50);
leddisplay(baiwei,1);
delay1(50);
}
}
void main()
{
unsigned int i;
while(1)
{
for(i = 0;i<30;i++)
{
led_caculate(i) ;
delay(200);
}
}
} 展开
德鸿数智
2024-10-27 广告
2024-10-27 广告
压电陶瓷驱动电源,是专为驱动压电陶瓷设计的电源设备。它能提供高电压输出,最大可达400V,并具备高频率响应和高度稳定性,确保压电陶瓷产生精确的微纳米级位移变化。该电源还具备低纹波、过流保护等功能,保障运行安全。其电压调节灵活,既可通过计算机...
点击进入详情页
本回答由德鸿数智提供
展开全部
你delay(200);人的眼睛。只要超过20MS就会看起来感觉会闪了。所以你delay的时间要短点。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
void main()
{
unsigned int i;
while(1) {
for(i = 0;i<30;i++) {
led_caculate(i);
// delay(200);----删除这句
}
}
}
{
unsigned int i;
while(1) {
for(i = 0;i<30;i++) {
led_caculate(i);
// delay(200);----删除这句
}
}
}
追问
把delay()删掉亮度变均匀了,但是个位跑得飞快。稍微加一点延时 显示就闪。怎么能让数字跑慢点并且不闪呢?
追答
void main()
{
unsigned int i, j; //加个变量j
while(1) {
for(i = 0; i < 30; i++) {
for(j = 0; j < 100; j++) led_caculate(i); //显示100遍,就慢了
// delay(200);----删除这句
}
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询