|
自學(xué)了一點單片機知識,寫了一個6x6矩陣鍵盤,用的行列掃描法,P1P3口是鍵盤口,P0是液晶屏口,按下按鍵液晶屏輸出字符,液晶相關(guān)代碼是百度的,大佬們見笑了
電路原理圖如下:
pro.PNG (99.76 KB, 下載次數(shù): 58)
下載附件
仿真
2020-3-31 14:08 上傳
單片機源程序如下:
#include "reg51.h"
#include <math.h>
#include <stdio.h>
sbit rs=P2^6; //指令or數(shù)據(jù) RD
sbit wela=P2^5; //讀or寫 WR
sbit lcden=P2^7; //使能信號LCD
unsigned int KeyValue,KeyState;
//************************************************************************/
// 描述: 延時t us函數(shù)
//************************************************************************/
void LCD_Delay_us(unsigned int t)
{
while(t--); //t=0,退出
}
//************************************************************************/
// 描述: 延時t ms函數(shù)
//************************************************************************/
void LCD_Delay_ms(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++) //執(zhí)行t次循環(huán)
for(j=0;j<113;j++) //執(zhí)行113次循環(huán)
;
}
//************************************************************************/
// 描述: 1602液晶寫指令
//************************************************************************/
void write_com(unsigned char com) //1602液晶寫指令
{
rs=0; //寫指令
lcden=0; //使能1602
P0=com; //寫入指令com
LCD_Delay_ms(1); //延時1ms
lcden=1; //使能1602
LCD_Delay_ms(2); //延時2ms
lcden=0; //使能1602
}
//************************************************************************/
// 描述:1602液晶寫數(shù)據(jù)
//************************************************************************/
void write_date(unsigned char date) //1602液晶寫數(shù)據(jù)
{
rs=1; //寫數(shù)據(jù)
lcden=0; //使能1602
P0=date; //寫入數(shù)據(jù)date
LCD_Delay_ms(1); //延時1ms
lcden=1; //使能1602
LCD_Delay_ms(2); //延時2ms
lcden=0; //使能1602
}
//************************************************************************/
// 描述:指定x,y寫入字符函數(shù)
//************************************************************************/
void W_lcd(unsigned char x,unsigned char y,unsigned char Data)
{
if (y == 0){write_com(0x80 + x);} //第一行
else{write_com(0xc0 + x);} //第二行
write_date( Data); //寫入數(shù)據(jù)
}
//指定x,y寫入字符串函數(shù)
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0){write_com(0x80 + x);} //第一行
else{write_com(0xC0 + x);} //第二行
while (*s) //
{write_date( *s); s++;} //寫入數(shù)據(jù)
}
//************************************************************************/
// 描述:初始化液晶,及畫面初始化
//************************************************************************/
void init_lcd(void) //初始化液晶,及畫面初始化
{
wela=0; //寫液晶
lcden=0; //使能1602
write_com(0x38); //8 位總線,雙行顯示,5X7 的點陣字符
LCD_Delay_us(100); //延時100us
write_com(0x0F); //開顯示,有光標(biāo),閃爍
write_com(0x06); //光標(biāo)右移動
write_com(0x01); //清屏
write_com(0x80); //DDRAM 地址歸0
}
//鍵盤輸入函數(shù)**********************************************************************
void KeyDown(void)
{
char a=0;
P3=0x3f;
P1=0x00;
KeyState=0;
if(P3!=0x3f)//讀取按鍵是否按下
{
LCD_Delay_ms(10);//延時10ms進(jìn)行消抖
if(P3!=0x3f)//再次檢測鍵盤是否按下
{
P3=0x3f;
P1=0x00;
KeyState=1;
switch(P3) //P3口選擇
{
case(0x3e): KeyValue=0;break;
case(0x3d): KeyValue=1;break;
case(0x3b): KeyValue=2;break;
case(0x37): KeyValue=3;break;
case(0x2f): KeyValue=4;break;
case(0x1f): KeyValue=5;break;
}
P1=0x3f; //高低電平對調(diào)
P3=0x00;
switch(P1) //檢測P1口
{
case(0x3e): KeyValue=KeyValue;break;
case(0x3d): KeyValue=KeyValue+6;break;
case(0x3b): KeyValue=KeyValue+12;break;
case(0x37): KeyValue=KeyValue+18;break;
case(0x2f): KeyValue=KeyValue+24;break;
case(0x1f): KeyValue=KeyValue+30;break;
//default: KeyValue=0;
}
while(P1!=0x3f) //檢測按鍵松手檢測
{
LCD_Delay_ms(10);
a++;
}
}
}
}
//***********************************************************************
void main()
{
unsigned char a[]="0123456789abcdefghigklmnopqrstuvwxyz";
init_lcd() ;
while(1)
{
KeyDown();
if(KeyState)
{
write_date(a[KeyValue]);
KeyState=0;
}
}
}
|
評分
-
查看全部評分
|