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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
12
返回列表 發新帖
樓主: lmn2005
打印 上一主題 下一主題
收起左側

單片機加個PCF8574模塊,實現IIC方式驅動LCD1602

  [復制鏈接]
41#
ID:845027 發表于 2023-3-21 15:32 | 只看該作者
沒有人試STC89C51的嗎
孩子pcf8574為什么地址設置的0x27也不行
#include <reg52.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int

//#define                        L1                0x80            // 第一行寫入地址
//#define                        L2                0xc0            // 第二行寫入地址
        
sbit SCL = P2^1;
sbit SDA = P2^0;

uchar woder[]={"wangzijie"};

//char ADDR = 0x4E;    // PCF8574  T  模塊的地址碼
//char ADDR = 0x7e;    // PCF8574   AT  模塊的地址碼
char ADDR = 0x27;    // PCF8574   AT  模塊的地址碼


//***************************** 延時 y  ms ***********************************************


void delay1(int y)   //
{
         ;
        while(y--)
        {
        unsigned char a,b,c;
        for(c=1;c>0;c--)
        for(b=142;b>0;b--)
        for(a=2;a>0;a--);
        }
}






//******************************** IIC 串口開始 ********************************************


void IIC_start(void)
{
        SDA=1;
        _nop_();
        SCL=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SDA=0;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SCL=0;
}




//********************************** IIC 串口寫1個字節 ******************************************


void IIC_writeByte(char temp)
{
        char i;
        for(i=0;i<8;i++)
        {
                SDA=(bit)(temp & 0x80) ;   // 根據規定1602的數據最高位必須為  1  
                temp <<=1;
                _nop_();
                _nop_();
                SCL=1;
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                SCL=0;
        }
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SDA=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SCL=1;
        _nop_();
        _nop_();
        _nop_();
        while(SDA);
        _nop_();
        SCL=0;
}




//******************************** 1602寫命令 ********************************************


void LCD_write_command(char comm)
{
        char tmp;
        IIC_start();          // 串口開始
        IIC_writeByte(ADDR);  // 先選PCF 8574T 的地址  (應該是相當于選中的意思吧)
        
        tmp = comm & 0xF0;    // 與0xf0 應該是取第四位的意思吧
        tmp |= 0x0C;         //保留高4位為指令的高四位,低四位為   RS = 0, RW = 0, EN = 1  
        IIC_writeByte(tmp);  //從串口送出
        delay1(20);
        tmp &= 0xFB;        //Make EN = 0
        IIC_writeByte(tmp);
        
        tmp = (comm & 0x0F) << 4 ;  //將指令的低四位 送到高位置保存
        tmp |= 0x0C;        //RS = 0, RW = 0, EN = 1
        IIC_writeByte(tmp);
        delay1(20);
        tmp &= 0xFB; // Make EN = 0
        IIC_writeByte(tmp);
        
}
//******************************** 1602寫數據 ********************************************


void LCD_write_data(char data1)
{
        char tmp;
        IIC_start();
        IIC_writeByte(ADDR);   // 先選PCF8574T 的地址  (應該是相當于選中的意思吧)
        
        tmp = data1 & 0xF0;
        tmp |= 0x0D; //RS = 0, RW = 0, EN = 1
        IIC_writeByte(tmp);
        delay1(20);
        tmp &= 0xFB; //Make EN = 0
        IIC_writeByte(tmp);
        
        tmp = (data1 & 0x0F) << 4 ;
        tmp |= 0x0D; //RS = 0, RW = 0, EN = 1
        IIC_writeByte(tmp);
        delay1(20);
        tmp &= 0xFB ; // Make EN = 0
        IIC_writeByte(tmp);
}


//******************************** 1602初始化 ********************************************


void Init_Lcd(void)
{
        LCD_write_command(0x33); //將8位總線轉為4位總線
        delay1(50) ;
        LCD_write_command(0x32); //
        delay1(50) ;
        LCD_write_command(0x28); // 4位數據線0x28,顯示2行,5*7點陣字符  !如果是0x38  則為8位數據線,顯示2行,5*7點陣字符
        delay1(50) ;
        LCD_write_command(0x0C); // 開顯示,關閉光標,不閃爍
        delay1(50) ;  
        LCD_write_command(0x06); // 設定輸入方式,增量不位移
        delay1(50) ;
        LCD_write_command(0x01); // 清屏
        delay1(50) ;
//                LCD_write_command(0x80);  //設置數據指針起點
//                delay1(50) ;
}








