❶ 急求一個基於89C51單片機,8255A,用矩陣鍵盤輸入數字,並在LCD1602上顯示出來的C語言程序
#include<reg52.h>
#include<absacc.h>
#definePAXBYTE[0xF8FF]
#definePBXBYTE[0xF9FF]
#definePCXBYTE[0xFAFF]
#defineCOMXBYTE[0xFBFF]
#defineLCD1602_RS_SET() PB|=1<<0
#defineLCD1602_RS_RST() PB&=~(1<<0)
#defineLCD1602_RW_RST() PB&=~(1<<1)
#defineLCD1602_E_SET() PB|=1<<2
#defineLCD1602_E_RST() PB&=~(1<<2)
staticvoidDelay_ms(unsignedchartime)
{
unsignedchari;
while(time--)
{
for(i=0;i<100;i++);
}
}
staticvoidLCD1602_WriteByte(unsignedcharvalue,bitdataTypedef)
{
if(dataTypedef)
LCD1602_RS_SET();
else
LCD1602_RS_RST();
LCD1602_RW_RST();
PA=value;
LCD1602_E_SET();
Delay_ms(2);
LCD1602_E_RST();
}
staticvoidLCD1602_Init(void)
{
LCD1602_WriteByte(0x38,0);
Delay_ms(10);
LCD1602_WriteByte(0x01,0);
Delay_ms(10);
LCD1602_WriteByte(0x06,0);
Delay_ms(10);
LCD1602_WriteByte(0x0C,0);
Delay_ms(10);
}
staticvoidLCD1602_ShowString(unsignedcharaddress,unsignedchar*string)
{
LCD1602_WriteByte(address,0);
while(*string)
{
LCD1602_WriteByte(*string++,1);
}
}
=0xFF;
sbitKEY1=KeyStatus^4;
sbitKEY2=KeyStatus^5;
sbitKEY3=KeyStatus^6;
sbitKEY4=KeyStatus^7;
staticunsignedcharKeyValue=48;
staticvoidKEY_Testing(void)
{
PC=0xFE;
KeyStatus=PC&0xFF;
if(KeyStatus!=0xFF)
{
if(!KEY1)KeyValue='7';
if(!KEY2)KeyValue='8';
if(!KEY3)KeyValue='9';
if(!KEY4)KeyValue='/';
}
PC=0xFD;
KeyStatus=PC&0xFF;
if(KeyStatus!=0xFF)
{
if(!KEY1)KeyValue='4';
if(!KEY2)KeyValue='5';
if(!KEY3)KeyValue='6';
if(!KEY4)KeyValue='*';
}
PC=0xFB;
KeyStatus=PC&0xFF;
if(KeyStatus!=0xFF)
{
if(!KEY1)KeyValue='1';
if(!KEY2)KeyValue='2';
if(!KEY3)KeyValue='3';
if(!KEY4)KeyValue='-';
}
PC=0xF7;
KeyStatus=PC&0xFF;
if(KeyStatus!=0xFF)
{
if(!KEY1)KeyValue='?';
if(!KEY2)KeyValue='0';
if(!KEY3)KeyValue='=';
if(!KEY4)KeyValue='+';
}
}
voidmain()
{
COM=0x88;
PA=0xFF;
PB=0xFF;
PC=0xFF;
LCD1602_Init();
LCD1602_ShowString(0x82,"HelloWorld!");
LCD1602_ShowString(0xC0,"KeyPressed--->");
while(1)
{
KEY_Testing();
LCD1602_WriteByte(0xCF,0);
LCD1602_WriteByte(KeyValue,1);
}
}
❷ 求基於8051單片機用C語言編寫的雙矩陣鍵盤掃描程序(5個IO口控制25個按鍵)
怎麼可能會出現優先順序的問題,有鍵按下就是有鍵按下,沒鍵按下就是沒鍵按下。行列式鍵盤有兩種處理方法,一種是行優先法,一種是列優先法。通常按鍵處理要軟體去抖動,即判斷有鍵按下時要延時20~30ms再檢測,避開抖動。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
/*延時1ms*/
void Delay(uint z)
{
uint i;
while(z--)
{
for(i=120;i>0;i--)
}
}
/*鍵掃描函數*/
uchar KeyScan()
{
uint i;
uchar h="0xef",b,c;
for(i=5,P1=h;i>0;i--)
{
if((P1&0x0f)!=0x0f)
{
Delay(30);
if((P1&0x0f)!=0x0f)
{
uchar key,p;
p=P1;
for(key=0;key<25;key++)
{
if(p==keytab[key])
{
do{
_nop_();
}while((P1&0x0f)==0x0f); //等待按鍵放開,很重要
//P1=0xff;
return(key);
}
}
}
}
}
}
❸ 51單片機 c語言編程 4*4矩陣鍵盤如何實現等待按鍵松開功能
uchar shaomiao()
{
uchar l,h;
P1=0xf0;//獲取高四位抄信息。在此低四位接到行。行低電平
l=P1|0x0f;
P1=l;//只把被按下鍵所在列置低
h=P1|0xf0;
switch(h)
{
case 0xfe:h=0;break;//1111 1110
case 0xfd:h=1;break;
case 0xfb:h=2;break;
case 0xf7:h=3;break;
}
switch(l)
{
case 0xef:l=0;break;//1110 1111
case 0xdf:l=1;break;
case 0xbf:l=2;break;
case 0x7f:l=3;break;
}
P1=0xf0;
/******你說的關鍵問題解決如下******/
while(P1!=0xf0)
{
while(P1!=0xf0);//等待放開按鍵
delayms(50);//防止抖動
}
return(h*4+l);
}
❹ 單片機中獨立鍵盤和矩陣鍵盤如何一起使用 請用C語言寫個程序說明,謝謝。
這個很好處理呀,比如以下舉例,獨立+矩陣,實現獨立按鍵相當於類似SHIFT作用的效果。
#include<reg51.h>
#define uchar unsigned char
uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0到f
uchar keyval,num;
sbit skey=P1^0; //獨立鍵P1.0
void delay(uchar a)
{
uchar i,j;
for(i=0;i<a;i++)
for(j=0;j<125;j++);
}
uchar kbscan(void) //矩陣鍵掃描程序
{
unsigned char sccode,recode;
P3=0x0f; //發0掃描,列線輸入
if ((P3 & 0x0f) != 0x0f) //有鍵按下
{
delay(20); //延時去抖動
if ((P3&0x0f)!= 0x0f)
{
sccode = 0xef; //逐行掃描初值
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
while((P3&0x0f)!=0x0f);//等待鍵抬起
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return 0; //無鍵按下,返回0
}
void getkey(void)
{
unsigned char key;
key=kbscan();
if(key==0)
{
return;
}
switch(key)
{
case 0x11:keyval=7;break;
case 0x12:keyval=4;break;
case 0x14:keyval=1;break;
case 0x18:keyval=10;break;
case 0x21:keyval=8;break;
case 0x22:keyval=5;break;
case 0x24:keyval=2;break;
case 0x28:keyval=0;break;
case 0x41:keyval=9;break;
case 0x42:keyval=6;break;
case 0x44:keyval=3;break;
case 0x48:keyval=11;break;
case 0x81:keyval=12;break;
case 0x82:keyval=13;break;
case 0x84:keyval=14;break;
case 0x88:keyval=15;break;
default:keyval=0xff;break;
}
//以下處理獨立按鍵
if(skey==0)
{
if(keyval!=0xff)keyval+=16; //如果獨立鍵按下,鍵值加16
while(skey==0); //等待獨立鍵釋放
}
}
void t0isr() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
switch(num)
{
case 0:P2=0x01;break;
case 1:P2=0x02;break;
case 2:P2=0x04;break;
case 3:P2=0x08;break;
default:break;
}
if(keyval<16) P0=~tab[keyval]; //獨立鍵未按正常顯示
else P0=~(tab[keyval]|0x80); //獨立鍵按下顯示+DP
num++;
num&=0x03;
}
main()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
getkey();
}
}
❺ 求 關於 用單片機和4*4矩陣鍵盤輸入數字並在LCD1602上顯示出來的C語言程序
這個你看看可以參考!
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
//這三個引腳參考資料
sbit E=P2^7; //1602使能引腳
sbit RW=P2^6; //1602讀寫引腳
sbit RS=P2^5; //1602數據/命令選擇引腳
/********************************************************************
* 名稱 : Delay_1ms()
* 功能 : 延時子程序,延時時間為 1ms * x
* 輸入 : x (延時一毫秒的個數)
* 輸出 : 無
***********************************************************************/
void Delay_1ms(uint i)//1ms延時
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
* 名稱 : delay()
* 功能 : 延時,延時時間大概為5US。
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/********************************************************************
* 名稱 : bit Busy(void)
* 功能 : 這個是一個讀狀態函數,讀出函數是否處在忙狀態
* 輸入 : 輸入的命令值
* 輸出 : 無
***********************************************************************/
bit Busy(void)
{
bit busy_flag = 0;
RS = 0;
RW = 1;
E = 1;
delay();
busy_flag = (bit)(P0 & 0x80);
E = 0;
return busy_flag;
}
/********************************************************************
* 名稱 : wcmd(uchar del)
* 功能 : 1602命令函數
* 輸入 : 輸入的命令值
* 輸出 : 無
***********************************************************************/
void wcmd(uchar del)
{
while(Busy());
RS = 0;
RW = 0;
E = 0;
delay();
P0 = del;
delay();
E = 1;
delay();
E = 0;
}
/********************************************************************
* 名稱 : wdata(uchar del)
* 功能 : 1602寫數據函數
* 輸入 : 需要寫入1602的數據
* 輸出 : 無
***********************************************************************/
void wdata(uchar del)
{
while(Busy());
RS = 1;
RW = 0;
E = 0;
delay();
P0 = del;
delay();
E = 1;
delay();
E = 0;
}
/********************************************************************
* 名稱 : L1602_init()
* 功能 : 1602初始化,請參考1602的資料
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void L1602_init(void)
{
wcmd(0x38);
wcmd(0x0c);
wcmd(0x06);
wcmd(0x01);
}
/********************************************************************
* 名稱 : L1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字元顯示"b" ,調用該函數如下
L1602_char(1,5,'b')
* 輸入 : 行,列,需要輸入1602的數據
* 輸出 : 無
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
wcmd(a);
wdata(sign);
}
/********************************************************************
* 名稱 : L1602_string(uchar hang,uchar lie,uchar *p)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字元開始顯示"ab cd ef" ,調用該函數如下
L1602_string(1,5,"ab cd ef;")
* 輸入 : 行,列,需要輸入1602的數據
* 輸出 : 無
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a,b=0;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
while(1)
{
wcmd(a++);
b++;
if((*p == '\0')||(b==16)) break;
wdata(*p);
p++;
}
}
/********************************************************************
* 名稱 : Keyscan()
* 功能 : 實現按鍵的讀取。下面這個子程序是按處理 矩陣鍵盤 的基本方法處理的。
* 輸入 : 無
* 輸出 : 按鍵值
***********************************************************************/
uchar Keyscan(void)
{
uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};
for(j=0; j<4; j++)
{
P1 = Buffer[j];
temp = 0x10;
for(i=0; i<4; i++)
{
if(!(P1 & temp))
{
return (i+j*4);
}
temp <<= 1;
}
}
}
/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Main(void)
{
uchar Key_Value; //讀出的鍵值
L1602_init();
L1602_string(1,1," 4*4 KeyBoard ");
L1602_string(2,1,"You Press The ");
while(1)
{
P1 = 0xf0;
if(P1 != 0xf0)
{
Delay_1ms(20); //按鍵消抖
if(P1 != 0xf0)
{
Delay_1ms(20); //按鍵消抖
if(P1 != 0xf0)
{
Key_Value = Keyscan();
}
}
}
L1602_char(2,15,Key_Value / 10 + 48);
L1602_char(2,16,Key_Value % 10 + 48);
}
}
❻ C51單片機4X4矩陣鍵盤檢測程序問題
P3=0xfe; //P3=0b1111 1110,令P3.0=0,同時令高四位為高電平,作好讀埠准備(51IO特點)
temp=P3; //讀回P3口的狀態
temp=temp&0xf0; //temp&1111 0000,0與任何數結果為0,把temp變數的低四位屏蔽了,高四位因為任何數與1等於它本身,所以把高四位對應的埠狀態讀進來。
while(temp!=0xf0) //上步處理後,高四為不全為1,說明有按鍵按下(結合矩陣鍵盤的電路結構才能理解,這里不方便上圖)
{
delay(5);
temp=P3;
temp=temp&0xf0;//這三句跟上面重復,功能是軟體消抖
while(temp!=0xf0) //延時一段時間後判斷還有按鍵按下,說明是真有按鍵按下,進入按鍵掃描與鍵值的判斷,否則可能是意外抖動引起的,就不進行按鍵掃描。
{
temp=P3;
switch(temp).....
我想注釋完應該能讀懂,關鍵是要理解矩陣鍵盤的掃描原理。