完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
void UART_init(void)
{ TMOD=0x21;//定时器1设置与工作方式2.将定时器0设置成工作方式1. TL1=0xFD; TH1=0xFD;//置初值,波特率9600,晶振 IE=0x97; IP=0x15; TCON=0x00; TR1=1;//启动定时器 SCON=0xF0;//串行口方式3 PCON=0x00;//倍频为0 P0=0x00; P2=0x00; rd=0;} //*************************************// void main(viod)//主函数 { UART_init(); while(1) {tready=1; rready=1;//假定准备好发送和接收 key=kbscan(); delay(10); if(key!=0) { keyvalue();}; if(lamp!=0) judge(); if(board!=0) room(); if(get_data==1)str_sre(); } } void serial_int(void) interrupt 4 using 1 { RI=0; ES=0; if(SBUF==benji) {get_data=1;} ES=1;} 我P1口接的是矩阵键盘。矩阵键盘扫描程序设置P1初值为0XF0。可是现在P1口置1了。只是为什么呢
|
|
相关推荐
11个回答
|
|
没有人给个建议么。。好难。。找资料找了好多天了
|
|
|
|
不太明白你的问题,如何是不进死循环,死循环是指while(1)吗,但是在while(1)里所有的能被看到的操作都在if(key!=0)里,如果这个不成立,下面的都不执行,kbscan();没看,不知道有没有问题,至于P1口置1,不清楚是不是有什么地方把P1口置1了,或者P1口在什么情况下由0xf0变成了0xff,信息不全
|
|
|
|
人中狼 发表于 2017-4-30 10:43 #include #define uchar unsigned char//把 unsigned char 宏定义为 uchar 以后只要写uchar 就是unsigned char 的意思 #define benji 0x01//本机地址0x02 uchar idata RBUF; uchar idata TBUF; uchar idata st,bb; uchar nroom=benji; uchar benji_data; uchar lamp=0,board=0,key=0; int f; bit f0; bit tready;//定义发送 bit rready;//定义接收 //sfr P0=0x80; //sfr P1=0x90; //sfr P2=0xa0; //sfr P3=0xb0; //sfr SBUF=0x99;//数据发送缓冲区 ***it rd=P3^7; bit get_data=0;//本机选中标志 //********************************************************* void delay(unsigned int time)//延迟程序,time=1ms {unsigned char k; unsigned int i; for(i=time*2;i>0;i--) for(k=248;k>0;k--);}//算法一层循环248*2=二层循环(496+3)*2=1ms unsigned char kbscan()//扫描程序 {unsigned char sccode,recode;//定义两个数 P1=0xf0;//定义P1口初值 if((P1&0xf0)!=0xf0)//判断P1口不等于初值的时候,有键按下 {delay(10); //延迟消除键位抖动 if((P1&0xf0)!=0xf0) //再判断 {sccode=0xfe; while((sccode&0x10)!=0) //循环只有当构号内的值不等于0时 ,进行下一步操作 {P1=sccode; if((P1&0xf0)!=0xf0) //将数值付给P1与初值相与,不等于初值时 {recode=(P1&0xf0)|0x0f; //这时候,定义的第二个数值取值 P1=0xf0; //将第二个数值付给P1口 return((~sccode)+(~recode)); //两个数值分别取反后,想加后返回 } else { sccode=(sccode<<1)|0x01; //不成立的话(按键)左移 }} }} return(0);} void keyvalue()//确定键盘值 {switch(key) { case 0x11 :lamp=0x01 ;break; case 0x21 :lamp=0x02 ;break; case 0x41 :lamp=0x04 ;break; case 0x81 :lamp=0x08 ;break; case 0x12 :lamp=0x10 ;break; case 0x22 :lamp=0x20 ;break; case 0x42 :lamp=0x40 ;break; case 0x82 :lamp=0x80 ;break; case 0x14 :board=0x01 ;break; case 0x24 :board=0x02 ;break; case 0x44 :board=0x04 ;break; case 0x84 :board=0x08 ;break; case 0x18 :board=0x10 ;break; case 0x28 :board=0x20 ;break; case 0x48 :board=0x40 ;break; case 0x88 :board=0x80 ;break;} } //*************************************// void Read_room(uchar addr) //读房间状态 { uchar bendata; if(addr==benji) { bendata=P2; RBUF=bendata; return; } ES=0; SM2=0; TB8=1; rd=1; delay(50); SBUF=addr; while(TI!=1); delay(10); TI=0; delay(50); TB8=0; rd=1; delay(50); SBUF=0x02; //发送读命令 while(TI!=1); delay(10); TI=0; delay(50); rd=0; while(RI!=1); //接收状态 delay(10); RI=0; delay(50); RBUF=SBUF; //TB8=1; SM2=1; ES=1; } void room() //room 选择 { nroom=board; Read_room(nroom); P0=RBUF; board=0; } //************************// void zhuan_room(uchar addr,uchar tn) { if(addr==benji) { P2=tn; return; } while(1) { ES=0; SM2=0; TB8=1; rd=1; delay(50); SBUF=addr; //发地址 while(TI!=1); delay(10); TI=0; delay(50); TB8=0; delay(50); SBUF=0x01; //发命令 while(TI!=1); delay(10); TI=0; delay(50); TBUF=tn; delay(50); SBUF=TBUF; //发数据 while(TI!=1); delay(10); TI=0; delay(50); rd=0; delay(10); //TB8=1; SM2=1; ES=1; return;} } void judge() { uchar sp1,sp2; sp1=~lamp; sp2=P0; sp2&=sp1; P0=sp2; zhuan_room(nroom,sp2); lamp=0;} //*******************************************// void str(void) //发送函数 {tready=0; st=P2; rd=1; delay(50); SBUF=st; while(TI!=1); delay(10); TI=0; delay(50); SM2=1; rd=0; delay(10); get_data=0; ES=1; } void sre(void) //接收函数 { rready=0; rd=0; delay(10); while(RI!=1); delay(50); RI=0; RBUF=SBUF; SM2=1; get_data=0; ES=1;} void str_sre() { uchar b; ES=0; SM2=0; rd=0; while(RI!=1); delay(10); RI=0; delay(50); b=SBUF; if(b==0x01) { sre(); P2=RBUF; } else {if(b==0x02) {str();}}} //*************************************************// void UART_init(void) { TMOD=0x21;//定时器1设置与工作方式2.将定时器0设置成工作方式1. TL1=0xFD; TH1=0xFD;//置初值,波特率9600,晶振 IE=0x97; IP=0x15; TCON=0x00; TR1=1;//启动定时器 SCON=0xF0;//串行口方式3 PCON=0x00;//倍频为0 P0=0x00; P2=0x00; rd=0;} //*************************************// void main(viod)//主函数 { UART_init(); while(1) {tready=1; rready=1;//假定准备好发送和接收 key=kbscan(); delay(10); if(key!=0) { keyvalue();}; if(lamp!=0) judge(); if(board!=0) room(); if(get_data==1)str_sre(); } } void serial_int(void) interrupt 4 using 1 { RI=0; ES=0; if(SBUF==benji) {get_data=1;} ES=1;} 这是全部的程序 |
|
|
|
人中狼 发表于 2017-4-30 10:43 #include #define uchar unsigned char//把 unsigned char 宏定义为 uchar 以后只要写uchar 就是unsigned char 的意思 #define benji 0x01//本机地址0x02 uchar idata RBUF; uchar idata TBUF; uchar idata st,bb; uchar nroom=benji; uchar benji_data; uchar lamp=0,board=0,key=0; int f; bit f0; bit tready;//定义发送 bit rready;//定义接收 //sfr P0=0x80; //sfr P1=0x90; //sfr P2=0xa0; //sfr P3=0xb0; //sfr SBUF=0x99;//数据发送缓冲区 ***it rd=P3^7; bit get_data=0;//本机选中标志 //********************************************************* void delay(unsigned int time)//延迟程序,time=1ms {unsigned char k; unsigned int i; for(i=time*2;i>0;i--) for(k=248;k>0;k--);}//算法一层循环248*2=二层循环(496+3)*2=1ms unsigned char kbscan()//扫描程序 {unsigned char sccode,recode;//定义两个数 P1=0xf0;//定义P1口初值 if((P1&0xf0)!=0xf0)//判断P1口不等于初值的时候,有键按下 {delay(10); //延迟消除键位抖动 if((P1&0xf0)!=0xf0) //再判断 {sccode=0xfe; while((sccode&0x10)!=0) //循环只有当构号内的值不等于0时 ,进行下一步操作 {P1=sccode; if((P1&0xf0)!=0xf0) //将数值付给P1与初值相与,不等于初值时 {recode=(P1&0xf0)|0x0f; //这时候,定义的第二个数值取值 P1=0xf0; //将第二个数值付给P1口 return((~sccode)+(~recode)); //两个数值分别取反后,想加后返回 } else { sccode=(sccode<<1)|0x01; //不成立的话(按键)左移 }} }} return(0);} void keyvalue()//确定键盘值 {switch(key) { case 0x11 :lamp=0x01 ;break; case 0x21 :lamp=0x02 ;break; case 0x41 :lamp=0x04 ;break; case 0x81 :lamp=0x08 ;break; case 0x12 :lamp=0x10 ;break; case 0x22 :lamp=0x20 ;break; case 0x42 :lamp=0x40 ;break; case 0x82 :lamp=0x80 ;break; case 0x14 :board=0x01 ;break; case 0x24 :board=0x02 ;break; case 0x44 :board=0x04 ;break; case 0x84 :board=0x08 ;break; case 0x18 :board=0x10 ;break; case 0x28 :board=0x20 ;break; case 0x48 :board=0x40 ;break; case 0x88 :board=0x80 ;break;} } //*************************************// void Read_room(uchar addr) //读房间状态 { uchar bendata; if(addr==benji) { bendata=P2; RBUF=bendata; return; } ES=0; SM2=0; TB8=1; rd=1; delay(50); SBUF=addr; while(TI!=1); delay(10); TI=0; delay(50); TB8=0; rd=1; delay(50); SBUF=0x02; //发送读命令 while(TI!=1); delay(10); TI=0; delay(50); rd=0; while(RI!=1); //接收状态 delay(10); RI=0; delay(50); RBUF=SBUF; //TB8=1; SM2=1; ES=1; } void room() //room 选择 { nroom=board; Read_room(nroom); P0=RBUF; board=0; } //************************// void zhuan_room(uchar addr,uchar tn) { if(addr==benji) { P2=tn; return; } while(1) { ES=0; SM2=0; TB8=1; rd=1; delay(50); SBUF=addr; //发地址 while(TI!=1); delay(10); TI=0; delay(50); TB8=0; delay(50); SBUF=0x01; //发命令 while(TI!=1); delay(10); TI=0; delay(50); TBUF=tn; delay(50); SBUF=TBUF; //发数据 while(TI!=1); delay(10); TI=0; delay(50); rd=0; delay(10); //TB8=1; SM2=1; ES=1; return;} } void judge() { uchar sp1,sp2; sp1=~lamp; sp2=P0; sp2&=sp1; P0=sp2; zhuan_room(nroom,sp2); lamp=0;} //*******************************************// void str(void) //发送函数 {tready=0; st=P2; rd=1; delay(50); SBUF=st; while(TI!=1); delay(10); TI=0; delay(50); SM2=1; rd=0; delay(10); get_data=0; ES=1; } void sre(void) //接收函数 { rready=0; rd=0; delay(10); while(RI!=1); delay(50); RI=0; RBUF=SBUF; SM2=1; get_data=0; ES=1;} void str_sre() { uchar b; ES=0; SM2=0; rd=0; while(RI!=1); delay(10); RI=0; delay(50); b=SBUF; if(b==0x01) { sre(); P2=RBUF; } else {if(b==0x02) {str();}}} //*************************************************// void UART_init(void) { TMOD=0x21;//定时器1设置与工作方式2.将定时器0设置成工作方式1. TL1=0xFD; TH1=0xFD;//置初值,波特率9600,晶振 IE=0x97; IP=0x15; TCON=0x00; TR1=1;//启动定时器 SCON=0xF0;//串行口方式3 PCON=0x00;//倍频为0 P0=0x00; P2=0x00; rd=0;} //*************************************// void main(viod)//主函数 { UART_init(); while(1) {tready=1; rready=1;//假定准备好发送和接收 key=kbscan(); delay(10); if(key!=0) { keyvalue();}; if(lamp!=0) judge(); if(board!=0) room(); if(get_data==1)str_sre(); } } void serial_int(void) interrupt 4 using 1 { RI=0; ES=0; if(SBUF==benji) {get_data=1;} ES=1;} 这是我全部的程序。 |
|
|
|
#include
#define uchar unsigned char//把 unsigned char 宏定义为 uchar 以后只要写uchar 就是unsigned char 的意思 #define benji 0x01//本机地址0x02 uchar idata RBUF; uchar idata TBUF; uchar idata st,bb; uchar nroom=benji; uchar benji_data; uchar lamp=0,board=0,key=0; int f; bit f0; bit tready;//定义发送 bit rready;//定义接收 //sfr P0=0x80; //sfr P1=0x90; //sfr P2=0xa0; //sfr P3=0xb0; //sfr SBUF=0x99;//数据发送缓冲区 ***it rd=P3^7; bit get_data=0;//本机选中标志 //********************************************************* void delay(unsigned int time)//延迟程序,time=1ms {unsigned char k; unsigned int i; for(i=time*2;i>0;i--) for(k=248;k>0;k--);}//算法一层循环248*2=二层循环(496+3)*2=1ms unsigned char kbscan()//扫描程序 {unsigned char sccode,recode;//定义两个数 P1=0xf0;//定义P1口初值 if((P1&0xf0)!=0xf0)//判断P1口不等于初值的时候,有键按下 {delay(10); //延迟消除键位抖动 if((P1&0xf0)!=0xf0) //再判断 {sccode=0xfe; while((sccode&0x10)!=0) //循环只有当构号内的值不等于0时 ,进行下一步操作 {P1=sccode; if((P1&0xf0)!=0xf0) //将数值付给P1与初值相与,不等于初值时 {recode=(P1&0xf0)|0x0f; //这时候,定义的第二个数值取值 P1=0xf0; //将第二个数值付给P1口 return((~sccode)+(~recode)); //两个数值分别取反后,想加后返回 } else { sccode=(sccode<<1)|0x01; //不成立的话(按键)左移 }} }} return(0);} void keyvalue()//确定键盘值 {switch(key) { case 0x11 :lamp=0x01 ;break; case 0x21 :lamp=0x02 ;break; case 0x41 :lamp=0x04 ;break; case 0x81 :lamp=0x08 ;break; case 0x12 :lamp=0x10 ;break; case 0x22 :lamp=0x20 ;break; case 0x42 :lamp=0x40 ;break; case 0x82 :lamp=0x80 ;break; case 0x14 :board=0x01 ;break; case 0x24 :board=0x02 ;break; case 0x44 :board=0x04 ;break; case 0x84 :board=0x08 ;break; case 0x18 :board=0x10 ;break; case 0x28 :board=0x20 ;break; case 0x48 :board=0x40 ;break; case 0x88 :board=0x80 ;break;} } //*************************************// void Read_room(uchar addr) //读房间状态 { uchar bendata; if(addr==benji) { bendata=P2; RBUF=bendata; return; } ES=0; SM2=0; TB8=1; rd=1; delay(50); SBUF=addr; while(TI!=1); delay(10); TI=0; delay(50); TB8=0; rd=1; delay(50); SBUF=0x02; //发送读命令 while(TI!=1); delay(10); TI=0; delay(50); rd=0; while(RI!=1); //接收状态 delay(10); RI=0; delay(50); RBUF=SBUF; //TB8=1; SM2=1; ES=1; } void room() //room 选择 { nroom=board; Read_room(nroom); P0=RBUF; board=0; } //************************// void zhuan_room(uchar addr,uchar tn) { if(addr==benji) { P2=tn; return; } while(1) { ES=0; SM2=0; TB8=1; rd=1; delay(50); SBUF=addr; //发地址 while(TI!=1); delay(10); TI=0; delay(50); TB8=0; delay(50); SBUF=0x01; //发命令 while(TI!=1); delay(10); TI=0; delay(50); TBUF=tn; delay(50); SBUF=TBUF; //发数据 while(TI!=1); delay(10); TI=0; delay(50); rd=0; delay(10); //TB8=1; SM2=1; ES=1; return;} } void judge() { uchar sp1,sp2; sp1=~lamp; sp2=P0; sp2&=sp1; P0=sp2; zhuan_room(nroom,sp2); lamp=0;} //*******************************************// void str(void) //发送函数 {tready=0; st=P2; rd=1; delay(50); SBUF=st; while(TI!=1); delay(10); TI=0; delay(50); SM2=1; rd=0; delay(10); get_data=0; ES=1; } void sre(void) //接收函数 { rready=0; rd=0; delay(10); while(RI!=1); delay(50); RI=0; RBUF=SBUF; SM2=1; get_data=0; ES=1;} void str_sre() { uchar b; ES=0; SM2=0; rd=0; while(RI!=1); delay(10); RI=0; delay(50); b=SBUF; if(b==0x01) { sre(); P2=RBUF; } else {if(b==0x02) {str();}}} //*************************************************// void UART_init(void) { TMOD=0x21;//定时器1设置与工作方式2.将定时器0设置成工作方式1. TL1=0xFD; TH1=0xFD;//置初值,波特率9600,晶振 IE=0x97; IP=0x15; TCON=0x00; TR1=1;//启动定时器 SCON=0xF0;//串行口方式3 PCON=0x00;//倍频为0 P0=0x00; P2=0x00; rd=0;} //*************************************// void main(viod)//主函数 { UART_init(); while(1) {tready=1; rready=1;//假定准备好发送和接收 key=kbscan(); delay(10); if(key!=0) { keyvalue();}; if(lamp!=0) judge(); if(board!=0) room(); if(get_data==1)str_sre(); } } void serial_int(void) interrupt 4 using 1 { RI=0; ES=0; if(SBUF==benji) {get_data=1;} ES=1;} 这是我全部的程序。。 |
|
|
|
|
|
|
|
人中狼 发表于 2017-4-30 10:43 #include #define uchar unsigned char//把 unsigned char 宏定义为 uchar 以后只要写uchar 就是unsigned char 的意思 #define benji 0x01//本机地址0x02 uchar idata RBUF; uchar idata TBUF; uchar idata st,bb; uchar nroom=benji; uchar benji_data; uchar lamp=0,board=0,key=0; int f; bit f0; bit tready;//定义发送 bit rready;//定义接收 //sfr P0=0x80; //sfr P1=0x90; //sfr P2=0xa0; //sfr P3=0xb0; //sfr SBUF=0x99;//数据发送缓冲区 ***it rd=P3^7; bit get_data=0;//本机选中标志 //********************************************************* void delay(unsigned int time)//延迟程序,time=1ms {unsigned char k; unsigned int i; for(i=time*2;i>0;i--) for(k=248;k>0;k--);}//算法一层循环248*2=二层循环(496+3)*2=1ms unsigned char kbscan()//扫描程序 {unsigned char sccode,recode;//定义两个数 P1=0xf0;//定义P1口初值 if((P1&0xf0)!=0xf0)//判断P1口不等于初值的时候,有键按下 {delay(10); //延迟消除键位抖动 if((P1&0xf0)!=0xf0) //再判断 {sccode=0xfe; while((sccode&0x10)!=0) //循环只有当构号内的值不等于0时 ,进行下一步操作 {P1=sccode; if((P1&0xf0)!=0xf0) //将数值付给P1与初值相与,不等于初值时 {recode=(P1&0xf0)|0x0f; //这时候,定义的第二个数值取值 P1=0xf0; //将第二个数值付给P1口 return((~sccode)+(~recode)); //两个数值分别取反后,想加后返回 } else { sccode=(sccode<<1)|0x01; //不成立的话(按键)左移 }} }} return(0);} void keyvalue()//确定键盘值 {switch(key) { case 0x11 :lamp=0x01 ;break; case 0x21 :lamp=0x02 ;break; case 0x41 :lamp=0x04 ;break; case 0x81 :lamp=0x08 ;break; case 0x12 :lamp=0x10 ;break; case 0x22 :lamp=0x20 ;break; case 0x42 :lamp=0x40 ;break; case 0x82 :lamp=0x80 ;break; case 0x14 :board=0x01 ;break; case 0x24 :board=0x02 ;break; case 0x44 :board=0x04 ;break; case 0x84 :board=0x08 ;break; case 0x18 :board=0x10 ;break; case 0x28 :board=0x20 ;break; case 0x48 :board=0x40 ;break; case 0x88 :board=0x80 ;break;} } //*************************************// void Read_room(uchar addr) //读房间状态 { uchar bendata; if(addr==benji) { bendata=P2; RBUF=bendata; return; } ES=0; SM2=0; TB8=1; rd=1; delay(50); SBUF=addr; while(TI!=1); delay(10); TI=0; delay(50); TB8=0; rd=1; delay(50); SBUF=0x02; //发送读命令 while(TI!=1); delay(10); TI=0; delay(50); rd=0; while(RI!=1); //接收状态 delay(10); RI=0; delay(50); RBUF=SBUF; //TB8=1; SM2=1; ES=1; } void room() //room 选择 { nroom=board; Read_room(nroom); P0=RBUF; board=0; } //************************// void zhuan_room(uchar addr,uchar tn) { if(addr==benji) { P2=tn; return; } while(1) { ES=0; SM2=0; TB8=1; rd=1; delay(50); SBUF=addr; //发地址 while(TI!=1); delay(10); TI=0; delay(50); TB8=0; delay(50); SBUF=0x01; //发命令 while(TI!=1); delay(10); TI=0; delay(50); TBUF=tn; delay(50); SBUF=TBUF; //发数据 while(TI!=1); delay(10); TI=0; delay(50); rd=0; delay(10); //TB8=1; SM2=1; ES=1; return;} } void judge() { uchar sp1,sp2; sp1=~lamp; sp2=P0; sp2&=sp1; P0=sp2; zhuan_room(nroom,sp2); lamp=0;} //*******************************************// void str(void) //发送函数 {tready=0; st=P2; rd=1; delay(50); SBUF=st; while(TI!=1); delay(10); TI=0; delay(50); SM2=1; rd=0; delay(10); get_data=0; ES=1; } void sre(void) //接收函数 { rready=0; rd=0; delay(10); while(RI!=1); delay(50); RI=0; RBUF=SBUF; SM2=1; get_data=0; ES=1;} void str_sre() { uchar b; ES=0; SM2=0; rd=0; while(RI!=1); delay(10); RI=0; delay(50); b=SBUF; if(b==0x01) { sre(); P2=RBUF; } else {if(b==0x02) {str();}}} |
|
|
|
人中狼 发表于 2017-4-30 10:43 #include #define uchar unsigned char//把 unsigned char 宏定义为 uchar 以后只要写uchar 就是unsigned char 的意思 #define benji 0x01//本机地址0x02 uchar idata RBUF; uchar idata TBUF; uchar idata st,bb; uchar nroom=benji; uchar benji_data; uchar lamp=0,board=0,key=0; int f; bit f0; bit tready;//定义发送 bit rready;//定义接收 //sfr P0=0x80; //sfr P1=0x90; //sfr P2=0xa0; //sfr P3=0xb0; //sfr SBUF=0x99;//数据发送缓冲区 ***it rd=P3^7; bit get_data=0;//本机选中标志 //********************************************************* void delay(unsigned int time)//延迟程序,time=1ms {unsigned char k; unsigned int i; for(i=time*2;i>0;i--) for(k=248;k>0;k--);}//算法一层循环248*2=二层循环(496+3)*2=1ms unsigned char kbscan()//扫描程序 {unsigned char sccode,recode;//定义两个数 P1=0xf0;//定义P1口初值 if((P1&0xf0)!=0xf0)//判断P1口不等于初值的时候,有键按下 {delay(10); //延迟消除键位抖动 if((P1&0xf0)!=0xf0) //再判断 {sccode=0xfe; while((sccode&0x10)!=0) //循环只有当构号内的值不等于0时 ,进行下一步操作 {P1=sccode; if((P1&0xf0)!=0xf0) //将数值付给P1与初值相与,不等于初值时 {recode=(P1&0xf0)|0x0f; //这时候,定义的第二个数值取值 P1=0xf0; //将第二个数值付给P1口 return((~sccode)+(~recode)); //两个数值分别取反后,想加后返回 } else { sccode=(sccode<<1)|0x01; //不成立的话(按键)左移 }} }} return(0);} void keyvalue()//确定键盘值 {switch(key) { case 0x11 :lamp=0x01 ;break; case 0x21 :lamp=0x02 ;break; case 0x41 :lamp=0x04 ;break; case 0x81 :lamp=0x08 ;break; case 0x12 :lamp=0x10 ;break; case 0x22 :lamp=0x20 ;break; case 0x42 :lamp=0x40 ;break; case 0x82 :lamp=0x80 ;break; case 0x14 :board=0x01 ;break; case 0x24 :board=0x02 ;break; case 0x44 :board=0x04 ;break; case 0x84 :board=0x08 ;break; case 0x18 :board=0x10 ;break; case 0x28 :board=0x20 ;break; case 0x48 :board=0x40 ;break; case 0x88 :board=0x80 ;break;} } //*************************************// void Read_room(uchar addr) //读房间状态 { uchar bendata; if(addr==benji) { bendata=P2; RBUF=bendata; return; } ES=0; SM2=0; TB8=1; rd=1; delay(50); SBUF=addr; while(TI!=1); delay(10); TI=0; delay(50); TB8=0; rd=1; delay(50); SBUF=0x02; //发送读命令 while(TI!=1); delay(10); TI=0; delay(50); rd=0; while(RI!=1); //接收状态 delay(10); RI=0; delay(50); RBUF=SBUF; //TB8=1; SM2=1; ES=1; } void room() //room 选择 { nroom=board; Read_room(nroom); P0=RBUF; board=0; } //************************// void zhuan_room(uchar addr,uchar tn) { if(addr==benji) { P2=tn; return; } while(1) { ES=0; SM2=0; TB8=1; rd=1; delay(50); SBUF=addr; //发地址 while(TI!=1); delay(10); TI=0; delay(50); TB8=0; delay(50); SBUF=0x01; //发命令 while(TI!=1); delay(10); TI=0; delay(50); TBUF=tn; delay(50); SBUF=TBUF; //发数据 while(TI!=1); delay(10); TI=0; delay(50); rd=0; delay(10); //TB8=1; SM2=1; ES=1; return;} } void judge() { uchar sp1,sp2; sp1=~lamp; sp2=P0; sp2&=sp1; P0=sp2; zhuan_room(nroom,sp2); lamp=0;} //*******************************************// void str(void) //发送函数 {tready=0; st=P2; rd=1; delay(50); SBUF=st; while(TI!=1); delay(10); TI=0; delay(50); SM2=1; rd=0; delay(10); get_data=0; ES=1; } void sre(void) //接收函数 { rready=0; rd=0; delay(10); while(RI!=1); delay(50); RI=0; RBUF=SBUF; SM2=1; get_data=0; ES=1;} void str_sre() { uchar b; ES=0; SM2=0; rd=0; while(RI!=1); delay(10); RI=0; delay(50); b=SBUF; if(b==0x01) { sre(); P2=RBUF; } else {if(b==0x02) {str();}}} |
|
|
|
人中狼 发表于 2017-4-30 10:43 很抱歉。。网站一直在审核我发的程序。我发不出来。具体程序在这里https://bbs.elecfans.com/forum.p ... =1126107&extra= |
|
|
|
你的键盘程序比较乱,需要重新考虑考虑,
{sccode=0xfe; while((sccode&0x10)!=0) //循环只有当构号内的值不等于0时 ,进行下一步操作 {P1=sccode; 至少在这时P1=sccode,也就是P1=0xfe |
|
|
|
人中狼 发表于 2017-5-1 10:52 键盘程序我单独拿出来测试过。是可以行得通。可是我现在加入中断之后,我的P1口就直接为高了。去掉之后我P1口又正常了 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-使用AHT20进行环境监测之AHT20传感器介绍
828 浏览 0 评论
824 浏览 0 评论
861 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
836 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
1292 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11822 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-29 12:31 , Processed in 0.795409 second(s), Total 60, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号