欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機矩陣鍵盤模擬手機鍵盤輸入西文字符和數字源程序分享
[打印本頁]
作者:
lyqhlly
時間:
2018-4-20 17:31
標題:
單片機矩陣鍵盤模擬手機鍵盤輸入西文字符和數字源程序分享
大三的時候做的單片機課程設計源代碼
STC89C52單片機,用的LCD1602液晶顯示屏和4*4的矩陣鍵盤
功能大致就是選定9個按鍵進行a~z 0~9的輸入,并能通過兩個按鍵移動光標選擇輸入的位置。
本貼分享的是源代碼
單片機源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_DB P0
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^5;
#define RS_CLR RS=0
#define RS_SET RS=1
#define RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
#define DataPort P0
uchar code table[]={'A','B','C'};
uchar code table1[]={'D','E','F'}; //
uchar code table2[]={'G','H','I'};
uchar code table3[]={'J','K','L'};
uchar code table4[]={'M','N','O'}; //
uchar code table5[]={'P','Q','R'};
uchar code table6[]={'S','T','U'};
uchar code table7[]={'V','W','X'};
uchar code table8[]={'Y','Z','!'};//
unsigned char code KeyCode[] = { //4*4矩陣鍵盤按鍵編碼
0xE7, 0xD7, 0xB7, 0x77, 0xEB, 0xDB, 0xBB, 0x7B,
0xED, 0xDD, 0xBD, 0x7D, 0xEE, 0xDE, 0xBE, 0x7E,
};
uchar num1,num2,num3,num4,num5,num6,num7,num8,num9,key=15;\
char j,k;
void light(uchar x,uchar y);
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void LCD_Write_Com(uchar com)
{
delayms(5);
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;
_nop_();
EN_CLR;
}
void LCD_Write_Data(uchar Data)
{
delayms(5);
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
}
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
delayms(5);
}
void light(uchar x,uchar y) //光標位置
{
if (y == 0)
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
}
void LCD_Write_Char(uchar x,uchar y,uchar Data) //LCD 寫
{
light( x,y);
LCD_Write_Data( Data);
light(x, y);
}
void LCD_Init(void) //lcd初始化
{
LCD_Write_Com(0x38);
delayms(5);
LCD_Write_Com(0x38);
delayms(5);
LCD_Write_Com(0x38);
delayms(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08);
LCD_Write_Com(0x01);
LCD_Write_Com(0x06);
delayms(5);
LCD_Write_Com(0x0C);
LCD_Write_Com(0x0F); //顯示光標以及光標閃爍
}
void ScanKeyboard() //鍵盤掃描程序
{
unsigned char scan1,scan2,keyboard;
unsigned char i;
P2 = 0xf0; //4條行線輸出低電平,4條列線作為輸出
scan1 = P2; //讀取列線狀態
if((scan1&0xf0)!=0xf0) //判斷是否有鍵按下
{
delayms(10); //延時去抖
scan1 = P2; //再次讀取列線狀態
if((scan1&0xf0)!=0xf0) //再次判斷是否有鍵按下
{
P2 = 0x0f; //4條列線輸出低電平,4條行線作為輸出
scan2 = P2; //讀取行線狀態
keyboard = scan1 | scan2; //組合鍵值
while((P2&0x0f)!=0x0f); //等待按鍵釋放
for(i=0;i<=15;i++) //根據按鍵編碼得出按鍵編號
{
if(keyboard == KeyCode[i])//判斷對應的鍵值 以及按下次數
{
key = i;
switch(key)
{
case 0:num1++;num2=0;num3=0;num4=0;num5=0;num6=0;num7=0;num8=0;num9=0;break;
case 1:num2++;num1=0;num3=0;num4=0;num5=0;num6=0;num7=0;num8=0;num9=0;break;
case 2:num3++;num1=0;num2=0;num4=0;num5=0;num6=0;num7=0;num8=0;num9=0;break;
case 4:num4++;num1=0;num2=0;num3=0;num5=0;num6=0;num7=0;num8=0;num9=0;break;
case 5:num5++;num1=0;num2=0;num3=0;num4=0;num6=0;num7=0;num8=0;num9=0;break;
case 6:num6++;num1=0;num2=0;num3=0;num4=0;num5=0;num7=0;num8=0;num9=0;break;
case 8:num7++;num1=0;num2=0;num3=0;num4=0;num5=0;num6=0;num8=0;num9=0;break;
case 9:num8++;num1=0;num2=0;num3=0;num4=0;num5=0;num6=0;num7=0;num9=0;break;
case 10:num9++;num1=0;num2=0;num3=0;num4=0;num5=0;num6=0;num7=0;num8=0;break;
case 15:k++;
if(k==16)
{
k=0;j++;
if(j==2)
{
j=0;
}
}
light( k,j);break;
case 7:k--;
if(k==-1)
{
k=15;j++;
if(j==2)
{
j=0;
}
}
light( k,j);break;
default:break;
}
}
}
}
}
}
uchar jianzhi() //按下次數所顯示的字母
{
switch(key)
{
case 0:return table[(num1-1)%3];break;
case 1:return table1[(num2-1)%3];break;
case 2:return table2[(num3-1)%3];break;
case 4:return table3[(num4-1)%3];break;
case 5:return table4[(num5-1)%3];break;
case 6:return table5[(num6-1)%3];break;
case 8:return table6[(num7-1)%3];break;
case 9:return table7[(num8-1)%3];break;
case 10:return table8[(num9-1)%3];break;
default:return 0xff;break;
}
if(key==0||key==1||key==2||key==4||key==5||key==6||key==8||key==9||key==10) return table[key];
else return 0xff;
}
void xianshi()
{
static uchar str;
str=jianzhi();
if(str!=0xff)
{
if((k==0)&&(j==0))
LCD_Clear();
LCD_Write_Char(0+k,0+j,str);
key=15;
}
}
void main()
{
LCD_Init(); //LCD1602初始化
while(1)
{
ScanKeyboard(); //鍵盤掃描
xianshi(); //顯示所按下字母以及光標的移動
}
}
復制代碼
所有資料51hei提供下載:
矩陣鍵盤模擬手機鍵盤.rar
(1.73 KB, 下載次數: 29)
2018-4-20 17:30 上傳
點擊文件名下載附件
C 文件 源代碼
下載積分: 黑幣 -5
作者:
caifei9280
時間:
2020-7-14 08:59
這為我的設計提供了參考,感謝。
作者:
caifei9280
時間:
2020-7-14 10:12
void LCD_Init(void) //lcd初始化?
{
RW=0;
EN=0;
LCD_Write_Com(0x38);
LCD_Write_Com(0x08);
LCD_Write_Com(0x01);
LCD_Write_Com(0x06);
LCD_Write_Com(0x0C);
LCD_Write_Com(0x0F); //顯示光標以及光標閃爍
}
缺少1602打開使能,引用的注意。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1