📄 信息交换的实现14(发送).c
字号:
#include<at89x51.h>
sbit rs=P3^5;
sbit rw=P3^4;
sbit e=P3^3;
sbit d0=P1^0;
sbit d1=P1^1;
sbit d2=P1^2;
sbit d3=P1^3;
sbit d4=P1^4;
sbit d5=P1^5;
sbit d6=P1^6;
sbit d7=P1^7;//说明管脚连接
//P2口由于键盘的连接
unsigned char store1=0,store2=0,store=0;//用于全局扫瞄键值决定用
unsigned char k=0x80; //显示地址变量
unsigned char store_send_number[40]={0};//存放要发送的数据
unsigned char m=0;//存放发送数据的个数的计数
void delay(unsigned char a)//延时a*1ms
{
unsigned char b;
while(--a!=0)
{
for(b=0;b<125;b++);
}
}
void if_busy(void)//液晶忙否判断
{ P1=0xff;//很必要
rs=0;rw=1;
e=0;e=1;
while(d7==1); //先执行读忙指令再能判断忙
}
void rst_serial_port()//初始化串口
{
SCON=0xc0;//串口工作方式3,双机工作 ,接收发送中断位置零
PCON=0x80;//串口波特率倍增,即设定SMOD=1;
TMOD=0x20;//定时器1工作方式2,用于产生波特率
TH1=0xfd;
TL1=0xfd;//设定波特率为19200kbs
ES=1;//串口中断允许
EA=1;
ET1=0;
TR1=1;//启动定时器 ,注意不能允许定时器中断,否则会与串口中断干扰
}
void rst_lcd(void)
{ delay(200);//使液晶充分准备好
rs=0;rw=0;P1=0x38;delay(10);e=0;e=1;
rs=0;rw=0;P1=0x38;delay(10);e=0;e=1;
rs=0;rw=0;P1=0x38;delay(10);e=0;e=1;//不检测忙 三次显示模式
if_busy();P1=0x38;delay(20);
rs=0;rw=0;e=0;e=1;//显示模式设定:双行、5*7格式、8位数据转送
if_busy();P1=0x01;delay(20);
rs=0;rw=0;e=0;e=1;//执行清显示
if_busy();P1=0x0e;delay(20);
rs=0;rw=0;e=0;e=1;//显示设定:光标有且不闪动,开显示
if_busy();P1=0x06;delay(20);
rs=0;rw=0;e=0;e=1;//光标和显示模式:光标右移,字不移动
}
void show(unsigned char c)
{
if_busy();
rs=0;rw=0;
P1=k;delay(20);//让液晶能过正确地接收数据
if(k==0xc0)delay(20);//由于液晶是慢显示器件,因此需要换行地址的读取时先延时!很重要否则会出错
e=0;e=1;//写入显示的地址
k=k+0x01;//地址移至下一位
if(k==0x90)
{
k=0xc0;//当到达第一行末尾时换行
}
if_busy();
rs=1;rw=0;
P1=c;delay(20);
e=0;e=1;//执行
store_send_number[m]=c;//存入写入的数据
m+=1;//为下个数据的存入做准备
}
void which(void)//进行按键的二次选择
{
while(P2!=0x0f); //等待第一次按键的释放
delay(20);//按键释放去抖动
P2=0xf0;
while(P2==0xf0);//等待第二次按键的输入
delay(20);//去抖动处理
if(P2!=0xf0)
{
store1=P2;
P2=0x0f;
store2=P2;
store=store1|store2;//注意|是进行或运算 ;||是逻辑或
}
}
void key11(void)
{
which();
if(store==0xbb)
{
show('a');//显示a,液晶的ascll码的字母和数字和计算机相同 ,一次可以这样赋值
}
if(store==0xb7)
{
show('b');
}
if(store==0x7e)
{
show('c');
}
if(store==0x7d)
{
show('0');
}
}
void key21(void)
{
which();
if(store==0xbb)
{
show('d');//显示d
}
if(store==0xb7)
{
show('e');
}
if(store==0x7e)
{
show('f');
}
if(store==0x7d)
{
show('1');
}
}
void key31(void)
{
which();
if(store==0xbb)
{
show('g');//显示g
}
if(store==0xb7)
{
show('h');
}
if(store==0x7e)
{
show('i');
}
if(store==0x7d)
{
show('2');
}
}
void key41(void)
{
which();
if(store==0xbb)
{
show('j');//显示j
}
if(store==0xb7)
{
show('k');
}
if(store==0x7e)
{
show('l');
}
if(store==0x7d)
{
show('3');
}
}
void key12(void)
{
which();
if(store==0xbb)
{
show('m');//显示m
}
if(store==0xb7)
{
show('n');
}
if(store==0x7e)
{
show('o');
}
if(store==0x7d)
{
show('4');
}
}
void key22(void)
{
which();
if(store==0xbb)
{
show('p');//显示p
}
if(store==0xb7)
{
show('q');
}
if(store==0x7e)
{
show('r');
}
if(store==0x7d)
{
show('5');
}
}
void key32(void)
{
which();
if(store==0xbb)
{
show('s');//显示s
}
if(store==0xb7)
{
show('t');
}
if(store==0x7e)
{
show('u');
}
if(store==0x7d)
{
show('6');
}
}
void key42(void)
{
which();
if(store==0xbb)
{
show('v');//显示v
}
if(store==0xb7)
{
show('w');
}
if(store==0x7e)
{
show('x');
}
if(store==0x7d)
{
show('7');
}
}
void key13(void)
{
which();
if(store==0xbb)
{
show('y');//显示y
}
if(store==0xb7)
{
show('z');
}
if(store==0x7e)
{
show('8');
}
if(store==0x7d)
{
show('9');
}
}
void key23(void)
{
which();
if(store==0xbb)
{
show(0x20);//显示逗号
}
if(store==0xb7)//显示句号
{
show('.');
}
if(store==0x7e)//显示感叹号
{
show('!');
}
if(store==0x7d)//显示问号
{
show('?');
}
}
void show_success(void)//发送成功后显示success!
{
if_busy();k=0x80;//地址回到开头
show('s');show('u');show('c');show('c');show('e');show('s');show('s');show('!');
}
void send_data(void)
{
unsigned char n=0,l=0;
while( n<m) //m的最大值为32
{
l=store_send_number[n];
P0_0=l%2;P0_1=l/2%2;P0_2=l/4%2;P0_3=l/8%2;
P0_4=l/16%2;P0_5=l/32%2;P0_6=l/64%2;P0_7=l/128%2;//实现数据的顺序的翻转 由于数据的
SBUF=P0;//装入数据寄存器
while(TI==0);//等待发送完成
TI=0;//清发送中断位 ,进入下个数据的发送
n++;
}
if_busy();
rs=0;rw=0;P1=0x01;
delay(100);e=0;e=1;
show_success();//发送成功后显示success字样
P2=0xf0;while(P2==0xf0);//等待按键的输入开始新的数据输入或数据接收
delay(20);
if(P2!=0xf0)//按下任意键实现数据的重新输入
{
if_busy();rs=0;rw=0;P1=0x01;delay(20);e=0;e=1;//清屏
k=0x80;m=0;store_send_number[0]=0;//清空数据
while(P2!=0xf0);//等待按键的释放
delay(50);//去抖动处理
}
}
void whichkey(void)
{
P2=0x0f;
store2=P2;//由于按键未释放,因此store2的值不是0fH
store=store1|store2;//得到变化的键值
if(store==0xee)//与键key11值比较
{
key11();//进入键的执行
}
if(store==0xed)//与键key21比较
{
key21();
}
if(store==0xeb)
{
key31();
}
if(store==0xe7)
{
key41();
}
if(store==0xde)
{
key12();
}
if(store==0xdd)
{
key22();
}
if(store==0xdb)
{
key32();
}
if(store==0xd7)
{
key42();
}
if(store==0xbe)
{
key13();
}
if(store==0xbd)
{
key23();
}
if(store==0x7b)
{
if(store_send_number[0]!=0)//当第一位不是空时才发送
{send_data();}
}
}
void main(void)
{
rst_lcd();//初始化液晶屏
if_busy();
rs=0;rw=0;P1=0x80;delay(10);
show('o');
if_busy();
rs=0;rw=0;P1=0x81;delay(10);
show('k');
if_busy();
rs=0;rw=0;P1=0x82;delay(10);
show('!');
P2=0xf0;
rst_serial_port();//串口初始化
P0=0x00;//P0口在这里用于ascll码首位调换的中介
while(P2==0xf0);//等待按键的输入
delay(20);
if(P2!=0xf0)
{
if_busy();
P1=0x01;delay(10);
rs=0;rw=0;
e=0;e=1;//执行清显示
}//初始化成功后显示“ok!"按下任意键后清屏
while(P2!=0xf0) ;//等待按键释放
delay(20);//按键释放去抖动
k=0x80;
while(1) //初始化后cpu一直进行按键的判断
{
P2=0xf0;
if(P2!=0xf0)
{
delay(20);
if(P2!=0xf0)
{
store1=P2;
whichkey();//键值判断
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -