首先,你要用软件允许中断,即C语言中EA=1;//允许总中断ES=1;//允许串口中断汇编中可用SETBEA;允许总中断SETBES;允许串口中断当单片机接收到一帧数据后,RI会置1,向CPU申请中断,若之前有中断允许,则产生了中断,进入中断服务程序。
当然,单片机发送完一帧数据,TI也会置1,同样会产生中断!一般我们在发送数据时要关中断,因为一般你不用在发送时不用处理数据;接收数据时要开中断,以便你在中断服务程序中将接收到的数据进行存储并处理。补充:其实,不管你有没有允许中断,上位机(此时即给单片机发送信息的机器)只要给单片机发送数据,单片机就会自动接收数据,并把它放在数据缓冲器SBUF中,如果你之前有允许串行口中断,RI就会置1,向单片机CPU申请中断,并进入中断服务程序,即你问题中的serial()函数,做完这个函数后就会自动返回断点。
如果你没有允许中断,便不会产生串行中断。
其实,你的问题有个错误:别的中断都是某个I/O口电平变化产生。
这只是外部中断产生条件,不过,你之前也需要用软件允许外部中断。
另外,常见的51系列单片机有5个中断源三种中断5:
1、外部中断0和1;
2、定时器/计数器溢出中断0和1;
3、串行口中断。
另外,STC51系列还有定时器/计数器T2中断,A/D转换中断,PWM中断,串行中断2等等。你还有什么不懂的可以自己多翻一翻书,学到后面去了你就明白了。
你的问题中那个serial()函数中P1=SBUF;是把接收的数据送到并行P1口,然后那条RI=0;是不可少的,这是用软件清零RI,准备再次接受一帧数据产生中断,如果你没有这条语句,就会进入死循环,出不来了。有什么问题还可以Q我(1445090023),希望能给我评个最佳答案。
问题提的不够明确啊、。。。
有冲突的情况没有说清楚啊,是数码管或12864显示的是错误数据,还是数码管或12864没显示数据,又或者是将12864取下后数码管就能正常显示
还有,用不同的IO口是所有的口都不同(包括片选、电源正负极、使能等等),还是只是数据口不同?
说清楚才能判断是硬件问题还是软件问题,光贴个代码,不够啊!
x00=unm/100;
xx=unm%100;
x0=xx/10;
x=xx%10;
数据分离出错
改下
x00=unm/1000; 千位
xx=unm%1000/100;百
x0=xx%100/10;十
x=xx%10;个
#include <reg51h>
#include <intrinsh>
#include <stdioh>
#define uchar unsigned char
#define Fisrt_Addr 0 //定义字符/汉字显示起始位置
sbit LCD_RS=P2^2;
sbit LCD_RW=P2^3;
sbit LCD_E=P2^4;
sbit PCB=P2^5;
uchar i,j;
void delay(int ms)
{
while(ms--)
{
for(j=0;j<120;j++);
}
}
bit lcd_busy()
{ bit result;
LCD_RS=0;
LCD_RW=1;
LCD_E= 1;
result=(bit)(P0&0x80);
LCD_E=0;
return result;
}
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS=0;
LCD_RW=0;
P0=cmd;
LCD_E=1;
LCD_E=0;
}
void lcd_wdata(uchar dat)
{
while(lcd_busy());
LCD_RS=1;
LCD_RW=0;
P0=dat ;
LCD_E=1;
LCD_E=0;
}
void lcd_initial()
{
lcd_wcmd(0x30);
delay(1);
lcd_wcmd(0x0C); //开显示,关光标,不闪烁
delay(1);
lcd_wcmd(0x06);//指定在资料写入或读取时,光标的移动方向
delay(1);
lcd_wcmd(0x01);
delay(10); //这里要延时长一点,否侧会影响下面的 *** 作
}
/------------------清屏命令--------------------------/
void Clr_Screen()
{
//考虑到前面出现0x34
lcd_wcmd(0x01);
delay(100);
}
void Zi_FU(uchar code s)
{
while(s!=0)
{ lcd_wdata(s);
s++;
delay(10);
}
}
void feeling1()
{
lcd_wcmd(0x30);
delay(300);
lcd_wcmd(0x80+Fisrt_Addr);
Zi_FU("2013 03 26");
delay(300);
lcd_wcmd(0x90+Fisrt_Addr);
Zi_FU("电气08-17");
delay(300);
lcd_wcmd(0x88+Fisrt_Addr);
Zi_FU("ne-qi");
delay(300);
lcd_wcmd(0x98+Fisrt_Addr);
delay(500);
Zi_FU("2012530");
}
void main()
{
PCB=1;
while(1)
{
lcd_initial();
delay(1000);
Clr_Screen();
feeling1();
delay(3000);
for(i=8;i>0;i--)
{
lcd_wcmd(0x18); //一二行与三四行调换了,液晶分为上下两个半屏,
delay(1000);
}
Clr_Screen();
feeling1();
lcd_wcmd(0x34);
lcd_wcmd(0x04);
delay(3000);
lcd_wcmd(0x04); //恢复正常
delay(3000);
lcd_wcmd(0x34);
lcd_wcmd(0x03); //允许输入滚动地址
for(i=0x40;i<0x7f;i++)
{
lcd_wcmd(i); //垂直滚动屏幕的内容
delay(600); //上翻屏延时
}
}
}
以上就是关于12864显示屏发送数据时要关中断全部的内容,包括:12864显示屏发送数据时要关中断、单片机中12864液晶和数码管显示有冲突(C程序),用的不同的IO口,是什么情况呀、51单片机上12864显示乱码问题,由于字数限制不相关函数去掉了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)