89C51中断响应条件
- 中断源有中断请求
- 此中断源的中断允许位为1
- CPU开启中断(即EA=1)
满足以上条件时中断服务程序才可以被响应。
中断处理过程
我基于自已的理解写一下吧。
定时器方式1的中断常用来计时或计数(我目前只用到了计时)。它的中断处理过程是靠那些特殊的寄存器来实现的,用代码来讲一下中断的流程。
void init()
{
TMOD=0x01;//设置定时器的工作方式
TH0=(65536-50000)/256;//对定时器进行装初值
TL0=(65536-50000)%256;
EA=1;//CPU总中断打开
ET0=1;//定时器中断允许位打开
TR0=0;//定时器运行控制位
}
再用定时器的方式0时,先要对其要用的寄存器进行初始化。此时的定时器还没有打开,主函数中需要在打开定时器的时候写上**TR0=1;**以打开定时器。之后在定时器没有装满值前,主函数依然在运行,直至定时器溢出TF0置1,向CPU发出中断申请,这时主程序才停下来,然后去执行中断服务程序中的代码。只要TR0=1,中断就一直进行,也就是程序在每次执行时都会进入中断服务程序。
void time() interrupt 1
{
TH0=(65536-40000)/256;
TL0=(65536-40000)%256;
num++;
if(num==20)
{
num=0;
ge++;
}
}
1602液晶显示屏
液晶通常是按照显示字符的行数或液晶点阵的行,列数来命名的。1602的意思是一行显示16个字符,共可以显示两行。这类液晶只能显示ASCII码字符,如数字,大小写字母,各种符号等。
1602液晶显示屏有8个数据口,可以连在单片机的一个大端口(8个IO口)上。还有三个特殊的口用于控制显示屏。
RS
数据/命令选择端(H/L),它控制着显示屏时进行数据操作还是进行命令操作。当RS=1时,对LCD进行数据操作;当RS=0时,对LCD进行指令操作。
RW
读写选择端(H/L),它控制着对LCD的读和写,当RW=1时,对液晶进行读操作;当RW=0时,对液晶进行写操作。但是我们一般都是对LCD进行写操作,所以一般RW=0。
E
使能信号端,给它一次高脉冲标志着对它的操作,在写程序的时候先将要输入的数据或命令的值赋给LCD的8个数据口,然后给E一次高脉冲。
在进行设置时必须先设置RS,然后设置RW,最后设置E。
RAM地址映射区
控制器内部带有80B的RAM缓冲区,向00至0F,40至4F地址的任意处写入数据时,液晶都可以立即显示出来。前16个地址对应液晶的第一行的16显示字符的位置,后16个对应第二行的16的位置。
当写到其他地址上时,必须通过移屏指令将其移到可显示区域方可正常显示。
这是我写的1602显示模式设置,显示开/关及光标设置。
void write_com(uchar com)
{
rs=0; //设置对LCD进行写指令操作
rw=0; //设置对LCD进行写数据操作
P0=com; //将数据或命令送到数据线上
e=1; //给E一个高脉冲,将数据传到液晶显示器
delayms(2);
e=0;
}
void write_date(uint date)
{
rs=1; //同上
rw=0;
P0=date;
e=1;
delayms(2);
e=0;
}
void lcdinit()
{
e=0; //先将E置0,以便后面给E一个高脉冲
write_com(0x38);//显示模式设置
write_com(0x0c);//开显示,不显示光标
write_com(0x06);//当读或写一个字符后地址指针加1,且光标加1,当写一个字符时,整屏显示不移动
write_com(0x01);//回车清屏
}
本来想把我的全部函数放上来的,但是好像放不上来着么多,好无奈啊。
这是我第一次写博客,可能写的条理不是很清晰。但我写了好多自己理解后总结的东西,希望对读者有帮助。写的要是有什么问题欢迎大家提出来,以便我改正。