目前共有2篇帖子。 內容轉換:不轉換▼
 
點擊 回復
290 1
【程式】1602液晶中寫入字元串時自動換行
一派護法 十九級
1樓 發表于:2016-7-4 12:35

#include <reg52.h>
#include <intrins.h>

sbit RS = P2^6;
sbit RW = P2^5;
sbit E = P2^7;
sbit BF = P0^7;

void delay(unsigned int n)
{
    unsigned char i;
    while (n--)
        for (i = 0; i < 115; i++);
}

bit LCDBusyTest()
{
    bit result;
    RS = 0;
    RW = 1;
    E = 0;
    _nop_(); // Tas
    E = 1;
    _nop_(); // Tddr
    BF = 1;
    result = BF;
    E = 0;
    return result;
}

unsigned char LCDReadData(void)
{
    unsigned char dat;
    while (LCDBusyTest());
    RS = 1;
    RW = 1;
    E = 0;
    _nop_(); // Tas
    E = 1;
    _nop_(); // Tddr
    P0 = 0xff;
    dat = P0;
    E = 0;
    return dat;
}

void LCDWriteCmd(unsigned char cmd)
{
    while (LCDBusyTest());
    RS = 0;
    RW = 0;
    E = 0;
    _nop_(); // Tas
    E = 1;
    P0 = cmd;
    _nop_(); // Tdsw
    E = 0;
    _nop_(); // Th
}

void LCDWriteData(unsigned char dat)
{
    while (LCDBusyTest());
    RS = 1;
    RW = 0;
    E = 0;
    _nop_(); // Tas
    E = 1;
    P0 = dat;
    _nop_(); // Tdsw
    E = 0;
    _nop_(); // Th
}

// 获取当前光标位置
void LCDGetPos(unsigned char *col, unsigned char *row)
{
    unsigned char addr;
    while (LCDBusyTest());
    delay(1);
    E = 1;
    _nop_();
    P0 = 0xff;
    addr = P0 & 0x7f;
    E = 0;
    *col = addr % 0x40;
    *row = addr / 0x40;
}

// 设置当前光标位置
void LCDSetPos(unsigned char col, unsigned char row)
{
    LCDWriteCmd(0x80 + row * 0x40 + col);
}

// 读取字符串, 不自动换行
/*void LCDReadString(char *buf, int n)
{
    while (n--)
        *buf++ = LCDReadData();
    *buf = '\0';
}*/

// 读取字符串, 自动换行
void LCDReadStringEx(char *buf, int n)
{
    unsigned char col, row;
    LCDGetPos(&col, &row);
    while (n--)
    {
        if (col >= 0x10)
        {
            col = 0;
            row = !row;
            LCDSetPos(col, row);
        }
        *buf++ = LCDReadData();
        col++;
    }
    *buf = '\0';
}

// 输出字符串, 不自动换行
void LCDWriteString(char *s)
{
    while (*s)
        LCDWriteData(*s++);
}

// 输出字符串, 自动换行
void LCDWriteStringEx(char *s)
{
    unsigned char col, row;
    LCDGetPos(&col, &row);
    while (*s)
    {
        if (col >= 0x10)
        {
            col = 0;
            row = !row;
            LCDSetPos(col, row);
        }
        LCDWriteData(*s++);
        col++;
    }
}

void LCDClear(void)
{
    LCDWriteCmd(0x01);
}

void LCDInit(void)
{
    unsigned char i = 3;
    delay(15);
    while (i--)
    {
        LCDWriteCmd(0x38);
        delay(5);
    }
    LCDWriteCmd(0x0c);
    delay(5);
    LCDClear();
}

int main(void)
{
    char str[30] = "This is a string. ";
    
    LCDInit();
    LCDWriteStringEx(str);
    delay(2000);
    LCDWriteStringEx("It identifies a printer port.");
    delay(2000);
    
    // 读取屏幕上输出的内容并显示
    LCDSetPos(10, 0);
    LCDReadStringEx(str, 10);
    LCDClear();
    LCDWriteString(str);
    
    while (1);
}
一派護法 十九級
2樓 發表于:2016-7-4 12:37

【運行效果】
第一屏:
This is a string
.
第二屏:
a printer port.g
. It identifies
第三屏:
port.g. It

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:290 回複數:1
評論數: ?
作者: 巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2016-7-4 12:37
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。