久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2754|回復: 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++);
}

發現程序竟然還可以正常運行,
請各位大佬幫忙解惑,以前從來沒有關注過這個問題

51hei圖片20191104205306.jpg (3.41 MB, 下載次數: 48)

這是剛開始的時候的運行結果

這是剛開始的時候的運行結果

video_20191104_210240.zip

6.14 MB, 下載次數: 3

這是把延時函數中的char改為int之后1602運行的過程

video_20191104_211138.zip

5.18 MB, 下載次數: 2

這是把延時函數中的int改為char后1602顯示的過程

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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溢出了
回復

使用道具 舉報

5#
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
回復

使用道具 舉報

6#
ID:627807 發表于 2019-11-5 13:23 來自手機 | 只看該作者
ping264888 發表于 2019-11-5 08:10
char -128 ~ +128
unsigned char 0-256
int -32768 ~ +32768

是的是的,以前學過,但是沒怎么記
回復

使用道具 舉報

7#
ID:627807 發表于 2019-11-5 13:24 來自手機 | 只看該作者
哦哦,謝謝
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 最近日韩中文字幕 | 亚洲午夜一区二区 | 免费观看的av毛片的网站 | 亚洲二区在线 | 国产精品精品久久久 | 四虎免费视频 | 久久久av| 欧美 中文字幕 | 九九综合 | 99精品电影 | 中文字幕一区二区三区在线观看 | 中文字幕 欧美 日韩 | 天堂色区 | 精品视频免费 | 国产成人av在线播放 | 国精日本亚洲欧州国产中文久久 | 欧美在线日韩 | 精品国产乱码久久久久久蜜臀 | 国产精品揄拍一区二区久久国内亚洲精 | 日日夜夜精品视频 | 欧美日韩视频在线播放 | 精品欧美色视频网站在线观看 | 久久久精品影院 | 精品综合 | 亚洲一区二区三区免费视频 | 日韩中文字幕 | 你懂的在线视频播放 | 日日噜噜夜夜爽爽狠狠 | 日本精品一区二区三区在线观看视频 | 国产精品久久久久久模特 | 久久国产精品久久久久久 | 久久久999国产精品 中文字幕在线精品 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 91免费在线播放 | 国产欧美在线播放 | 在线观看亚洲 | 欧美成人自拍视频 | 美人の美乳で授乳プレイ | 欧美午夜精品 | 欧美在线国产精品 | 欧美精品一区在线观看 |