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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3557|回復: 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:235629 發表于 2017-11-27 20:11 | 顯示全部樓層
fancean 發表于 2017-11-27 18:55
如果顯示結果是正常的,只是顯示閃爍,那可能是單片機刷新的速度不夠,可以把你耗時間的運算用耗時間少的操 ...

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品国产三级国产aⅴ原创 | 国产一区 | 午夜电影一区二区 | av网站观看| 成人黄色电影在线观看 | h肉视频| 两性午夜视频 | 国外成人在线视频 | 亚洲免费在线 | 超碰在线97国产 | 国产色在线 | 五月花丁香婷婷 | 欧美www在线观看 | 中文字幕一区二区三区在线观看 | 亚洲综合色视频在线观看 | 国产精品不卡一区二区三区 | 欧美日韩一区二区三区不卡视频 | 亚洲精品麻豆 | 日韩在线国产 | 人人澡人人射 | 伊人无码高清 | 91视频在线看 | 久久久久av | 成人免费观看男女羞羞视频 | 中文在线视频 | 国产69久久精品成人看动漫 | 亚洲成人精品 | 国产精品99免费视频 | 日韩国产精品一区二区三区 | 夜久久| 久久精品99国产精品 | 成人免费精品视频 | 网站黄色在线免费观看 | 国产综合av | sese视频在线观看 | 99热这里都是精品 | 国产毛片毛片 | 超碰97免费在线 | 一区二区三区欧美 | 日日夜夜精品视频 | 国产一区免费 |