想把6位秒表放大到4寸数码管。锁存和驱动电路是HC595和2803。
单片机新手,级联的接法程序做不来,就把6位数码管的数据线分离了,写时钟线和片选线为共用。
秒表和显示函数做好了,把按键函数加上时就卡壳了。
在主函数里调用大屏显示函数和按键函数,只有写在前面的函数有效。
(本程序中,按键函数改为板上的小尺寸数码管显示函数,目的是让测试看得见,也是因此才知道它们在
互掐)
(板上P1端口接流水灯,可见数据位的灯在闪烁,表明有效果,P0和P2端口分别接小号数码管的段和位,也可见笔段在闪。这样即使没有大数码管屏也可以做试验
)
(不会看调试界面,点按调试按钮都停在TMOD那一行附近;也不会仿真软件,都是烧录试验)
曾经怀疑:芯片、学习板、端口等,都有互换试验否定了。KEIL4也在怀疑之列,重装也未解决。
网上也搜不到答案。老汉RP不差,怎么就遇上了?
有遇到这种情况的吗?
各位高手帮看下是什么毛病
。老汉先谢过了。
(其实这个程序还有个问题:声明 uint 型中断变量 tt 的后面是分钟的个位 ff ,用 uchar 型就不能正常跳变显示,而更高位十分钟位又能跳变进位)
最后两行中注释掉 lednu(); 大屏就能走时,保留它大屏就不能走时,而小数码管有变化。把 Ledplay(); 换到前面情况相似。
/*********************************************/
/*大屏显示秒表*/
#include<REG51.H>
#define uint unsigned int
#define uchar unsigned char
//八个管脚定义
sbit HC595CLK =P1^0; //CLK
sbit HC595RCLK =P1^1; //STR
sbit HC595IN1 =P1^2; //厘秒
sbit HC595IN2 =P1^3; //分秒
sbit HC595IN3 =P1^4; //秒
sbit HC595IN4 =P1^5; //十秒
sbit HC595IN5 =P1^6; //分
sbit HC595IN6 =P1^7; //十分
uchar LED[10] = { 0xFA,0x30,0xD9,0x79,0x33,0x6B,0xEB,0x38,0xFB,0x7B};//秒表字模数组
uchar lm,fm,mm,sm,sf,rr; //厘秒分秒秒十秒十分的中转
uchar tt1,tt2,tt3,tt4, tt5,tt6; //厘秒分秒秒十秒分十分的分离
uint tt,ff; //中断数、个分
(ff非得用uint型)
unsigned char LEDR[6] ; //各位写入595需要的场所
/*小数码管函数用的变量等*/
sbit dula=P2^6; //段选信号的锁存器控制
sbit wela=P2^7; //位选信号的锁存器控制
uchar code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=113;y>0;y--);
}
void lednu(void)
{
uchar num;
for(num=0;num<8;num++)
{
P0=table[num];
wela=1;
wela=0;
P0=LED[num-1]; //例字的代码
dula=1;
dula=0;
delay(115);
}
}
void LedPlay( void ) //显示函数
{ unsigned char i ;
LEDR[1] = LED[lm%10] ;
LEDR[2] = LED[fm%10] ;
LEDR[3] = LED[mm%10]|0x04 ;
LEDR[4] = LED[sm%6] ;
LEDR[5] = LED[ff%10]|0x04 ;
LEDR[6] = LED[sf%10] ;
for( i = 0 ; i < 8 ; i++ )
{ HC595IN1 = LEDR[1]&0X80 ;
HC595IN2 = LEDR[2]&0X80 ;
HC595IN3 = LEDR[3]&0X80 ;
HC595IN4 = LEDR[4]&0X80 ;
HC595IN5 = LEDR[5]&0X80 ;
HC595IN6 = LEDR[6]&0X80 ;
HC595CLK = 1 ;
HC595CLK = 0;
LEDR[1] = LEDR[1] << 1 ;
LEDR[2] = LEDR[2] << 1 ;
LEDR[3] = LEDR[3] << 1 ;
LEDR[4] = LEDR[4] << 1 ;
LEDR[5] = LEDR[5] << 1 ;
LEDR[6] = LEDR[6] << 1 ;
}
HC595RCLK = 1 ;
HC595RCLK = 0 ;
}
void timer0(void) interrupt 1 using 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1; ET0=1; TR0=1;
tt++;
if(tt==180)
{ tt=0; tt1++; lm=tt1;
if(tt1==10)
{ tt1=0; tt2++; fm=tt2;
if(tt2==10)
{ tt2=0; tt3++; mm=tt3;
if(tt3==10)
{ tt3=0; tt4++; sm=tt4;
if(tt4==6)
{ tt4=0; tt5++; ff=tt5;
if(tt5==10)
{ tt5=0; tt6++; sf=tt6;
}}}}}}}
main() //主程序
{
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
HC595CLK = 1 ; //数码显示屏初始化
HC595RCLK =1 ;
while(1)
lednu(); //调用小数码管函数![](http://tb2.bdstatic.com/tb/editor/images/face/i_f42.png?t=20140803)
LedPlay() ; //调用大数码管函数![](http://tb2.bdstatic.com/tb/editor/images/face/i_f42.png?t=20140803)
}
单片机新手,级联的接法程序做不来,就把6位数码管的数据线分离了,写时钟线和片选线为共用。
秒表和显示函数做好了,把按键函数加上时就卡壳了。
在主函数里调用大屏显示函数和按键函数,只有写在前面的函数有效。
(本程序中,按键函数改为板上的小尺寸数码管显示函数,目的是让测试看得见,也是因此才知道它们在
![](http://tb2.bdstatic.com/tb/editor/images/face/i_f08.png?t=20140803)
(板上P1端口接流水灯,可见数据位的灯在闪烁,表明有效果,P0和P2端口分别接小号数码管的段和位,也可见笔段在闪。这样即使没有大数码管屏也可以做试验
![](http://tb2.bdstatic.com/tb/editor/images/face/i_f01.png?t=20140803)
(不会看调试界面,点按调试按钮都停在TMOD那一行附近;也不会仿真软件,都是烧录试验)
曾经怀疑:芯片、学习板、端口等,都有互换试验否定了。KEIL4也在怀疑之列,重装也未解决。
网上也搜不到答案。老汉RP不差,怎么就遇上了?
有遇到这种情况的吗?
各位高手帮看下是什么毛病
![](http://tb2.bdstatic.com/tb/editor/images/face/i_f08.png?t=20140803)
(其实这个程序还有个问题:声明 uint 型中断变量 tt 的后面是分钟的个位 ff ,用 uchar 型就不能正常跳变显示,而更高位十分钟位又能跳变进位)
最后两行中注释掉 lednu(); 大屏就能走时,保留它大屏就不能走时,而小数码管有变化。把 Ledplay(); 换到前面情况相似。
/*********************************************/
/*大屏显示秒表*/
#include<REG51.H>
#define uint unsigned int
#define uchar unsigned char
//八个管脚定义
sbit HC595CLK =P1^0; //CLK
sbit HC595RCLK =P1^1; //STR
sbit HC595IN1 =P1^2; //厘秒
sbit HC595IN2 =P1^3; //分秒
sbit HC595IN3 =P1^4; //秒
sbit HC595IN4 =P1^5; //十秒
sbit HC595IN5 =P1^6; //分
sbit HC595IN6 =P1^7; //十分
uchar LED[10] = { 0xFA,0x30,0xD9,0x79,0x33,0x6B,0xEB,0x38,0xFB,0x7B};//秒表字模数组
uchar lm,fm,mm,sm,sf,rr; //厘秒分秒秒十秒十分的中转
uchar tt1,tt2,tt3,tt4, tt5,tt6; //厘秒分秒秒十秒分十分的分离
uint tt,ff; //中断数、个分
![](http://tb2.bdstatic.com/tb/editor/images/face/i_f42.png?t=20140803)
unsigned char LEDR[6] ; //各位写入595需要的场所
/*小数码管函数用的变量等*/
sbit dula=P2^6; //段选信号的锁存器控制
sbit wela=P2^7; //位选信号的锁存器控制
uchar code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=113;y>0;y--);
}
void lednu(void)
{
uchar num;
for(num=0;num<8;num++)
{
P0=table[num];
wela=1;
wela=0;
P0=LED[num-1]; //例字的代码
dula=1;
dula=0;
delay(115);
}
}
void LedPlay( void ) //显示函数
{ unsigned char i ;
LEDR[1] = LED[lm%10] ;
LEDR[2] = LED[fm%10] ;
LEDR[3] = LED[mm%10]|0x04 ;
LEDR[4] = LED[sm%6] ;
LEDR[5] = LED[ff%10]|0x04 ;
LEDR[6] = LED[sf%10] ;
for( i = 0 ; i < 8 ; i++ )
{ HC595IN1 = LEDR[1]&0X80 ;
HC595IN2 = LEDR[2]&0X80 ;
HC595IN3 = LEDR[3]&0X80 ;
HC595IN4 = LEDR[4]&0X80 ;
HC595IN5 = LEDR[5]&0X80 ;
HC595IN6 = LEDR[6]&0X80 ;
HC595CLK = 1 ;
HC595CLK = 0;
LEDR[1] = LEDR[1] << 1 ;
LEDR[2] = LEDR[2] << 1 ;
LEDR[3] = LEDR[3] << 1 ;
LEDR[4] = LEDR[4] << 1 ;
LEDR[5] = LEDR[5] << 1 ;
LEDR[6] = LEDR[6] << 1 ;
}
HC595RCLK = 1 ;
HC595RCLK = 0 ;
}
void timer0(void) interrupt 1 using 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1; ET0=1; TR0=1;
tt++;
if(tt==180)
{ tt=0; tt1++; lm=tt1;
if(tt1==10)
{ tt1=0; tt2++; fm=tt2;
if(tt2==10)
{ tt2=0; tt3++; mm=tt3;
if(tt3==10)
{ tt3=0; tt4++; sm=tt4;
if(tt4==6)
{ tt4=0; tt5++; ff=tt5;
if(tt5==10)
{ tt5=0; tt6++; sf=tt6;
}}}}}}}
main() //主程序
{
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
HC595CLK = 1 ; //数码显示屏初始化
HC595RCLK =1 ;
while(1)
lednu(); //调用小数码管函数
![](http://tb2.bdstatic.com/tb/editor/images/face/i_f42.png?t=20140803)
LedPlay() ; //调用大数码管函数
![](http://tb2.bdstatic.com/tb/editor/images/face/i_f42.png?t=20140803)
}