linux串口发送键值,c51:串口通信,按键发送字符串
原標題:c51:串口通信,按鍵發送字符串
一、程序功能
1、實現0~f的16位鍵盤輸入功能,將鍵值由P1口輸出。
2、不同的鍵值串口發送不同的
二、代碼
//函數功能
//1.實現0~f的16位鍵盤功能,將按鍵表示的數字由數碼管顯示
//2.定義不同的按鍵表示發送不同的字符串
#include"reg52.h"
#define uchar unsigned char
//16位鍵盤行翻轉法對應鍵值。
//對應的鍵值為0~f
uchar code kcode[]={
0x77,0x7b,0x7d,0x7e,
0xb7,0xbb,0xbd,0xbe,
0xd7,0xdb,0xdd,0xde,
0xe7,0xeb,0xed,0xee};
//不同鍵值發送的字符串
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為波特率發生器,初始化T1
//f=11.0592,baud=9600
//串口中斷執行數據發送
void init_comm();
//定義標志位,
uchar kd; //kd=1表示鍵閉合,并已經過10ms延時去,已處于穩定狀態;
uchar kin; //kin=1表示鍵值已讀到kbuf中,等待處理。
uchar kp; //kp=1表示kbuf中的數據已處理。
uchar kbuf; //保存鍵值0~16
//開機flag=0;數據有發送flag=1;
uchar flag;
//判斷是否有鍵按下,
//有鍵按下返回1,無鍵按下返回0
//16位鍵盤接P0
uchar keys();
//鍵號函數,將鍵轉換為對應的0~F的數值。
uchar nkey();
//T2為 鍵盤按鍵延時消顫,
void init_T2();
//數據處理函數
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)
{
//關T2中斷
ET2=0;
//標志復位
kin=0;
kd=0;
//數據處理
P1=~kbuf;
ET2=1;
//連續按相同按鍵,只發送1此鍵值
if(flag==0)
{
//程序第一次發送鍵值
flag=1;
//記錄發送鍵值
k=kbuf;
k1=k;
//鍵值發送
dataprocess(k);
}
if(flag==1)
{
//第一次以后發送鍵值
k=kbuf;
if(k!=k1)
{
k1=k;
//鍵值發送
ES=0;
dataprocess(k);
ES=1;
}
}
ET2=1;
}
}
}
//初始化T2
void init_T2()
{
//T2默認自動重載方式,T1作波特率發生器
//時間常數 ,f=11.0592,延時10ms ,
//計數器需記數9216個脈沖,延時10ms,
TL2=0x00;
TH2=0xdc;
RCAP2L=0x00;
RCAP2H=0xdc;
//開T2中斷
ET2=1;
//啟動T2
TR2=1;
}
//T2的中斷程序,功能對各標志位賦值,保存鍵值
void timer2() 5
{
//復位中斷標志,為下一次中斷
TF2=0;
//判斷有鍵按下
if(keys()==1) //有鍵按下
{
if(kd==1) //延時去抖動
{
//10ms后,檢測鍵還是按下, 保存鍵值
//如果上次輸入鍵值處理完畢
if(kin==0)
{
kin=1;
kbuf=nkey(); //鍵值保存到kbuf中,此時按鍵處于穩定按下時期。
}
}
//第一次檢查到鍵按下
else
kd=1;
}
//每次檢測有鍵沒有鍵按下,kd復位
else
{
kd=0;
kin=0;
}
}
//判斷是否有鍵按下,
//有鍵按下返回1,無鍵按下返回0
//16位鍵盤接P0
uchar keys()
{
//如果設置: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 ,自動重載8位計數器
TMOD=0x20;
//T1時間常數
TH1=0xfd;
TL1=0xfd;
//開串口中斷
ES=1;
//啟動T1
TR1=1;
}
//串口中斷程序
void commfun() interrupt 4
{
//處理接收
if(RI)
{
RI=0;
}
//處理發送
}
//數據處理函數
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;
//發送完成,TI=1
while(TI==0);
TI=0;
pbuf++;
}
}
責任編輯:
總結
以上是生活随笔為你收集整理的linux串口发送键值,c51:串口通信,按键发送字符串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哪怕改用 Type-C 也不耽误赚钱,曝
- 下一篇: linux软链接上传svn,svn 软链