找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2835|回复: 6
收起左侧

关于单片机延时函数和定义变量的一点问题

[复制链接]
ID:627807 发表于 2019-11-4 21:23 | 显示全部楼层 |阅读模式
今天我在摆弄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++);
}

发现程序竟然还可以正常运行,
请各位大佬帮忙解惑,以前从来没有关注过这个问题

这是刚开始的时候的运行结果

这是刚开始的时候的运行结果

video_20191104_210240.zip

6.14 MB, 下载次数: 3

这是把延时函数中的char改为int之后1602运行的过程

video_20191104_211138.zip

5.18 MB, 下载次数: 2

这是把延时函数中的int改为char后1602显示的过程

回复

使用道具 举报

ID:635731 发表于 2019-11-5 02:04 | 显示全部楼层
delay(250)-->250已经超出了char变量可以表示的范围,即溢出了,实际已为负数,所以基本上没有延时了,所以程序运行得特别快
回复

使用道具 举报

ID:365802 发表于 2019-11-5 08:10 | 显示全部楼层
char -128 ~ +128
unsigned char 0-256
int -32768 ~ +32768
int 0 ~ 65536
显然你需要复习一下各类型能表示的范围.
回复

使用道具 举报

ID:635290 发表于 2019-11-5 08:27 | 显示全部楼层
char溢出了
回复

使用道具 举报

ID:213173 发表于 2019-11-5 08:44 | 显示全部楼层
1.有参延时函数的参数数据类型应与函数内for循环变量的数据类型一致。否则由于可能发生数据溢出而达不到预想的延时时间。
2.CPU处理8位数据和处理16位数据所耗时不同,所以相同的延时函数只改变数据类型,两者延时时间相差4倍。

在12T单片机和12MHz晶振的条件下两种延时函数的延时时间:
        delay(250); //uchar 型 64.76ms
        delay(250); //uint   型253.26ms
回复

使用道具 举报

ID:627807 发表于 2019-11-5 13:23 来自触屏版 | 显示全部楼层
ping264888 发表于 2019-11-5 08:10
char -128 ~ +128
unsigned char 0-256
int -32768 ~ +32768

是的是的,以前学过,但是没怎么记
回复

使用道具 举报

ID:627807 发表于 2019-11-5 13:24 来自触屏版 | 显示全部楼层
哦哦,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表