|
刚学单片机没多久,现在下想写一个程序,按下矩阵键盘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);
- // }
- // }
- }
- }
复制代码 |
|