12864显示屏发送数据时要关中断

12864显示屏发送数据时要关中断,第1张

首先,你要用软件允许中断,即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显示乱码问题,由于字数限制不相关函数去掉了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10164958.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存