//*************************************** 在指定位置顯示字符串 *************************************


void Write_LCD(int x, int y, char *str)
{
        char addr;
        if( x < 0)
        {
                x = 0;
        }
        if(x > 15)
        {
                x = 15;
        }
        if(y<0)
        {
                y = 0;
        }
        if(y > 1)
        {
                y = 1;
        }
        
        addr = 0x80 + 0x40 * y + x;   // Move cursor  移動光標
        LCD_write_command(addr);
        while (*str)
        {
                LCD_write_data(*str++);
        }
}


//-------------------------------------------- 顯示字符串的函數 ----------------------------------------------------


void LCD_write_word(unsigned char *s)                  //顯示字符串的函數
{
        while(*s>0)
        {
                LCD_write_data(*s);
                s++;
        }
}

void main()
{               
        uchar i;
        Init_Lcd();
//        for(i=0;i<9;i++)
//        {
        Write_LCD(0,0,(uchar *)woder[i]);
        LCD_write_word((uchar *)woder[i]);
//        }
        while(1);                               
}


//********************************* 指定位置顯示一個字符*******************************************


/*
void Print_Char (unsigned char line,unsigned char num,unsigned char date)
{
                LCD_write_command(line+num);
                LCD_write_data(date);
}


*/




//按指定位置顯示一個字符(針對1602液晶)-用在溫度顯示


//void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
//{
//Y &= 0x1;
//X &= 0xF;                 //限制X不能大于15,Y不能大于1
//if (Y) X |= 0x40;        //當要顯示第二行時地址碼+0x40;
//X |= 0x80;               // 算出指令碼
//LCD_write_command(X);    //這里不檢測忙信號,發送地址碼
//LCD_write_data(DData);
//}

看看代碼嗚嗚嗚@
回復

使用道具 舉報

42#
ID:1038987 發表于 2023-4-8 11:21 | 只看該作者
cx301 發表于 2021-2-16 22:09
借用樓主程序,用STC15W408單片機測試了一下,現把完整的測試工程文件分享一下

等我有分了來下載一下。終于看到了。謝謝分享希望好用。
回復

使用道具 舉報

43#
ID:1038987 發表于 2023-4-8 17:37 | 只看該作者
lmn2005 發表于 2019-3-5 10:28
補個實物連接圖:

我用的和這個是一樣的。您的代碼看不懂。用的204S用下面的408AS的也是不行。程序改了。端口也改了。希望得到回復
回復

使用道具 舉報

44#
ID:382014 發表于 2023-7-30 10:58 | 只看該作者
試了一下,可以用
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久亚洲国产精品 | 亚洲性网 | 91精品在线播放 | 日本激情一区二区 | 人成精品 | www.日日夜夜| 国产成人免费视频网站视频社区 | 国产视频中文字幕 | 欧美一区二区三区视频 | 日韩一级欧美一级 | 九九在线视频 | 亚洲欧美视频一区二区 | ww 255hh 在线观看 | 亚洲第一中文字幕 | 免费观看黄a一级视频 | 人人干人人爽 | 999免费观看视频 | 久久精品高清视频 | 国产激情片在线观看 | 成人在线一区二区三区 | 一本岛道一二三不卡区 | 热99| 99在线免费视频 | 国产精品色哟哟网站 | 夜夜精品浪潮av一区二区三区 | 久久国产精品色av免费观看 | 黄色一级毛片免费看 | 羞视频在线观看 | 久久久精品一区二区三区 | 精品久久久网站 | 大学生a级毛片免费视频 | 国产伦精品一区二区三区精品视频 | 人人艹人人 | 桃花av在线 | 中文字幕国产精品 | 久草精品视频 | 欧美日韩免费视频 | 久草在线青青草 | 日韩欧美在线观看 | 91视频电影 | 涩涩视频网|