|
| 好帖,贊 |
| 好帖,贊一個 |
| 程序準備時間太長,再次進入之前耗時太長 |
| 應該是你的程序所用時間太長,出現“延時”的情況了 |
fancean 發表于 2017-11-27 18:55 好的,我試一下。新手,有太多不懂的了 |
| 如果顯示結果是正常的,只是顯示閃爍,那可能是單片機刷新的速度不夠,可以把你耗時間的運算用耗時間少的操作代替掉,比如:*用左移替換掉,把delay10ms用別的操作替換掉,10MS太大了,比如用顯示操作替換掉DELAY的時間,還不行的話,就用4片595支持數碼管的顯示,其與時間用來刷新點陣模塊。 |
|
#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}; //位的控制端 (開發板) uchar wei[4]={0X80,0X40,0X20,0X10}; //位的控制端 (仿真) uint z,x,c,v, date; //定義數據類型 uint dispcount=0; uint lck=0; uint disp=0; /* 數據端接口定義 */ sbit key0=P1^0; sbit key1=P1^1; sbit key2=P1^2; sbit key3=P1^3; sbit sck = P2^0; //輸入時鐘 sbit row_dat = P2^1; //行數據時鐘 sbit row_buf_sck = P2^2; //行鎖存 //sbit row_mr = P2^4; //移位寄存器清零端 //sbit row_oe = P2^5; //輸出使能 /* 選通端接口定義 */ sbit col_dat = P2^6; //列數據時鐘 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); /* 發送行數據端數據函數 */ void send_data_col(unsigned int dat); /* 發送列選通端數據函數 */ 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() { /*****************數據轉換*****************************/ z=date/1000; //求千位 x=date%1000/100; //求百位 c=date%100/10; //求十位 v=date%10; //求個位 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); } /************************************************************************* 定時器初值1ms **************************************************************************/ void initTimer(void) { TMOD=0x0; TH0=0xe3; TL0=0xc; } /************************************************************************* 定時器函數 **************************************************************************/ void timer0(void) interrupt 1 { TH0=0xe3; TL0=0xc; lck++; if(lck==1000) { disp=dispcount; lck=0; dispcount=0; } } /************************************************************************* 中斷函數 **************************************************************************/ void int0(void) interrupt 0 { dispcount++; //每一次中斷,計數加一 } 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}; //位的控制端 (開發板) uchar wei[4]={0X80,0X40,0X20,0X10}; //位的控制端 (仿真) uint z,x,c,v, date; //定義數據類型 uint dispcount=0; uint lck=0; uint disp=0; /* 數據端接口定義 */ sbit key0=P1^0; sbit key1=P1^1; sbit key2=P1^2; sbit key3=P1^3; sbit sck = P2^0; //輸入時鐘 sbit row_dat = P2^1; //行數據時鐘 sbit row_buf_sck = P2^2; //行鎖存 //sbit row_mr = P2^4; //移位寄存器清零端 //sbit row_oe = P2^5; //輸出使能 /* 選通端接口定義 */ sbit col_dat = P2^6; //列數據時鐘 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); /* 發送行數據端數據函數 */ void send_data_col(unsigned int dat); /* 發送列選通端數據函數 */ 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() { /*****************數據轉換*****************************/ z=date/1000; //求千位 x=date%1000/100; //求百位 c=date%100/10; //求十位 v=date%10; //求個位 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); } /************************************************************************* 定時器初值1ms **************************************************************************/ void initTimer(void) { TMOD=0x0; TH0=0xe3; TL0=0xc; } /************************************************************************* 定時器函數 **************************************************************************/ void timer0(void) interrupt 1 { TH0=0xe3; TL0=0xc; lck++; if(lck==1000) { disp=dispcount; lck=0; dispcount=0; } } /************************************************************************* 中斷函數 **************************************************************************/ void int0(void) interrupt 0 { dispcount++; //每一次中斷,計數加一 } 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; } } } |