娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年05月13日(星期二)

正在發生

2019年05月13日 | LCD1602驅動程序

發布者:夢想啟航 來源: eefocus關鍵字:LCD1602  驅動程序 手機看文章 掃描二維碼
隨時隨地手機看文章

LCD1602driver_inside.c



/*本驅動依賴reg51.h頭文件*/
#include


/*根據實際電路連接修改宏定義和sbit語句*/
#define D0_D7 P3    //數據通訊總線,用于寫或讀指令、顯示地址和顯示數據
sbit RS = P2^5;     //寄存器選擇引腳,設0選擇指令和顯示地址寄存器,設1選擇顯示數據寄存器
sbit RW = P2^6;     //讀寫引腳,設0為寫,設1為讀
sbit E = P2^7;      //信號使能引腳,設0允許寫,設1允許讀
sbit BF = P3^7;     //忙信號,忙為1,不忙為0


/*根據實際電路連接修改宏定義和sbit語句*/


/*內部函數聲明*/


bit Busy_Check();       //1602忙信號檢測,忙返回1,不忙返回0(所有寫操作前均需要調用此函數
void Data_Write(char Data);     //寫入8位顯示數據(支持直接接收1602字庫內字符或對應ASCII碼)
void Addr_Write(unsigned char Addr);        //寫入8位顯示地址
void Command_Write(unsigned char Command);      //寫入1602的各種命令
void Cursor_Reset();        //光標位置重置為左上角
unsigned char Coordinate_To_Addr(unsigned char X_Intercept,unsigned char Y_Intercept);      //將輸入的顯示坐標轉換為相應顯示地址并返回
/*單行顯示時,0 <= X_Intercept <= 79,Y_Interce == 0;雙行顯示時,0 <= X_Intercept <= 39,0 <= Y_Interce <= 1;*/
void DelayMS(unsigned int MS_Num);      //延時函數MS
void Open_Screen_Inside();          //屏幕顯示開啟函數
void Close_Screen_Inside();     //屏幕顯示關閉函數
void Move_Screen_Left_Inside();     //屏幕左移動函數
void Move_Screen_Right_Inside();        //屏幕右移動函數
void Reset_D0_D7();     //設置通訊總線為低電平
/*內部函數聲明*/


/*void main()       //語法測試用,使用時取消語句注釋
{
    Reset_D0_D7();
    Command_Write(0x38);
    DelayMS(5);
    Command_Write(0x06);
    Open_Screen_Inside();
    DelayMS(5);
    Command_Write(0x01);
    DelayMS(5);
    Addr_Write(Coordinate_To_Addr(0,0)); 
    DelayMS(1);
    Data_Write('5');
    P3 = 0;
    Close_Screen_Inside();
    Open_Screen_Inside();
    Data_Write('6');
    Data_Write('7');
    Data_Write('7');
    Move_Screen_Inside(1);
    Move_Screen_Inside(1);
    Cursor_Reset();
    Data_Write('7');
    Data_Write('7');
    Move_Screen_Inside(1);
    while(1){P1 = 0;}
}    */


/*內部函數定義*/
void Reset_D0_D7()
{
    D0_D7 = 0;
}


