新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機驅動BH1750FVI光照LCD液晶顯示

        51單片機驅動BH1750FVI光照LCD液晶顯示

        作者: 時間:2016-12-02 來源:網絡 收藏
        BH1750FVI是基于IIC協議的器件,單片機是STC89C52,晶振是11.0592MHZ,顯示部分是LCD1602液晶屏,不同的工作環境,需要調整此函數,當改用1T的MCU時,請調整此延時函數。程序都是詳細注釋,大家有福了!

        #include
        #include //Keil library
        #include //Keil library
        #include
        #define uchar unsigned char
        #define uint unsigned int
        #define DataPort P0 //LCD1602數據端口
        sbit SCL=P2^0; //IIC時鐘引腳定義
        sbit SDA=P2^1; //IIC數據引腳定義
        sbit LCM_RS=P1^0; //LCD1602命令端口
        sbit LCM_RW=P1^1; //LCD1602命令端口
        sbit LCM_EN=P1^2; //LCD1602命令端口

        本文引用地址:http://www.104case.com/article/201612/324629.htm

        #define SlaveAddress 0x46 //定義器件在IIC總線中的從地址,根據ALT ADDRESS地址引腳不同修改
        //ALT ADDRESS引腳接地時地址為0xA6,接電源時地址為0x3A
        typedef unsigned char BYTE;
        typedef unsigned short WORD;

        BYTE BUF[8]; //接收數據緩存區
        uchar ge,shi,bai,qian,wan; //顯示變量
        int dis_data; //變量

        void delay_nms(unsigned int k);
        void InitLcd();
        void Init_BH1750(void);

        void WriteDataLCM(uchar dataW);
        void WriteCommandLCM(uchar CMD,uchar Attribc);
        void DisplayOneChar(uchar X,uchar Y,uchar DData);
        void conversion(uint temp_data);

        void Single_Write_BH1750(uchar REG_Address); //單個寫入數據
        uchar Single_Read_BH1750(uchar REG_Address); //單個讀取內部寄存器數據
        void Multiple_Read_BH1750(); //連續的讀取內部寄存器數據
        void Delay5us();
        void Delay5ms();
        void BH1750_Start(); //起始信號
        void BH1750_Stop(); //停止信號
        void BH1750_SendACK(bit ack); //應答ACK
        bit BH1750_RecvACK(); //讀ack
        void BH1750_SendByte(BYTE dat); //IIC單個字節寫
        BYTE BH1750_RecvByte(); //IIC單個字節讀
        void conversion(uint temp_data) // 數據轉換出 個,十,百,千,萬
        {
        wan=temp_data/10000+0x30 ;
        temp_data=temp_data%10000; //取余運算
        qian=temp_data/1000+0x30 ;
        temp_data=temp_data%1000; //取余運算
        bai=temp_data/100+0x30 ;
        temp_data=temp_data%100; //取余運算
        shi=temp_data/10+0x30 ;
        temp_data=temp_data%10; //取余運算
        ge=temp_data+0x30;
        }

        //毫秒延時**************************
        void delay_nms(unsigned int k)
        {
        unsigned int i,j;
        for(i=0;i{
        for(j=0;j<121;j++)
        {;}}
        }

        /*******************************/
        void WaitForEnable(void)
        {
        DataPort=0xff;
        LCM_RS=0;LCM_RW=1;_nop_();
        LCM_EN=1;_nop_();_nop_();
        while(DataPort&0x80);
        LCM_EN=0;
        }
        /*******************************/
        void WriteCommandLCM(uchar CMD,uchar Attribc)
        {
        if(Attribc)WaitForEnable();
        LCM_RS=0;LCM_RW=0;_nop_();
        DataPort=CMD;_nop_();
        LCM_EN=1;_nop_();_nop_();LCM_EN=0;
        }
        /*******************************/
        void WriteDataLCM(uchar dataW)
        {
        WaitForEnable();
        LCM_RS=1;LCM_RW=0;_nop_();
        DataPort=dataW;_nop_();
        LCM_EN=1;_nop_();_nop_();LCM_EN=0;
        }
        /***********************************/
        void InitLcd()
        {
        WriteCommandLCM(0x38,1);
        WriteCommandLCM(0x08,1);
        WriteCommandLCM(0x01,1);
        WriteCommandLCM(0x06,1);
        WriteCommandLCM(0x0c,1);
        }
        /***********************************/
        void DisplayOneChar(uchar X,uchar Y,uchar DData)
        {
        Y&=1;
        X&=15;
        if(Y)X|=0x40;
        X|=0x80;
        WriteCommandLCM(X,0);
        WriteDataLCM(DData);
        }
        void Delay5us()
        {
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        }
        void Delay5ms()
        {
        WORD n = 560;

        while (n--);
        }/**************************************
        起始信號
        **************************************/
        void BH1750_Start()
        {
        SDA = 1; //拉高數據線
        SCL = 1; //拉高時鐘線
        Delay5us(); //延時
        SDA = 0; //產生下降沿
        Delay5us(); //延時
        SCL = 0; //拉低時鐘線
        }

        /**************************************
        停止信號
        **************************************/
        void BH1750_Stop()
        {
        SDA = 0; //拉低數據線
        SCL = 1; //拉高時鐘線
        Delay5us(); //延時
        SDA = 1; //產生上升沿
        Delay5us(); //延時
        }

        /**************************************
        發送應答信號
        入口參數:ack (0:ACK 1:NAK)
        **************************************/
        void BH1750_SendACK(bit ack)
        {
        SDA = ack; //寫應答信號
        SCL = 1; //拉高時鐘線
        Delay5us(); //延時
        SCL = 0; //拉低時鐘線
        Delay5us(); //延時
        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 龙游县| 新蔡县| 湄潭县| 泊头市| 玉田县| 陆河县| 西吉县| 搜索| 淮北市| 呼图壁县| 绩溪县| 吐鲁番市| 东阳市| 朝阳市| 九江县| 新化县| 宜章县| 新乡县| 玉山县| 启东市| 玛沁县| 什邡市| 广丰县| 临泽县| 修水县| 丹棱县| 肥乡县| 安阳县| 琼中| 桃源县| 大丰市| 桐柏县| 旅游| 明水县| 浦北县| 邳州市| 株洲市| 论坛| 丰宁| 临安市| 晋中市|