标题:
51单片机两片595驱动共阴极数码管的问题
[打印本页]
作者:
chenbingjy
时间:
2024-11-22 13:00
标题:
51单片机两片595驱动共阴极数码管的问题
代码:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
uchar code Table[] =
{ // 0 1 2 3 4 5 6 7 8 9 A b C d E F -
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x86,0xFF,0xbf
};
//-----------------------------------------------------------------------------
sbit SER = P1^0; //串行数据输入端
sbit STCP = P1^1; //时钟脉冲信号——上升沿有效 存储寄存器时钟输入端,并行输出
sbit SHCP = P1^2; //输入信号————上升沿有效 移位寄存器时钟输入端
sbit key1 = P3^0; //选择键
sbit key2 = P3^1; //加键
sbit key3 = P3^2; //减键
sbit key4 = P3^3;
uchar shan,A,K,C,D,E,F;
uchar knum; //选择键计数变量
void TimerInit();
void KeyScan();
void Display (uchar shi10,uchar shi,uchar fen10,uchar fen,uchar miao10,uchar miao); // 数码管显示
void SMG_Int(uchar Dat); // 数码管单字节串行移位函数
//*****************************************************************************
// 主程序
void main ()
{
unsigned int i;
TimerInit();
while(1)
{
Display (A,K,C,D,E,F);
KeyScan();
//for(i=0;i<300;i++);
}
}
void KeyScan()
{
}
void Display (uchar shi10,uchar shi,uchar fen10,uchar fen,uchar miao10,uchar miao)
{
uchar i;
//显示第1位 小时10位
i = Table[shi10];
SMG_Int(i);
SMG_Int(0x01);
STCP = 0; //数据并行输出,(借助上升沿)
_nop_();
_nop_();
STCP = 1;
//显示第2位 小时个位
i = Table[shi];
SMG_Int(i);
SMG_Int(0x02);
STCP = 0;
_nop_();
_nop_();
STCP = 1;
//显示第3位 -
if(shan<10) //"-" 闪烁
i = Table[16];
else
i = Table[15];
SMG_Int(i);
SMG_Int(0x04);
STCP = 0;
_nop_();
_nop_();
STCP = 1;
//显示第4位 分钟10位
i = Table[fen10];
SMG_Int(i);
SMG_Int(0x08);
STCP = 0;
_nop_();
_nop_();
STCP = 1;
//显示第5位 分钟个位
i = Table[fen];
SMG_Int(i);
SMG_Int(0x10);
STCP = 0;
_nop_();
_nop_();
STCP = 1;
//显示第6位 -
if(shan<10) //"-" 闪烁
i = Table[16];
else
i = Table[15];
SMG_Int(i);
SMG_Int(0x20);
STCP = 0;
_nop_();
_nop_();
STCP = 1;
//显示第7位 秒10位
i = Table[miao10];
SMG_Int(i);
SMG_Int(0x40);
STCP = 0;
_nop_();
_nop_();
STCP = 1;
//显示第8位 秒个位
i = Table[miao];
SMG_Int(i);
SMG_Int(0x80);
STCP = 0;
_nop_();
_nop_();
STCP = 1;
}
void SMG_Int(uchar Dat) //通过8次循环将8位数据移入74HC595
{
uchar i;
for(i=8;i>=1;i--)
{
if (Dat & 0x80)
{
SER = 1;
}
else
{
SER = 0;
}
Dat <<= 1;
SHCP = 0;
_nop_();
_nop_();
SHCP = 1;
}
}
void TimerInit() //定时器0初始化
{
TMOD = 0x01;
TH0 = (65536-50000)/256; //50ms初值
TL0 = (65536-50000)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Timer0() interrupt 1
{
static uchar cnt,shi=12,fen=59,miao=30;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
shan++;
if(shan==20)
shan=0;
cnt++;
if(cnt==20)
{
cnt = 0;
miao++;
if(miao == 60)
{
miao = 0;
fen++;
if(fen==60)
{
fen = 0;
shi++;
if(shi==24)
{
shi=0;
}
}
}
}
A=shi/10;
K=shi%10;
C=fen/10;
D=fen%10;
E=miao/10;
F=miao%10;
}
复制代码
仿真结果
2.jpg
(184.04 KB, 下载次数: 0)
下载附件
2024-11-22 12:59 上传
共阳极好使,共阴极不对。
请问高手,哪里不对?谢谢
作者:
xiaobendan001
时间:
2024-11-22 15:26
共阳极改共阴极,位选和段数据都加个~不久行了?
还有这样每一位的时间太短了吧。
都不如直接上1638这样的芯片了。不过好像仿真不好搞
作者:
WL0123
时间:
2024-11-22 21:41
无标题.jpg
(102.84 KB, 下载次数: 0)
下载附件
2024-11-22 21:40 上传
#include <reg51.H>
#define uint unsigned int
#define uchar unsigned char
sbit P_HC595_SER = P1^0;
sbit P_HC595_RCLK = P1^1;
sbit P_HC595_SRCLK = P1^2;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x40};
uchar data dis_buf[8];
uchar shi=12,fen=59,miao=30;
uint cnt;
bit flag;
/**************** 向HC595发送一个字节函数 ******************/
void Send_595(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
dat <<= 1;
P_HC595_SER = CY; //溢出位赋值数据输出端
P_HC595_SRCLK = 1; //移位时钟
P_HC595_SRCLK = 0;
}
}
/**************** 向HC595发送2个字节驱动码 ******************/
void DisplayScan()
{
static uchar i;
Send_595(~(0x01<<i));//向HC595发送位码
Send_595(table[dis_buf[i]]);//向HC595发送段码
P_HC595_RCLK = 1;//锁存输出数据
P_HC595_RCLK = 0;
i++;
i%=8;
}
void TimerInit() //定时器0初始化
{
TMOD = 0x01;
TH0 = (65536-2000)/256; //2ms初值
TL0 = (65536-2000)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main()
{
P_HC595_SRCLK = 0;//初始化移位时钟端
P_HC595_RCLK = 0;//初始化锁存输出端
dis_buf[0]=shi/10;//初始化显示缓存
dis_buf[1]=shi%10;
dis_buf[2]=16;
dis_buf[3]=fen/10;
dis_buf[4]=fen%10;
dis_buf[5]=16;
dis_buf[6]=miao/10;
dis_buf[7]=miao%10;
TimerInit();
while(1)
{
if(flag)
{
flag=0;
dis_buf[0]=shi/10;
dis_buf[1]=shi%10;
dis_buf[3]=fen/10;
dis_buf[4]=fen%10;
dis_buf[6]=miao/10;
dis_buf[7]=miao%10;
DisplayScan();
}
}
}
void Timer0() interrupt 1
{
TH0 = (65536-2000)/256;
TL0 = (65536-2000)%256;
cnt++;
if(cnt>=500)
{
cnt = 0;
miao++;
if(miao == 60)
{
miao = 0;
fen++;
if(fen==60)
{
fen = 0;
shi++;
if(shi==24)
{
shi=0;
}
}
}
}
flag=1;
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1