![]() |
發布時間: 2024-1-20 22:27
正文摘要:#include "STC8H.h" #include "intrins.h" sbit key1 = P0^3 ; sbit key2 = P5^4 ; sbit key3 = P3^6 ; sbit key4 = P3^7 ; sbit led1 = P2^4 ; sbit led2 = P2^5 ... |
要把IO口設置為準雙向口, 然后接5K-10K的上拉電阻, 通過按鍵接地, 當按鍵按下后, IO電平為低, 程序讀取IO口電平, 就能判斷是否有按鍵被按下了. |
lkc8210 發表于 2024-1-23 21:25 消隱問題 |
不說一下數碼管程序顯示亮度不一致原因是什么嗎? 中斷里不要用延時! 中斷里不要用延時! 中斷里不要用延時! |
tyrl800 發表于 2024-1-21 09:26 /*按鍵K1K2加減數字數碼管顯示 按鍵K3K4加減數碼管顯示 #include "STC8H.h" #include "intrins.h" unsigned char NixieTable[]={ 0x03,/*0*/ 0x9F,/*1*/ 0x25,/*2*/ 0x0D,/*3*/ 0x99,/*4*/ 0x49,/*5*/ 0x41,/*6*/ 0x1F,/*7*/ 0x01,/*8*/ 0x09,/*9*/}; sbit k1 = P0^3 ; sbit k2 = P5^4 ; sbit k3 = P3^6 ; sbit k4 = P3^7 ; unsigned int Num,Num1; void Delay1ms() //@11.0592MHz { unsigned char i, j; i = 15; j = 90; do { while (--j); } while (--i); } void DelayXms(unsigned int x) //@11.0592MHz { while (--x) { Delay1ms(); } } void Led_Seg(unsigned int date) //顯示函數 { unsigned int a,b,c; a=date/100%10; //求百位 b=date/10%10; //求十位 c=date%10; //求個位 P14=1;P15=1;P33=1; P2=NixieTable[a];//百位 P14=0;P15=1;P33=1; DelayXms(5); P14=1;P15=1;P33=1; P2=NixieTable;//十位 P15=0;P33=1;P14=1; DelayXms(5); P14=1;P15=1;P33=1; P2=NixieTable[c];//個位 P33=0;P14=1;P15=1; DelayXms(5); } void Led_Seg1(unsigned int date) //顯示函數 { unsigned int a,b,c; a=date/100%10; //求百位 b=date/10%10; //求十位 c=date%10; //求個位 P00=1;P01=1;P02=1; P2=NixieTable[a];//百位 P00=0;P01=1;P02=1; DelayXms(5); P00=1;P01=1;P02=1; P2=NixieTable;//十位 P00=1;P01=0;P02=1; DelayXms(5); P00=1;P01=1;P02=1; P2=NixieTable[c];//個位 P00=1;P01=1;P02=0; DelayXms(5); } unsigned char keyscan() { char x=0; if ( k1 == 0|k2 == 0|k3 == 0|k4 == 0) { DelayXms(10); if ( k1 == 0|k2 == 0|k3 == 0|k4 == 0) { if (k1 == 0) x=1; else if (k2 == 0) x=2; else if (k3 == 0) x=3; else x=4; while ( k1 == 0|k2 == 0|k3 == 0|k4 == 0); } } return(x); } void Timer0_init() //1ms { AUXR &= 0x7F; //定時器時鐘12T模式 TMOD &= 0xF0; //設置定時器模式 TL0 = 0xCD; //設置定時初始值 TH0 = 0xD4; //設置定時初始值 TF0 = 0; //清除TF0標志 TR0 = 1; //定時器0開始計時 ET0 = 1; //開T0中斷 EA=1; } void main () { P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0xc0; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; k1=k2=k3=k4=1; Num=123;Num1=456; Timer0_init() ; while(1) { unsigned char y; y=keyscan(); if(y!=0) { if(y==1) Num++; else if(y==2) Num--; else if(y==3) Num1 ++; else Num1--; } } } void TM1_Isr0()interrupt 1 //數碼管掃描定時器0 { unsigned int s; if(++s>1) { s=0; Led_Seg(Num);P00=1; Led_Seg1(Num1); } } 看看這個四個按鍵分別控制兩組三位數碼管加減 |
發硬件原理圖看下,按鍵IO要上拉。 |
是不是|改成|| |
newlined 發表于 2024-1-21 07:48 P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; IO口設為準雙向,也是,一樣的 |
newlined 發表于 2024-1-21 21:46 這樣也是沒有反應 |
newlined 發表于 2024-1-21 21:42 也是沒有用的 |
P0=0xff;P2=0xff;P3=0xff;P5=0xff; |
P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; 這樣試試 |
newlined 發表于 2024-1-21 07:48 P0M0 = 0x07; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0xc0; P2M0 = 0xff; P2M1 = 0x00; P3M0 = 0x3c; P3M1 = 0x00; 沒問題啊 |
newlined 發表于 2024-1-21 07:56 IO口設置沒問題啊 |
程序沒問題,檢查硬件 |
我看您的按鍵口設成了推挽輸出?這樣它是不會變低的,如果您的按鍵口沒有限流電阻,說不定會燒掉。 |