日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux串口发送键值,c51:串口通信,按键发送字符串

發(fā)布時(shí)間:2023/12/15 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux串口发送键值,c51:串口通信,按键发送字符串 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原標(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:串口通信,按键发送字符串的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。