![]() |
發(fā)布時間: 2024-9-7 08:05
正文摘要:我用stc15w4k32s4芯片,用74Hc59驅動做的一個從0-7數(shù)字輪流展示的屏幕,但是第一個數(shù)據(jù)永遠是全亮的,怎么樣才能把它改成是0的顯示呢 |
lkc8210 發(fā)表于 2024-9-9 11:29 好的,我終于知道問題出在哪里了,謝謝 |
uchar Dis_buff[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 8位數(shù)碼管顯示數(shù)組 |
lkc8210 發(fā)表于 2024-9-8 08:40 #include <stc15.h> //頭文件,必須包含此文件。 #define uint unsigned int #define uchar unsigned char sbit SCK = P5^0; //74HC595數(shù)據(jù)輸入時鐘端 sbit RCK = P5^1; //74HC595鎖存時鐘端 sbit SER = P5^2; //74HC595數(shù)據(jù)輸入端 uchar ct; // 8位數(shù)碼管計數(shù) uchar Dis_buff[8]; // 8位數(shù)碼管顯示數(shù)組 uint count=0x00; // 數(shù)碼管顯示初始值 unsigned char bit_code[8]={0x80,0x40,0x20,0x10,0x8,0x04,0x02,0x01}; //數(shù)碼管位選數(shù)組 //unsigned char SEG_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x77,0x7c,0x39,0x5e,0x79,0x71}; //數(shù)碼管段選數(shù)組 unsigned char SEG_code[18]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF,0xBF}; /********************************************************************** 函 數(shù) 名:調用的子函數(shù) 函數(shù)功能: **********************************************************************/ void delay_1ms(uint z); //延時函數(shù) void send_595(uchar a); //數(shù)碼管數(shù)據(jù)發(fā)送函數(shù) void shumaguan(); //數(shù)碼管顯示函數(shù) /********************************************************************** 函 數(shù) 名:主函數(shù) 函數(shù)功能: **********************************************************************/ void main(void) { P0M0 = 0x00; P0M1 = 0x00; //GPIO初始化,設置為準雙向口 P1M0 = 0x00; P1M1 = 0x00; //GPIO初始化,設置為準雙向口 P2M0 = 0x00; P2M1 = 0x00; //GPIO初始化,設置為準雙向口 P3M0 = 0x00; P3M1 = 0x00; //GPIO初始化,設置為準雙向口 P4M0 = 0x00; P4M1 = 0x00; //GPIO初始化,設置為準雙向口 P5M0 = 0x00; P5M1 = 0x00; //GPIO初始化,設置為準雙向口 P6M0 = 0x00; P6M1 = 0x00; //GPIO初始化,設置為準雙向口 P7M0 = 0x00; P7M1 = 0x00; //GPIO初始化,設置為準雙向口 SCK=0; RCK=0; SER=0; while(1) { shumaguan(); } } /********************************************************************** 函 數(shù) 名:1ms延時函數(shù) 函數(shù)功能:x值可以修改,修改后延時為Xms **********************************************************************/ void delay_1ms(uint z) { uint x,y; for(x=z;x>0;x--) for(y=120;y>0;y--); } /********************************************************************** 函 數(shù) 名:595數(shù)據(jù)發(fā)送函數(shù) 函數(shù)功能:595驅動3位數(shù)碼管 **********************************************************************/ void send_595(unsigned char a) { unsigned char i; for(i=0;i<8;i++) { //if((a&0x80) == 0x80) //當a的最高位為1時條件成立.這條語句判斷變量a的 if(a&0x80) //當a的最高位為1時條件成立.這條語句判斷變量a的 //最高位以此決定程序的流向,大家可以寫個數(shù)據(jù)試一下即可明白 SER=1; //數(shù)據(jù)端發(fā)送數(shù)據(jù)1 else SER=0; //數(shù)據(jù)端發(fā)送數(shù)據(jù)0 //a<<=1; SCK=1; //數(shù)據(jù)輸入脈沖,上升沿 SCK=0; //數(shù)據(jù)輸入脈沖,下降沿,一升一降為1個脈沖 a=a<<1; //數(shù)據(jù)左移一位,然后進入下一個循環(huán)按位與。直到8位數(shù)據(jù)發(fā)送完畢 } } /********************************************************************** 函 數(shù) 名:數(shù)碼管顯示函數(shù) 函數(shù)功能:595驅動3位數(shù)碼管 **********************************************************************/ void shumaguan() { send_595(bit_code[ct]); //片選數(shù)碼管 send_595(Dis_buff[ct]); //數(shù)碼管數(shù)據(jù) RCK=1; //數(shù)據(jù)鎖存打開 RCK=0; //數(shù)據(jù)鎖存關閉 delay_1ms(5000); //消隱 if(ct<7) //數(shù)碼管8位顯示動態(tài) ct++; else ct=0; Dis_buff[0]=SEG_code[0]; //數(shù)碼管第一位顯示 0 Dis_buff[1]=SEG_code[1]; //數(shù)碼管第二位顯示 1 Dis_buff[2]=SEG_code[2]; //數(shù)碼管第三位顯示 2 Dis_buff[3]=SEG_code[3]; //數(shù)碼管第四位顯示 3 Dis_buff[4]=SEG_code[4]; //數(shù)碼管第五位顯示 4 Dis_buff[5]=SEG_code[5]; //數(shù)碼管第六位顯示 5 Dis_buff[6]=SEG_code[6]; //數(shù)碼管第七位顯示 6 Dis_buff[7]=SEG_code[7]; //數(shù)碼管第八位顯示 7 //Dis_buff[8]=SEG_code[8]; //數(shù)碼管第九位顯示 8 //Dis_buff[9]=SEG_code[9]; //數(shù)碼管第十位顯示 9 } |
代碼呢?要不我?guī)湍闼阋回裕?/td> |