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

📄 1602_display.c

📁 LCD1602的驱动程序
💻 C
字号:
#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit LCDRS = P3^3;
sbit LCDRW = P3^4;
sbit LCDEN = P3^5;

uchar code NumTable[]="0123456789";

/*
void snop()
{
    ;;
}
*/
void delay(uint time)
{
    uchar i,j;
    for(i=time;i>0;i--)
        for(j=110;j>0;j--);
}

void write_com(uchar com) //写命令
{
    LCDRS = 0;
    LCDRW = 0;
    LCDEN = 0;
    P1 = com;
    LCDEN = 1;
    delay(5);
    LCDEN = 0;
}

void write_data(uchar dat) //写数据
{
    LCDRS = 1;
    LCDRW = 0;
    LCDEN = 0;
    P1 = dat;
    LCDEN = 1;
    delay(5);
    LCDEN = 0;
}

//以下内容未用,进行屏蔽
/*
void read_com() //读状态
{
    LCDRS = 0;
    LCDRW = 1;
    LCDEN = 1;
    snop();
    LCDEN = 0;
}

void read_data() //读数据
{
    LCDRS = 1;
    LCDRW = 1;
    LCDEN = 1;
    snop();
    LCDEN = 0;
}
*/

//以下对读写函数进行测试

void init()
{
    //初始化P2口,准备接收矩阵键盘输入
    P2 = 0xff;

    //初始化LCD
    /*
    delay(15);      //延时15毫秒
    write_com(0x38);//初始化:设置16X2显示,5X7点阵,8位数据接口
    delay(5);       //延时5毫秒
    write_com(0x38);//初始化:设置16X2显示,5X7点阵,8位数据接口
    delay(5);       //延时5毫秒
    write_com(0x38);//初始化:设置16X2显示,5X7点阵,8位数据接口
    delay(5);       //延时5毫秒
    write_com(0x0f);//开显示,开光标,光标闪烁
    delay(5);
    write_com(0x07);//读写后地址指针和光标均加一,整屏显示左移
    delay(5);
    write_com(0x80);//数据指针初始化
    */
    
	write_com(0x38);
	write_com(0x0f);
	write_com(0x06);
	write_com(0x01);
	write_com(0x80);
}

uchar key_scan()
{
    uchar temp,hor,row;
    
    P2 = 0xf0;
    temp = P2;
    temp &= 0xf0;
    if(temp != 0xf0)//扫描到按键动作
    {
        delay(5);
        
        //开始进行列检查
        P2 = 0xf0;
        temp = P2;
        temp &= 0xf0;
        if(temp != 0xf0)//确认有按键动作
        {
            temp = ~temp;
            temp >>= 4; //列值在temp的低四位
            switch(temp)//列值转换,并保存在row中
            {
                case 1 : row = 1; break;
                case 2 : row = 2; break;
                case 4 : row = 3; break;
                case 8 : row = 4; break;
                default: break;
            }
            //列检查结束

            //开始进行行检查
            P2 = 0x0f;
            temp = P2;
            temp = ~temp;
            temp &= 0x0f;//行值在temp的低四位
            switch(temp)//行值转换,并保存在hor中
            {
                case 1 : hor = 1; break;
                case 2 : hor = 2; break;
                case 4 : hor = 3; break;
                case 8 : hor = 4; break;
                default: break;
            }
            //行检查结束

            //检查按键动作是否结束,否则程序在此等待
            P2 = 0xf0;
            temp = P2;
            temp &= 0xf0;
            while(temp != 0xf0)
            {
                P2 = 0xf0;
                temp = P2;
                temp &= 0xf0;
            }
            //按键动作结束,程序往下进行
            
            //计算键值并返回
            return ((hor-1)*4 + row);

        }
    }
    //没有按键动作,返回0;
    return 0;   
}

void main()
{
    uchar key,char_seat,shi,ge;
    init();
    while(1)
    {
        key = key_scan();
        if(key != 0)
        {
            shi = key/10;
            ge = key%10;
            if(char_seat==16) //第一行显示满格,进入第二行显示
            {
                write_com(0x80+0x40);                
            }
            if(char_seat==32) //第二行显示满格,进行清屏,从第一行开始显示
            {
                char_seat=0;
                write_com(0x01);
                write_com(0x80);
            }
            if(shi!=0)
            {
                write_data(NumTable[shi]);
                char_seat++;
            }            
            write_data(NumTable[ge]);
            char_seat++;
            

            
        }
    }
}
//测试结束

⌨️ 快捷键说明

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