|
剛學單片機沒多久,現在下想寫一個程序,按下矩陣鍵盤S6的時候點陣最外圈亮,然后按下S11讓點陣熄滅,我現在寫出來讓點陣亮的程序了,但是怎么讓它熄滅呢?我代碼里面注釋掉的原本是想讓點陣熄滅的代碼,但是發現并不可行。我將注釋掉的部分寫到 if(key_number==0) 里面的while(1)循環里面也不可行。
另外我打開單片機電源的時候點陣也會亮,但是并沒有規律,每次打開亮的圖形都不一樣,是怎么回事?就像最下面兩張圖那樣子。
單片機源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- sbit DIO=P3^4;
- sbit S_CLK=P3^5;
- sbit R_CLK=P3^6;
- unsigned char key_number=1;
- unsigned char table1[8]={0x00,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x00};
- unsigned char ximie[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
- void delay(unsigned int x)
- {
- unsigned char i, j;
- while(x>0){
- _nop_();
- i = 2;
- j = 199;
- do
- {
- while (--j);
- } while (--i);
- x--;
- }
- }
- void KeyScan()
- {
- P3=0xf0;//列掃描
- if(P3!=0xf0)
- {
- delay(10);
- if(P3!=0xf0)
- {
- switch(P3)
- {
- case 0xe0:key_number=0;break;
- case 0xd0:key_number=1;break;
- case 0xb0:key_number=2;break;
- case 0x70:key_number=3;break;
- }
- P3=0x0f;//列掃描
- switch(P3)
- {
- case 0x0e:key_number=key_number;break;
- case 0x0d:key_number=key_number+4;break;
- case 0x0b:key_number=key_number+8;break;
- case 0x07:key_number=key_number+12;break;
- }
- }
- }
- }
- void Send_Byte(unsigned char dat)
- {
- unsigned char i;
- R_CLK=0;
- for(i=0;i<8;i++)
- {
- S_CLK=0;
- if(dat&0x01)
- DIO=1;
- else
- DIO=0;
- S_CLK=1;
- dat>>=1;
- }
- }
- void main()
- {
- while(1)
- {
- unsigned char k,ROW;
- ROW=0x80;
- KeyScan();
- if(key_number==0)
- {
- while(1)
- {
- for(k=0;k<8;k++)
- {
- Send_Byte(table1[k]);
- Send_Byte(ROW);
- R_CLK=1;
- ROW=_cror_(ROW,1);
- }
- }
- }
- // if(key_number==5)
- // {
- // for(k=0;k<8;k++)
- // {
- // Send_Byte(ximie[k]);
- // Send_Byte(ROW);
- // R_CLK=1;
- // ROW=_cror_(ROW,1);
- // }
- // }
- }
- }
復制代碼 |
|