|
今天我在擺弄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++);
}
發現程序竟然還可以正常運行,
請各位大佬幫忙解惑,以前從來沒有關注過這個問題
|
|