linux串口发送键值,c51:串口通信,按键发送字符串
原標(biāo)題:c51:串口通信,按鍵發(fā)送字符串
一、程序功能
1、實(shí)現(xiàn)0~f的16位鍵盤輸入功能,將鍵值由P1口輸出。
2、不同的鍵值串口發(fā)送不同的
二、代碼
//函數(shù)功能
//1.實(shí)現(xiàn)0~f的16位鍵盤功能,將按鍵表示的數(shù)字由數(shù)碼管顯示
//2.定義不同的按鍵表示發(fā)送不同的字符串
#include"reg52.h"
#define uchar unsigned char
//16位鍵盤行翻轉(zhuǎn)法對(duì)應(yīng)鍵值。
//對(duì)應(yīng)的鍵值為0~f
uchar code kcode[]={
0x77,0x7b,0x7d,0x7e,
0xb7,0xbb,0xbd,0xbe,
0xd7,0xdb,0xdd,0xde,
0xe7,0xeb,0xed,0xee};
//不同鍵值發(fā)送的字符串
uchar buf0[4]={0x11,0x12,0x13,0x00};
uchar buf1[5]={0x11,0x12,0x13,0x14,0x00};
uchar buf2[6]={0x11,0x12,0x13,0x14,0x15,0x00};
uchar buf3[7]={0x11,0x12,0x13,0x14,0x15,0x16,0x00};
uchar buf4[8]={0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x00};
//---串口初始化
//T1為波特率發(fā)生器,初始化T1
//f=11.0592,baud=9600
//串口中斷執(zhí)行數(shù)據(jù)發(fā)送
void init_comm();
//定義標(biāo)志位,
uchar kd; //kd=1表示鍵閉合,并已經(jīng)過10ms延時(shí)去,已處于穩(wěn)定狀態(tài);
uchar kin; //kin=1表示鍵值已讀到kbuf中,等待處理。
uchar kp; //kp=1表示kbuf中的數(shù)據(jù)已處理。
uchar kbuf; //保存鍵值0~16
//開機(jī)flag=0;數(shù)據(jù)有發(fā)送flag=1;
uchar flag;
//判斷是否有鍵按下,
//有鍵按下返回1,無鍵按下返回0
//16位鍵盤接P0
uchar keys();
//鍵號(hào)函數(shù),將鍵轉(zhuǎn)換為對(duì)應(yīng)的0~F的數(shù)值。
uchar nkey();
//T2為 鍵盤按鍵延時(shí)消顫,
void init_T2();
//數(shù)據(jù)處理函數(shù)
void dataprocess(uchar k);
//
void send(uchar* pbuf);
void main()
{
//
uchar flag;
//
uchar k1,k;
//初始化T2
init_T2();
//初始化串口
init_comm();
//開總中斷
EA=1;
flag=0;
//處理鍵值
while(1)
{
if(kin==1)
{
//關(guān)T2中斷
ET2=0;
//標(biāo)志復(fù)位
kin=0;
kd=0;
//數(shù)據(jù)處理
P1=~kbuf;
ET2=1;
//連續(xù)按相同按鍵,只發(fā)送1此鍵值
if(flag==0)
{
//程序第一次發(fā)送鍵值
flag=1;
//記錄發(fā)送鍵值
k=kbuf;
k1=k;
//鍵值發(fā)送
dataprocess(k);
}
if(flag==1)
{
//第一次以后發(fā)送鍵值
k=kbuf;
if(k!=k1)
{
k1=k;
//鍵值發(fā)送
ES=0;
dataprocess(k);
ES=1;
}
}
ET2=1;
}
}
}
//初始化T2
void init_T2()
{
//T2默認(rèn)自動(dòng)重載方式,T1作波特率發(fā)生器
//時(shí)間常數(shù) ,f=11.0592,延時(shí)10ms ,
//計(jì)數(shù)器需記數(shù)9216個(gè)脈沖,延時(shí)10ms,
TL2=0x00;
TH2=0xdc;
RCAP2L=0x00;
RCAP2H=0xdc;
//開T2中斷
ET2=1;
//啟動(dòng)T2
TR2=1;
}
//T2的中斷程序,功能對(duì)各標(biāo)志位賦值,保存鍵值
void timer2() 5
{
//復(fù)位中斷標(biāo)志,為下一次中斷
TF2=0;
//判斷有鍵按下
if(keys()==1) //有鍵按下
{
if(kd==1) //延時(shí)去抖動(dòng)
{
//10ms后,檢測(cè)鍵還是按下, 保存鍵值
//如果上次輸入鍵值處理完畢
if(kin==0)
{
kin=1;
kbuf=nkey(); //鍵值保存到kbuf中,此時(shí)按鍵處于穩(wěn)定按下時(shí)期。
}
}
//第一次檢查到鍵按下
else
kd=1;
}
//每次檢測(cè)有鍵沒有鍵按下,kd復(fù)位
else
{
kd=0;
kin=0;
}
}
//判斷是否有鍵按下,
//有鍵按下返回1,無鍵按下返回0
//16位鍵盤接P0
uchar keys()
{
//如果設(shè)置:char a ,程序始終返回1.
uchar a;
P0=0xf0;
a=P0;
if(a==0xf0)
return 0;
else
return 1;
}
uchar nkey()
{
uchar high,low,key,i;
P0=0xf0;
high=P0;
P0=0x0f;
low=P0;
key=high|low;
for(i=0;i<16;i++)
{
if(key==kcode[i])
return i;
}
}
//T1初始化,f=11.0592,baud=9600
void init_comm()
{
//
flag=0;
//串口工作方式1,允許串口接收
SCON=0x50;
//T1工作方式2 ,自動(dòng)重載8位計(jì)數(shù)器
TMOD=0x20;
//T1時(shí)間常數(shù)
TH1=0xfd;
TL1=0xfd;
//開串口中斷
ES=1;
//啟動(dòng)T1
TR1=1;
}
//串口中斷程序
void commfun() interrupt 4
{
//處理接收
if(RI)
{
RI=0;
}
//處理發(fā)送
}
//數(shù)據(jù)處理函數(shù)
void dataprocess(uchar k)
{
switch(k)
{
case 0:
send(buf0);
break;
case 1:
send(buf1);
break;
case 2:
send(buf2);
break;
case 3:
send(buf3);
break;
case 4:
send(buf4);
break;
}
}
void send(uchar* pbuf)
{
while(*pbuf!=0x00)
{
SBUF=*pbuf;
//發(fā)送完成,TI=1
while(TI==0);
TI=0;
pbuf++;
}
}
責(zé)任編輯:
總結(jié)
以上是生活随笔為你收集整理的linux串口发送键值,c51:串口通信,按键发送字符串的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哪怕改用 Type-C 也不耽误赚钱,曝
- 下一篇: Linux mysql生成不了随机密码,