久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3674|回復: 8
收起左側

咨詢一個單片機同時驅動數碼管和點陣有閃爍的問題

[復制鏈接]
ID:235629 發表于 2017-11-27 16:09 | 顯示全部樓層 |閱讀模式
通過數碼管做的頻率計,點陣來顯示波形。但是波形和數碼管會出現閃爍的問題,求大神解決
QQ圖片20171127160843.png
回復

使用道具 舉報

ID:235629 發表于 2017-11-27 16:15 | 顯示全部樓層
#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;

}
}
}
回復

使用道具 舉報

ID:235629 發表于 2017-11-27 17:09 | 顯示全部樓層
#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;
}
}


}

回復

使用道具 舉報

ID:254304 發表于 2017-11-27 18:55 | 顯示全部樓層
如果顯示結果是正常的,只是顯示閃爍,那可能是單片機刷新的速度不夠,可以把你耗時間的運算用耗時間少的操作代替掉,比如:*用左移替換掉,把delay10ms用別的操作替換掉,10MS太大了,比如用顯示操作替換掉DELAY的時間,還不行的話,就用4片595支持數碼管的顯示,其與時間用來刷新點陣模塊。
回復

使用道具 舉報

ID:235629 發表于 2017-11-27 20:11 | 顯示全部樓層
fancean 發表于 2017-11-27 18:55
如果顯示結果是正常的,只是顯示閃爍,那可能是單片機刷新的速度不夠,可以把你耗時間的運算用耗時間少的操 ...

好的,我試一下。新手,有太多不懂的了
回復

使用道具 舉報

ID:142559 發表于 2017-11-27 20:16 | 顯示全部樓層
應該是你的程序所用時間太長,出現“延時”的情況了
回復

使用道具 舉報

ID:254398 發表于 2017-11-27 21:41 | 顯示全部樓層
程序準備時間太長,再次進入之前耗時太長
回復

使用道具 舉報

ID:253967 發表于 2017-11-27 23:03 | 顯示全部樓層
好帖,贊一個
回復

使用道具 舉報

ID:254453 發表于 2017-11-27 23:37 來自觸屏版 | 顯示全部樓層
好帖,贊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线激情视频 | 久久久久久成人 | 亚州精品天堂中文字幕 | 国产1区2区 | 欧美日韩在线播放 | 一级毛片在线播放 | 成人av网站在线观看 | 亚洲国产精品久久 | 综合久久一区 | 精品视频在线播放 | 成人国产精品免费观看 | 国产福利在线 | www,黄色,com| 九九亚洲 | 色综合一区 | 日本免费一区二区三区 | 超碰在线观看97 | 午夜a v电影 | 激情av免费看 | 亚洲欧美在线一区 | 成人精品一区二区 | 久久男人 | 伊人网综合| 成人免费视屏 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 雨宫琴音一区二区在线 | 中文一区 | 久久精品一区 | 99视频免费看 | 亚洲成人免费视频在线 | 国产高清一区二区三区 | 久久里面有精品 | 日韩中文字幕在线免费 | 91婷婷韩国欧美一区二区 | 久久精品久久久久久 | 毛片网站在线观看视频 | 精品国产一区二区三区久久久四川 | 99精品国产一区二区青青牛奶 | 日韩一区二区三区视频 | 日韩欧美视频网站 | 男人天堂色 |