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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2252|回復: 1
打印 上一主題 下一主題
收起左側

單片機+74hc164驅動數碼管顯示 亂碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:5501 發表于 2021-4-23 16:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請交下師傅們 我寫的這個代碼164發送函數 放到主函數了就不能正常顯示了  但是在中斷函數里是可以正常顯示秒表的 謝謝

單片機源程序如下:
/*
STC12C5406AD  12M CRYSTAL

Relay                P22
Display1        P25
Display2        P24
DATA_164        P23
CLK_164                P21
MR_164                P20
K1                P32
K2    P33
K3                P34
LED_Flash        P37
*/

#include "STC12C5630AD.H"
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int
        

/*******************************************************************/

sbit MR_164                        = P2^0;                        //Pin9
sbit CLK_164                = P2^1;                 //Pin8 clk
sbit DATA_164                = P2^3;

sbit Relay                        = P2^2;                 //relay
sbit GRID1                        = P2^4;
sbit GRID2                        = P2^5;

sbit Key_start  = P3^2;
sbit Key_Set          = P3^3;
sbit Key_Down          = P3^4;

sbit LED_Flash        = P3^7;
bit led_flag;
/*******************************************************************/

const unsigned char code  Led_data[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xfb};

unsigned int nCnt;
unsigned char sec=24,Cnt[2]={0xff,0xff};

/******************************************************************

/*****************************************************************/
void delayms (uint ms)
{
        unsigned int i;
        while( ms -- )
        {
                for (i = 0; i < 600; i ++);//600 1T   125 12T
        }
}



/******************************************************************

/*****************************************************************/
void IO_Mode_Setup (void)
{

        P2M1 = 0x00;        //0000 0000
        P2M0 = 0x00;
        P3M1 = 0x00;        //0000 0000
        P3M0 = 0x00;
        
}

/******************************************************************

/*****************************************************************/
void Timer0_init(void)
{
         AUXR &= 0x7f;//12t   
         TMOD &= 0xf0;
         TMOD |= 0x01;//mode 1  16bit
         TH0 = 0xf8;
         TL0 = 0x30;
         TR0 = 1;
         TF0 = 0;
}
/******************************************************************

/*****************************************************************/
void PORT_init(void)
{
;
}


/******************************************************************

/*****************************************************************/
void SendByteData_164(unsigned char temp)
{
        unsigned char i;
               
        for (i = 0; i < 8; i++ )
        {
                if (temp & 0x80 ){//′ó¸ßλ¿aê¼·¢Ëí
                                DATA_164 = 1;
                }
                else{
                                DATA_164 = 0;
                }                          
                        CLK_164 = 0;        
                        CLK_164 = 1;
                  temp = temp << 1;
         }
        CLK_164  = 0;        //êí·Å×üÏß
        DATA_164 = 0;
}




void  Timer0_isr (void) interrupt 1
{
        static unsigned int t=0;
        TH0 = 0xf8;  //12 2ms
        TL0 = 0x30;
        
        led_flag = ~led_flag;
        GRID1 = 1;
        GRID2 = 1;
        
  if(sec < 10){
                Cnt[0] = sec%10;
                Cnt[1] = 10;
        }else if(sec < 100){
                Cnt[1] = sec/10;
                Cnt[0] = sec%10;
        }else{
                sec = 0;
        }
        
                SendByteData_164(Led_data[Cnt[led_flag]]);
                if(led_flag )
                {
                        GRID1 = 0;
                }else {
                                        GRID2 = 0;
                }

        if(t++ >= 500)//2ms*500=1000ms
        {               
                sec++;
                LED_Flash = !LED_Flash;
                t = 0;        
                if(sec >= 100)
                {
                        sec = 0;
                }
        }
               
}

/******************************************************************

/*****************************************************************/

void main (void)
{
        
        IO_Mode_Setup ();
        Timer0_init();
        SendByteData_164(Led_data[0]);
        MR_164 = 1;  //164 pin9 master resert
//  GRID1 = 0;         //¿aÆôλ1
//        GRID2 = 0;
        Relay = 0;        //S8550 11Ø±Õ 0 ¿aÆô
        P3 &= 0x80;
        LED_Flash = 0;        
        ET0 = 1;
        EA = 1;
        
        while(1)
        {

//                SendByteData_164(Led_data[Cnt[led_flag]]);
//這個函數放到這里 秒表就顯示兩個8.8. 不能正常顯示走動走時了 但是放到中斷函數里是正常顯示秒表的
               
               
        }//end while(1)               

}//end main()













分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:332214 發表于 2021-4-23 17:40 | 只看該作者
放在主函數里 是因為被定時器中斷搶占了 Cnt[led_flag], 這個變量在改變。
這就相當于 兩個線程共用一個變量,一個線程在賦值,另一個在取值,這中間不加個互斥鎖,會報錯的。
但單片機的中斷和系統上的線程還是有差異的,中斷執行時,主函數程序是暫停的。
解決辦法:就是在主程序調用這個變量的時候 不被定時器中斷打斷去改變這個值。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久综合激情 | 国产目拍亚洲精品99久久精品 | 韩国av网站在线观看 | 精品在线免费观看视频 | 国产在线拍偷自揄拍视频 | 国产精品视频播放 | 成人欧美一区二区三区在线播放 | 成人一区在线观看 | 精品一区二区久久久久久久网站 | 在线观看国产视频 | 欧美精品一区二区三区在线 | 国产一区三区在线 | 国产午夜精品一区二区三区嫩草 | 国产黄色大片在线免费观看 | 亚洲免费视频播放 | 国产精品综合一区二区 | 国产成人99久久亚洲综合精品 | 91精品国产高清一区二区三区 | 国产成人精品一区二区三区 | 亚洲经典一区 | 久色一区 | 亚洲欧美日韩国产综合 | 色婷婷av一区二区三区软件 | 黄网站在线观看 | 特黄级国产片 | 538在线精品 | 毛片高清 | 精品免费国产视频 | 男人的天堂视频网站 | 亚洲精品久久 | 久草在线| 一区二区三区四区电影视频在线观看 | 一区二区三区在线看 | 手机在线观看av | 久久久久黄 | 91久久综合亚洲鲁鲁五月天 | 日本超碰 | 精品国产精品一区二区夜夜嗨 | 亚洲欧美成人影院 | 国产精品精品久久久 | 九九热在线观看视频 |