9.17キーボードの操作

6420 ワード

キーボードの応用と分類:
キーボードは符号化キーボードと非符号化キーボードに分けられ、キーボード上の閉鎖キーの識別は専門のハードウェアエンコーダによって実現され、キー符号化番号またはキー値を生成する符号化キーボード、例えばコンピュータのキーボード
ソフトウェアプログラミングによって識別される非符号化キーボードと呼ばれる.
モノリシックマシンからなる様々なシステムの中で、最も多く使われているのは非符号化キーボードであり、符号化キーボードの
非符号化キーボードには、独立したキーボードとマトリクスキーボードもあります.
まずキーボードのように1を書きます.読み込み操作
サンプルコード:
#include<reg52.h>

#define uint unsigned int 

#define uchar unsigned char



sbit ld1 = P1^0;

sbit key1 = P3^4;

sbit dula = P2^6;

sbit wela = P2^7;

uchar num;

uchar code table[]={0x3f,0x06,0x5b,0x4f,

                    0x66,0x6d,0x7d,0x07,

                    0x7f,0x6f,0x77,0x7c,

                    0x39,0x5e,0x79,0x71};

void display(num);

main()

{

    P3 = 0xff;

    while(1)

    {

        display(num);

        if(key1==0)

        {

            ld1 = 0;

            num++;

            if(num==10)

                num = 0;

             while(key1!=1);//  

            

        }

        else 

            ld1 = 1;

    }

        

}

void display(num)

{    

    wela  = 1;

    P0 = 0xfe;

    wela = 0;



    P0 = 0x0;



    dula = 1;

    P0 = table[num];

    dula = 0;

    

    dula = 1;// 

    P0 = 0x0;

    dula = 0;



    

}

View Code 


このプログラムは手抜かりがないように見えますが、実際の過程で、かなり大きなバグがあります.それは、キーボードを押している間に、デジタルチューブが数字を表示しないので、お父さんではありません.だから、ビット信号は最初から開く正しいコードです.
#include<reg52.h>

#define uint unsigned int 

#define uchar unsigned char



sbit ld1 = P1^0;

sbit key1 = P3^4;

sbit dula = P2^6;

sbit wela = P2^7;

uchar num;

uchar code table[]={0x3f,0x06,0x5b,0x4f,

					0x66,0x6d,0x7d,0x07,

					0x7f,0x6f,0x77,0x7c,

					0x39,0x5e,0x79,0x71};

void display(num);

main()

{

	P3 = 0xff;

	wela = 1;

	P0 = 0xfe;// 

	wela = 0;



	while(1)

	{

	

		if(key1==0)

		{

			ld1 = 0;

			num++;

			if(num==10)

				num = 0;

			 while(key1!=1);//  

			

		}

		else 

			ld1 = 1;



		dula = 1;

		P0 = table[num];//  

		dula = 0;

	}

		

}


デブレーブ:キーが触れるとブレが発生するので、デブレーブ操作を行います
ハードウェアのジッタ除去とソフトウェアのジッタ除去
ハードウェアの振れは専門のハードウェアの振れ回路を使う必要があって、外部の回路が複雑になって、単片機の中で使う必要はありません
ソフトウェアの振れは、一般的に5ミリ秒の遅延検出です
#include<reg52.h>

#define uint unsigned int 

#define uchar unsigned char



sbit ld1 = P1^0;

sbit key1 = P3^4;

sbit dula = P2^6;

sbit wela = P2^7;

uchar num;

uchar code table[]={0x3f,0x06,0x5b,0x4f,

					0x66,0x6d,0x7d,0x07,

					0x7f,0x6f,0x77,0x7c,

					0x39,0x5e,0x79,0x71};



void delay(uint x);

main()

{

	P3 = 0xff;

	wela = 1;

	P0 = 0xfe;// 

	wela = 0;



	while(1)

	{

	

		if(key1==0)

		{

			delay(10);// 

			if(key1 == 0)// 

			{	

				ld1 = 0;

				num++;

				if(num==10)

					num = 0;

			 	while(key1!=1);//  

			 	delay(10);		// 

				while(!key1);

			}

			

		}

		else 

			ld1 = 1;



		dula = 1;

		P0 = table[num];//  

		dula = 0;

	}

		

}



void delay(uint x)

