熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2017-11-27 16:09
正文摘要:通過數(shù)碼管做的頻率計(jì),點(diǎn)陣來顯示波形。但是波形和數(shù)碼管會出現(xiàn)閃爍的問題,求大神解決 |
好帖,贊 |
好帖,贊一個(gè) |
程序準(zhǔn)備時(shí)間太長,再次進(jìn)入之前耗時(shí)太長 |
應(yīng)該是你的程序所用時(shí)間太長,出現(xiàn)“延時(shí)”的情況了 |
fancean 發(fā)表于 2017-11-27 18:55 好的,我試一下。新手,有太多不懂的了 |
如果顯示結(jié)果是正常的,只是顯示閃爍,那可能是單片機(jī)刷新的速度不夠,可以把你耗時(shí)間的運(yùn)算用耗時(shí)間少的操作代替掉,比如:*用左移替換掉,把delay10ms用別的操作替換掉,10MS太大了,比如用顯示操作替換掉DELAY的時(shí)間,還不行的話,就用4片595支持?jǐn)?shù)碼管的顯示,其與時(shí)間用來刷新點(diǎn)陣模塊。 |
#include <reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int uchar duan[10]={0xc0,0Xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //所需的段的位碼 //uchar wei[4]={0XEf,0XDf,0XBf,0X7f}; //位的控制端 (開發(fā)板) uchar wei[4]={0X80,0X40,0X20,0X10}; //位的控制端 (仿真) uint z,x,c,v, date; //定義數(shù)據(jù)類型 uint dispcount=0; uint lck=0; uint disp=0; /* 數(shù)據(jù)端接口定義 */ sbit key0=P1^0; sbit key1=P1^1; sbit key2=P1^2; sbit key3=P1^3; sbit sck = P2^0; //輸入時(shí)鐘 sbit row_dat = P2^1; //行數(shù)據(jù)時(shí)鐘 sbit row_buf_sck = P2^2; //行鎖存 //sbit row_mr = P2^4; //移位寄存器清零端 //sbit row_oe = P2^5; //輸出使能 /* 選通端接口定義 */ sbit col_dat = P2^6; //列數(shù)據(jù)時(shí)鐘 sbit col_buf_sck = P2^3; //列鎖存 unsigned char keyval; unsigned int code sel[16] = {0xff7f,0x7fff,0xffbf,0xbfff,0xffdf,0xdfff,0xffef,0xefff, 0xfff7,0xf7ff,0xfffb,0xfbff,0xfffd,0xfdff,0xfffe,0xfeff}; unsigned char code hanzi[4][32] = { {0x1C,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x1C,0x00,0x02,0x00,0x01,0x00, 0x01,0x00,0x02,0x00,0x1C,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x1C,0x00},/*"正弦",0*/ {0x00,0xFF,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0x00,0x01,0x00,0x01, 0x00,0x01,0x00,0x01,0x00,0xFF,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF},/*"方波",1*/ {0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x80,0x00,0x40,0x00,0x20, 0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x80,0x00,0x40,0x00,0x20},/*"三角波",2*/ {0x1C,0xFF,0x20,0x80,0x40,0x80,0x40,0x80,0x20,0x80,0x1C,0xFF,0x02,0x01,0x01,0x01, 0x01,0x01,0x02,0x01,0x1C,0xFF,0x20,0x80,0x40,0x80,0x40,0x80,0x20,0x80,0x1C,0xFF},/*"正弦和方波",3*/ }; void display(unsigned char *p); void send_data_row(unsigned int dat); /* 發(fā)送行數(shù)據(jù)端數(shù)據(jù)函數(shù) */ void send_data_col(unsigned int dat); /* 發(fā)送列選通端數(shù)據(jù)函數(shù) */ void delay(unsigned int m); void T(void); void delay10ms(); void delayfre(uchar t) { uchar i,j; for(i=0;i<t;i++) { for(j=13;j>0;j--); { ; } } } void xianshi() { /*****************數(shù)據(jù)轉(zhuǎn)換*****************************/ z=date/1000; //求千位 x=date%1000/100; //求百位 c=date%100/10; //求十位 v=date%10; //求個(gè)位 P2=wei[0]; P0=duan[z]; delayfre(30); P2=wei[1]; P0=duan[x]; delayfre(30); P2=wei[2]; P0=duan[c]; delayfre(30); P2=wei[3]; P0=duan[v]; delayfre(30); } /************************************************************************* 定時(shí)器初值1ms **************************************************************************/ void initTimer(void) { TMOD=0x0; TH0=0xe3; TL0=0xc; } /************************************************************************* 定時(shí)器函數(shù) **************************************************************************/ void timer0(void) interrupt 1 { TH0=0xe3; TL0=0xc; lck++; if(lck==1000) { disp=dispcount; lck=0; dispcount=0; } } /************************************************************************* 中斷函數(shù) **************************************************************************/ void int0(void) interrupt 0 { dispcount++; //每一次中斷,計(jì)數(shù)加一 } void T(void) { P1=0xff; if((P1&0x0f)!=0x0f) { delay10ms(); if(key0==0) keyval=0; if(key1==0) keyval=1; if(key2==0) keyval=2; if(key3==0) keyval=3; } } void delay10ms(void) { unsigned char i,j; for(i=0;i<100;i++) for(j=0;j<100;j++) ; } void send_data_row(unsigned int dat) { unsigned char i; for(i=0;i<16;i++) { sck = 0; row_dat = dat&0x8000; //temp<<=1; dat = dat<<1; //ds = CY; sck = 1; } row_buf_sck = 0; _nop_(); _nop_(); row_buf_sck = 1; } void send_data_col(unsigned int dat) { unsigned char i; for(i=0;i<16;i++) { sck = 0; col_dat = dat&0x8000; dat = dat<<1; sck = 1; } col_buf_sck = 0; _nop_(); _nop_(); col_buf_sck = 1; } void delay(unsigned int m) { unsigned char i; for(;m>0;m--) { for(i=0;i<124;i++) {;} } } void display(unsigned char *p) { unsigned char i; // unsigned int temp; for(i=0;i<32;i++) { if(i<16) { send_data_row(0x0000); // temp = sel[i]|0xff00; send_data_col(sel[i]); send_data_row(*p); p++; delay(2); } else { send_data_row(0x0000); // temp = (sel[i]<<8)|0x00ff; send_data_col(sel[i-16]); send_data_row((*p)<<8); p++; delay(2); } } } void main() { IT0=1; //INT0下降沿中斷 EX0=1; //允許INT1中斷 initTimer(); //裝入初值 TR0=1; ET0=1; EA=1; keyval=0; while(1) { T(); date=disp; xianshi(); switch(keyval) { case 0:display(hanzi[0]); break; case 1:display(hanzi[1]); break; case 2:display(hanzi[2]); break; case 3:display(hanzi[3]); break; } } } |
#include <reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int uchar duan[10]={0xc0,0Xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //所需的段的位碼 //uchar wei[4]={0XEf,0XDf,0XBf,0X7f}; //位的控制端 (開發(fā)板) uchar wei[4]={0X80,0X40,0X20,0X10}; //位的控制端 (仿真) uint z,x,c,v, date; //定義數(shù)據(jù)類型 uint dispcount=0; uint lck=0; uint disp=0; /* 數(shù)據(jù)端接口定義 */ sbit key0=P1^0; sbit key1=P1^1; sbit key2=P1^2; sbit key3=P1^3; sbit sck = P2^0; //輸入時(shí)鐘 sbit row_dat = P2^1; //行數(shù)據(jù)時(shí)鐘 sbit row_buf_sck = P2^2; //行鎖存 //sbit row_mr = P2^4; //移位寄存器清零端 //sbit row_oe = P2^5; //輸出使能 /* 選通端接口定義 */ sbit col_dat = P2^6; //列數(shù)據(jù)時(shí)鐘 sbit col_buf_sck = P2^3; //列鎖存 unsigned char keyval; unsigned int code sel[16] = {0xff7f,0x7fff,0xffbf,0xbfff,0xffdf,0xdfff,0xffef,0xefff, 0xfff7,0xf7ff,0xfffb,0xfbff,0xfffd,0xfdff,0xfffe,0xfeff}; unsigned char code hanzi[4][32] = { {0x1C,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x1C,0x00,0x02,0x00,0x01,0x00, 0x01,0x00,0x02,0x00,0x1C,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x1C,0x00},/*"正弦",0*/ {0x00,0xFF,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0x00,0x01,0x00,0x01, 0x00,0x01,0x00,0x01,0x00,0xFF,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF},/*"方波",1*/ {0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x80,0x00,0x40,0x00,0x20, 0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x80,0x00,0x40,0x00,0x20},/*"三角波",2*/ {0x1C,0xFF,0x20,0x80,0x40,0x80,0x40,0x80,0x20,0x80,0x1C,0xFF,0x02,0x01,0x01,0x01, 0x01,0x01,0x02,0x01,0x1C,0xFF,0x20,0x80,0x40,0x80,0x40,0x80,0x20,0x80,0x1C,0xFF},/*"正弦和方波",3*/ }; void display(unsigned char *p); void send_data_row(unsigned int dat); /* 發(fā)送行數(shù)據(jù)端數(shù)據(jù)函數(shù) */ void send_data_col(unsigned int dat); /* 發(fā)送列選通端數(shù)據(jù)函數(shù) */ void delay(unsigned int m); void T(void); void delay10ms(); void delayfre(uchar t) { uchar i,j; for(i=0;i<t;i++) { for(j=13;j>0;j--); { ; } } } void xianshi() { /*****************數(shù)據(jù)轉(zhuǎn)換*****************************/ z=date/1000; //求千位 x=date%1000/100; //求百位 c=date%100/10; //求十位 v=date%10; //求個(gè)位 P2=wei[0]; P0=duan[z]; delayfre(30); P2=wei[1]; P0=duan[x]; delayfre(30); P2=wei[2]; P0=duan[c]; delayfre(30); P2=wei[3]; P0=duan[v]; delayfre(30); } /************************************************************************* 定時(shí)器初值1ms **************************************************************************/ void initTimer(void) { TMOD=0x0; TH0=0xe3; TL0=0xc; } /************************************************************************* 定時(shí)器函數(shù) **************************************************************************/ void timer0(void) interrupt 1 { TH0=0xe3; TL0=0xc; lck++; if(lck==1000) { disp=dispcount; lck=0; dispcount=0; } } /************************************************************************* 中斷函數(shù) **************************************************************************/ void int0(void) interrupt 0 { dispcount++; //每一次中斷,計(jì)數(shù)加一 } void T(void) { P1=0xff; if((P1&0x0f)!=0x0f) { delay10ms(); if(key0==0) keyval=0; if(key1==0) keyval=1; if(key2==0) keyval=2; if(key3==0) keyval=3; } } void delay10ms(void) { unsigned char i,j; for(i=0;i<100;i++) for(j=0;j<100;j++) ; } void send_data_row(unsigned int dat) { unsigned char i; for(i=0;i<16;i++) { sck = 0; row_dat = dat&0x8000; //temp<<=1; dat = dat<<1; //ds = CY; sck = 1; } row_buf_sck = 0; _nop_(); _nop_(); row_buf_sck = 1; } void send_data_col(unsigned int dat) { unsigned char i; for(i=0;i<16;i++) { sck = 0; col_dat = dat&0x8000; dat = dat<<1; sck = 1; } col_buf_sck = 0; _nop_(); _nop_(); col_buf_sck = 1; } void delay(unsigned int m) { unsigned char i; for(;m>0;m--) { for(i=0;i<124;i++) {;} } } void display(unsigned char *p) { unsigned char i; // unsigned int temp; for(i=0;i<32;i++) { if(i<16) { send_data_row(0x0000); // temp = sel[i]|0xff00; send_data_col(sel[i]); send_data_row(*p); p++; delay(2); } else { send_data_row(0x0000); // temp = (sel[i]<<8)|0x00ff; send_data_col(sel[i-16]); send_data_row((*p)<<8); p++; delay(2); } } } void main() { IT0=1; //INT0下降沿中斷 EX0=1; //允許INT1中斷 initTimer(); //裝入初值 TR0=1; ET0=1; EA=1; keyval=0; while(1) { date=disp; xianshi(); T(); switch(keyval) { case 0:display(hanzi[0]); break; case 1:display(hanzi[1]); break; case 2:display(hanzi[2]); break; case 3:display(hanzi[3]); break; } } } |
Powered by 單片機(jī)教程網(wǎng)