|
今天我在摆弄1602的时候,想让一组字母从地址0x80+0x10处左移16位,一开始我的程序写好之后,开始运行,可是就左移一位就卡住了,只左移了一位,下面是单片机源程序:
————————————————
#include <reg52.h>
typedef unsigned char uchar;
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
uchar code table[]="I LOVE YOU";
void read_busy()
{
uchar busy;
P0=0xff;
RS=0;
RW=1;
do
{
EN=1;
busy=P0;
EN=0;
}while(busy&0x80);
}
void write_cmd(uchar cmd)
{
read_busy();
RS=0;
RW=0;
P0=cmd;
EN=1;
EN=0;
}
void write_date(uchar date)
{
read_busy();
RS=1;
RW=0;
P0=date;
EN=1;
EN=0;
}
void delay(int x)
{
char i,j;
for(i=0;i<x;i++)
for(j=0;j<125;j++);
}
void main()
{
uchar i,num;
write_cmd(0x38);//初始化
write_cmd(0x0e);//开显示
write_cmd(0x01);//清屏
write_cmd(0x06);//地址指针加1
write_cmd(0x80+0x00);
for(num=0;num<10;num++)
{
write_date(table[num]);
}
for(i=0;i<16;i++)
{
write_cmd(0x18);
delay(250);
}
while(1);
}
——————————————————
但是之后我检查了一下好几遍程序,发现无论是初始化,还是读忙,还是输入指令,输入数据,都没有问题,
那唯一可能的就是延时函数那一块,于是我看了延时函数,
void delay(int x)
{
char i,j;
for(i=0;i<x;i++)
for(j=0;j<125;j++);
}
————
发现我把x定义成int,把i和j定义成char了,然后我把char改成了int,重新烧录程序,发现这次程序运行正确,
即把函数改为
void delay(int x)
{
int i,j;
for(i=0;i<x;i++)
for(j=0;j<125;j++);
}
————
之后我又把int改为了char,发现这次程序运行的特别快,几乎看不到字母移动的过程,
即把函数改为:
void delay(char x)
{
char i,j;
for(i=0;i<x;i++)
for(j=0;j<125;j++);
}
然而之后我又把函数改为
void delay(int x)
{
unsigned char i,j;
for(i=0;i<x;i++)
for(j=0;j<125;j++);
}
发现程序竟然还可以正常运行,
请各位大佬帮忙解惑,以前从来没有关注过这个问题
|
|