void DelayMS(unsigned int MS_Num)
{
    unsigned char a,b;
    for(;MS_Num>0;MS_Num--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}


bit Busy_Check()
{
//  bit result;
//  RS = 0;
//  RW = 1;
//  E = 1;
    DelayMS(1);   //偽忙檢查
//  result = (bit)(P2&0x80);
//  return result;
}


void Data_Write(char Data)
{
    RS = 1;
    RW = 0;
    E = 0;
    DelayMS(1);
    D0_D7 = Data;
    E = 1;
    DelayMS(1);
    E = 0;
}


void Addr_Write(unsigned char Addr)
{
    RS = 0;
    RW = 0;
    E = 0;
    DelayMS(1);
    D0_D7 = Addr;
    E = 1;
    DelayMS(1);
    E = 0;
}


void Command_Write(unsigned char Command)
{
    RS = 0;
    RW = 0;
    E = 0;
    DelayMS(1);
    D0_D7 = Command;
    E = 1;
    DelayMS(1);
    E = 0;
}


void Cursor_Reset()
{
    RS = 0;
    RW = 0;
    E = 0;
    DelayMS(1);
    D0_D7 = 0x02;
    E = 1;
    DelayMS(1);
    E = 0;
}


unsigned char Coordinate_To_Addr(unsigned char X_Intercept,unsigned char Y_Intercept)
{
    unsigned char Addr;
    if(Y_Intercept == 0)
    {
        Addr = 0x80 + X_Intercept;
    }
    if(Y_Intercept == 1)
    {
        Addr = 0xC0 + X_Intercept;
    }
    return Addr;
}


void Open_Screen_Inside()
{
    RS = 0;
    RW = 0;
    E = 0;
    Command_Write(0x0C);
    E = 1;
    DelayMS(1);
    E = 0;
}


void Close_Screen_Inside()
{
    RS = 0;
    RW = 0;
    E = 0;
    Command_Write(0x08);
    E = 1;
    DelayMS(1);
    E = 0;
}


void Move_Screen_Left_Inside()
{
    RS = 0;
    RW = 0;
    E = 0;
    Command_Write(0x18);       
    E = 1;
    DelayMS(1);
    E = 0;
}


void Move_Screen_Right_Inside()
{
    RS = 0;
    RW = 0;
    E = 0;
    Command_Write(0x1C);       
    E = 1;
    DelayMS(1);
    E = 0;
}

LCD1602driver_inside.h


#ifndef _LCD1602DRIVER_INSIDE_H_
#define _LCD1602DRIVER_INSIDE_H_ 


unsigned char Busy_Check();     //1602忙信號檢測,忙返回1,不忙返回0(所有寫操作前均需要調用此函數
void Data_Write(char Data);     //寫入8位顯示數據(支持直接接收1602字庫內字符或對應ASCII碼)
void Addr_Write(unsigned char Addr);        //寫入8位顯示地址
void Command_Write(unsigned char Command);      //寫入1602的各種命令
void Cursor_Reset();        //光標位置重置為左上角
unsigned char Coordinate_To_Addr(unsigned char X_Intercept,unsigned char Y_Intercept);      //將輸入的顯示坐標轉換為相應顯示地址并返回
/*單行顯示時,0 <= X_Intercept <= 79,Y_Interce == 0;雙行顯示時,0 <= X_Intercept <= 39,0 <= Y_Interce <= 1;*/
void DelayMS(unsigned int MS_Num);
void Open_Screen_Inside();          //屏幕顯示開啟函數
void Close_Screen_Inside();     //屏幕顯示關閉函數
void Move_Screen_Left_Inside();     //屏幕左移動函數
void Move_Screen_Right_Inside();        //屏幕右移動函數
void Reset_D0_D7();     //設置通訊總線為低電平


#endif
 
LCD1602.c


/*


unsigned char Busy_Check();     //1602忙信號檢測,忙返回1,不忙返回0(所有寫操作前均需要調用此函數
void Data_Write(unsigned char Data);        //寫入8位顯示數據(支持直接接收1602字庫內字符或對應ASCII碼)
void Addr_Write(unsigned char Addr);        //寫入8位顯示地址
void Command_Write(unsigned char Command);      //寫入1602的各種命令
void Cursor_Reset();        //光標位置重置為左上角
unsigned char Coordinate_To_Addr(unsigned char X_Intercept,unsigned char Y_Intercept);      //將輸入的顯示坐標轉換為相應顯示地址并返回
/雙行顯示時,0 <= X_Intercept <= 47,Y_Interce == 0;單行顯示時,0 <= X_Intercept <= 79,0 <= Y_Interce <= 1;/


void DelayMS(unsigned int MS_Num);
void Open_Screen_Inside();          //屏幕顯示開啟函數
void Close_Screen_Inside();     //屏幕顯示關閉函數
void Move_Screen_Left_Inside();     //屏幕左移動函數
void Move_Screen_Right_Inside();        //屏幕右移動函數
void Reset_D0_D7();     //設置通訊總線為低電平


*/
#include"LCD1602driver_inside.h"
#include       
//包含內部函數,具體包含內容查閱LCD1602driver_inside.h和LCD1602driver內部函數.c,要了解函數功能也可以查看本文件開頭的大段注釋


/*可調用函數聲明*/


void LCD1602_Init(unsigned char Line_Num,unsigned char Char_Type);      //初始化函數,接收行數(1或2)和點陣字符類型(1或2,對應5x7和5x10點陣字符)
void LCD1602_Clear_Screen();
void LCD1602_Write_Char_Screen(char ASCII_Data,unsigned char X_Intercept,unsigned char Y_Intercept);        //單字符輸出函數;單行顯示時,0 <= X_Intercept <= 79,Y_Interce == 0;雙行顯示時,0 <= X_Intercept <= 39,0 <= Y_Interce <= 1;; 屏幕會顯示X坐標在15之前的字符,其他字符通過光標移動顯示
void LCD1602_Write_Line_Screen(char Line_Data[28],unsigned char Y_Intercept);       //整行輸出函數;需接收16個字符到28個字符,0 <= Y_Interce <= 1;屏幕會顯示前16個字符,其他字符通過光標移動顯示 
void LCD1602_Open_Screen();         //屏幕顯示開啟函數
void LCD1602_Close_Screen();        //屏幕顯示關閉函數
void LCD1602_Move_Left_Screen();   //屏幕左移一位
void LCD1602_Move_Right_Screen();  //屏幕右移一位


/*可調用函數聲明*/


/*void main()       //語法測試用,使用時取消語句注釋
{
    LCD1602_Init(2,1);
    LCD1602_Write_Line_Screen("123456",0);
    LCD1602_Write_Line_Screen("123456",1);
    LCD1602_Move_Screen(1);
    LCD1602_Move_Screen(0);
    LCD1602_Move_Screen(1);
    LCD1602_Move_Screen(1);


    while(1);
}       */


/*可調用函數定義*/


void LCD1602_Init(unsigned char Line_Num,unsigned char Char_Type)
{
    Reset_D0_D7();
    Command_Write(0x06);
    if(Line_Num == 1)
    {
        if(Char_Type == 2)
        {
            Command_Write(0x34);
        }
        else
        {
            Command_Write(0x30);
        }
    }
    else
    {
        if(Char_Type == 2)
        {
            Command_Write(0x3C);
        }
        else
        {
            Command_Write(0x38);
        }
    }
    DelayMS(5);
    LCD1602_Open_Screen();
    DelayMS(5);
    LCD1602_Clear_Screen();
    DelayMS(5);
}


void LCD1602_Clear_Screen()
{
    while(Busy_Check());
    Command_Write(0x01);
}


void LCD1602_Write_Char_Screen(char ASCII_Data,unsigned char X_Intercept,unsigned char Y_Intercept)
{
    while(Busy_Check());
    Addr_Write(Coordinate_To_Addr(X_Intercept,Y_Intercept));
    DelayMS(1);
    Data_Write(ASCII_Data);
}


void LCD1602_Write_Line_Screen(char Line_Data[28],unsigned char Y_Intercept)
{
    char Count;
    while(Busy_Check());
    Addr_Write(Coordinate_To_Addr(0,Y_Intercept));
    for(Count = 0;Line_Data[Count] != '

主站蜘蛛池模板: 阳春市| 华容县| 中江县| 玛曲县| 丹巴县| 香港 | 镇巴县| 精河县| 黑河市| 濮阳县| 蓝田县| 辛集市| 南平市| 剑河县| 枣强县| 巴彦淖尔市| 资源县| 阳东县| 晋江市| 云霄县| 宁城县| 绥中县| 安庆市| 南汇区| 巴里| 株洲县| 卫辉市| 甘德县| 赤壁市| 宾阳县| 瓮安县| 巴青县| 旬阳县| 长汀县| 于都县| 景德镇市| 肇州县| 通州市| 盐山县| 唐山市| 望谟县|