{

	uint y,z;

	for(y=x;y>0;y--)

		for(z=110;z>0;z--);

}


 
マトリックスキーボード:マトリックスキーボードでもスタンドアロンキーボードでも、モノリシックマシンが押されたかどうかを検出する根拠は同じです.つまり、このキーボードに対応するI/Oポートがローレベルであるかどうかを検出します.スタンドアロンキーボードには一定のローレベルがあります.モノリシックマシンがプログラムを書くときの検出は便利です.回路時のマトリックスキーボードの両端はモノリシックマシンdeI/Oポートに接続されています.残りはすべてハイレベルで、この時私たちは列数を確定して、それからすぐに順番に各行がローレベルであるかどうかを検出して、ある行為のローレベル(これは私たちが行数を確定した)を検出して、私たちはどの行のどの列のボタンが押されたかを確定することができます.
サンプルコード:
#include<reg52.h>

sbit wela =P2^6;

sbit dula = P2^7;

#define uchar unsigned char

#define uint unsigned int 



void delay(uint z);

uchar num,num1,temp;

uchar keyscan();

uchar code table[]={0x3f,0x06,0x5b,0x4f,

					0x66,0x6d,0x7d,0x07,

					0x7f,0x6f,0x77,0x7c,

					0x39,0x5e,0x79,0x71,0x0};

					

main()

{

	wela = 1;

	P0 = 0x0;

	wela = 0;

	

	while(1)

	{

		num1 = keyscan();

		dula =1;

		P0 = table[num1];

		dula = 0;

		}

}



void delay(uint z)

{

	uint x,y;

	for(x=z;x>0;x--)

		for(y=110;y>0;y--);	

}





uchar keyscan()

{

	P3 = 0xfe;//1111 1110

		temp = P3;

		temp = temp&0xf0;//11110000

		while(temp!=0xf0)// 

		{

			delay(5);// P3 

			temp = P3;

			temp = temp&0xf0;

			while(temp!=0xf0)

			{

				temp = P3;	

				switch(temp)

				{

					case 0x7e:num = 1;

						break;

					case 0xbe:num = 2;

						break;

					case 0xde:num = 3;

						break;

					case 0xee:num = 4;

						break;

					

				}

				while(temp!=0xf0)// 

				{

					temp = P3;

					temp = temp&0xf0;

				}

			

			}

		}



		

		P3 = 0xfd;//1111 1101

		temp = P3;

		temp = temp&0xf0;//11110000

		while(temp!=0xf0)// 

		{

			delay(5);// P3 

			temp = P3;

			temp = temp&0xf0;

			while(temp!=0xf0)

			{

				temp = P3;	

				switch(temp)

				{

					case 0x7d:num = 5;

						break;

					case 0xbd:num = 6;

						break;

					case 0xdd:num = 7;

						break;

					case 0xed:num = 8;

						break;

					

				}

				while(temp!=0xf0)// 

				{

					temp = P3;

					temp = temp&0xf0;

				}

		

			}

		}







		P3 = 0xfb;//1111 1011

		temp = P3;

		temp = temp&0xf0;//11110000

		while(temp!=0xf0)// 

		{

			delay(5);// P3 

			temp = P3;

			temp = temp&0xf0;

			while(temp!=0xf0)

			{

				temp = P3;	

				switch(temp)

				{

					case 0x7b:num = 9;

						break;

					case 0xbb:num = 10;

						break;

					case 0xdb:num = 11;

						break;

					case 0xeb:num = 12;

						break;

					

				}

				while(temp!=0xf0)// 

				{

					temp = P3;

					temp = temp&0xf0;

				}

	

			}

		}



		P3 = 0xf7;//1111 0111

		temp = P3;

		temp = temp&0xf0;//11110000

		while(temp!=0xf0)// 

		{

			delay(5);// P3 

			temp = P3;

			temp = temp&0xf0;

			while(temp!=0xf0)

			{

				temp = P3;	

				switch(temp)

				{

					case 0x77:num = 13;

						break;

					case 0xb7:num = 14;

						break;

					case 0xd7:num = 15;

						break;

					case 0xe7:num = 16;

						break;

					

				}

				while(temp!=0xf0)// 

				{

					temp = P3;

					temp = temp&0xf0;

				}

	

			}

		}

		

		return num;



}


ボタン操作の数字は規則的で、第1の行為は0 xfeで、それでは次の数は7 bdeで、eを加えて、0 x 7 e、0 xbe、0 xde、0 xee
2行目は0 xfdで、次の数は7 bdeで、d,0 x 7 d,0 xbd,0 xdd,0 xedを加えます.
3行目は0 xfbで、次の数は7 bdeで、b、0 x 7 b、0 xbb、0 xdb、0 xebを加えて、
4行目は0 xf 7で、次の数は7 bdeで、7,0 x 77,0 xb 7,0 xd 7,0 xe 7を加えます.
著作権所有、転載はリンクアドレスを明記してください:http://www.cnblogs.com/fengdashen/p/3327186.html