⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 单片机接LCD的程序
💻 C
字号:
//********************** 使用 Lcd 硬件 工作 通信 ****************
#include "msp430x14x.h"
#include "main.h"
//********************** extern 区****************extern 区****************
//********************** extern 区****************extern 区****************
//from lcdshow.c
extern unsigned char g_chMainLcdProcess_Stat;
//********************** extern 区****************extern 区****************
//********************** extern 区****************extern 区****************
void LcdDrive(void);
    unsigned char g_chLcdDrive_Stat;
    unsigned char g_chLcdDriveBuf[33];
    unsigned char g_chLcdDriveHead;
    unsigned char g_chLcdDriveTail;
    unsigned char g_chLcdDrive_50ms;
void WriteInstruction(unsigned char chData);
void WriteData(unsigned char chData);
void InitLcd(void);
void initBuf(void);
/**************************************
*功能: 初始化 。。。   
*参数:  
*返回: 
*备注: 
**************************************/
void initBuf(void)
{
    unsigned char chI;
    for(chI = 0; chI < 33; chI++)
    {
        g_chLcdDriveBuf[chI] = 0x20;//保证是空格
    }
}
/**************************************
*功能: 处理LCD 显示驱动,负责把缓冲中的信息显示   
*参数:  
*返回: 
*备注: 实时运行
**************************************/
void LcdDrive(void)
{
    //忙吗?
    //读忙状态子程序
    P1OUT &= ~LCDrs;//CLR     RS    指令
    P2OUT |= LCDrw; //SETB    RW
    P3OUT |= LCDenb;//SETB    E
    //245
    P5OUT &= ~LCDcs;//低 选通  该 片
    //读数据
    P4DIR = 0;
    if(P4IN & BIT7)//BIT7=1 忙;=0 不忙
    {//忙
        //忙
        P3OUT &= ~LCDenb;//CLR     E
        //245
        P5OUT |= LCDcs;//高 关闭该片
        return;
    }
    //不忙
    P3OUT &= ~LCDenb;//CLR     E
    //245
    P5OUT |= LCDcs;//高 关闭该片
    
    switch(g_chLcdDrive_Stat)
    {
        case 0://
            if(g_chLcdDriveTail == 32)
            {//启动!
                g_chLcdDrive_Stat = 1;//
            }
        break;
        case 1://定光标位置 在第一行
            //不忙
            WriteInstruction(0x80);
            //定光标位置 在第一行
            g_chLcdDriveHead = 0;
            g_chLcdDrive_Stat = 2;
        break;
        case 2://显示1----16
            //不忙
            if(g_chLcdDriveHead < 16)
            {
                //处理
                g_chLcdDriveHead++;
                //写数据 g_chLcdDriveBuf[g_chLcdDriveHead]
                WriteData(g_chLcdDriveBuf[g_chLcdDriveHead]);
            }
            else
            {
                g_chLcdDrive_Stat = 3;
            }
            //显示1----16
        break;
        case 3://定光标位置 在第二行
            //不忙
            WriteInstruction(0x90);
            //定光标位置 在第二行---没有信息要填空格!以便于驱动层的处理
            g_chLcdDrive_Stat = 4;
        break;
        case 4://显示17----32
            //不忙
            if(g_chLcdDriveHead < 32)
            {
                //处理
                g_chLcdDriveHead++;
                //写数据 g_chLcdDriveBuf[g_chLcdDriveHead]
                WriteData(g_chLcdDriveBuf[g_chLcdDriveHead]);
            }
            else
            {
                g_chLcdDrive_Stat = 5;
            }
            //显示16----31
            
        break;
        case 5://等待
            //根据应用层 定义 等待的时间 1 s   3 s
            if(g_chMainLcdProcess_Stat == 0)
            {
                if(g_chLcdDrive_50ms > 1)
                {//等待 50--100 ms
                    g_chLcdDrive_Stat = 6;
                }
            }
            else if((g_chMainLcdProcess_Stat > 10) && (g_chMainLcdProcess_Stat <= 20))
                {
                    if(g_chLcdDrive_50ms > 1)
                    {//等待 50--100 ms
                        g_chLcdDrive_Stat = 6;
                    }
                }
                else if((g_chMainLcdProcess_Stat > 20) && (g_chMainLcdProcess_Stat < 120))
                    {
                        if(g_chLcdDrive_50ms > 40)
                        {//等待 2s
                            g_chLcdDrive_Stat = 6;
                        }
                    }
                    else
                    {
                        if(g_chLcdDrive_50ms > 80)
                        {//等待 1s
                            g_chLcdDrive_Stat = 6;
                        }
                    }
        break;
        case 6://等待后清理战场
            //根据应用层 定义 等待的时间 1 s   3 s
            g_chLcdDriveTail = 0;
            g_chLcdDriveHead = 0;
            g_chLcdDrive_Stat = 0;
            g_chLcdDrive_50ms = 0;
            initBuf();//全部为空格!
        break;
        default:
            g_chLcdDrive_Stat = 0;
        break;  
    }
}
void InitLcd(void)
{
    //MOV A, #30H           ;30---功能设定--基本指令操作--72 us
    WriteInstruction(0x30);
    initBuf();
    //MOV A, #01H           ;指令#01H为:清除屏幕文字,把地址指针指向00H单元--4.6 ms
    WriteInstruction(0x01);
    //延长时间
    {
        unsigned int i;
        for(i = 0; i < 0xFFF; i++); 
    }
    //MOV A, #06H           ;指定在资料写入或读取时,设定游标的移动方向及指定显示的移位
    WriteInstruction(0x06); //整体显示不移动
    //延长时间
    initBuf();
    //MOV A, #0CH           ;开显示,关游标
    WriteInstruction(0x0C);
    //延长时间
    initBuf();
    //MOV A, #01H           ;DDRAM清零,DDRAM地址计数器到00H
    WriteInstruction(0x01);
    //延长时间
    initBuf();
}
//;--------------------------------------
//;写数据子程序
//;----------------------------
void WriteData(unsigned char chData)
{
    P1OUT |= LCDrs;//SETB   RS --数据
    P2OUT &= ~LCDrw;    //CLR   RW
    P3OUT |= LCDenb;//SETB    E  
    //245
    P5OUT &= ~LCDcs;//低 选通  该 片    
    //写数据
    P4DIR = 0xFF;    
    P4OUT = chData;
    //延长时间
    {
        unsigned int i;
        for(i = 0; i < 0x0F; i++);  
    }
    P3OUT &= ~LCDenb;//CLR     E
    //245
    P4OUT = 0xFF;
    P5OUT |= LCDcs;//高 关闭该片    
}
//;--------------------------------------
//;写指令子程序
//;----------------------------
void WriteInstruction(unsigned char chData)
{
    P1OUT &= ~LCDrs;//CLR     RS    指令
    P2OUT &= ~LCDrw;    //CLR   RW
    P3OUT |= LCDenb;//SETB    E      
    //245
    P5OUT &= ~LCDcs;//低 选通  该 片    
    //写数据
    P4DIR = 0xFF;    
    P4OUT = chData;
    //延长时间
    {
        unsigned int i;
        for(i = 0; i < 0x0F; i++);  
    }
    P3OUT &= ~LCDenb;//CLR     E
    //245
    P4OUT = 0xFF;
    P5OUT |= LCDcs;//高 关闭该片 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -