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

📄 display.c

📁 是51单片机的12864显示程序
💻 C
字号:
// 1、显示开/关设置 CODE:R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 
//                         L   L   L   L   H   H   H   H   H   H/L		!!!!!3e/3f!!!!
// 								 
//功能:设置屏幕显示开/关。DB0=H,开显示;DB0=L,关显示。不影响显示RAM(DD RAM)中的内容。 
//CALL OUTI  ;输出指令  OUT1 OUT2 
//CALL SDELAY
//MOV A,#00111111B
//2、设置显示起始行 CODE:R/W D/I DB7  DB6  DB5  DB4  DB3  DB2 DB1 DB0 	!!!!!c0-ff!!!!
//                        L    L   H  H     行地址(0~63)  
//功能:执行该命令后,所设置的行将显示在屏幕的第一行。
//显示起始行是由Z地址计数器控制的,该命令自动将A0-A5位地址送入Z地址计数器,起始地址可以是0-63范围内任意一行。
//Z地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后自动加一.
//MOV A,#11000000B
//3、设置页地址 CODE:R/W D/I  DB7  DB6  DB5  DB4  DB3  DB2 DB1  DB0 
//                    L      L   H    L    H   H   H  页地址(0~7)  	!!!!!b8-bf!!!
//功能:执行本指令后,下面的读写操作将在指定页内,直到重新设置。
//页地址就是DD RAM 的行地址,页地址存储在X地址计数器中,A2-A0可表示8页,读写数据对页地址没有影响.
//除本指令可改变页地址外,复位信号(RST)可把页地址计数器内容清零
//DD RAM地址映像表 
///Y 地址 0  1  2  ………  61  62  63     
//DB0 ∫                         PAGE0 DB7         X=0  
//DB0 ∫                         PAGE1 DB7         X=1  
//∷     
//DB0 ∫                         PAGE6 DB7         X=7  
//DB0 ∫                         PAGE7 DB7         X=8                    			
//4、设置列地址 CODE:R/W D/I  DB7  DB6  DB5  DB4   DB3  DB2  DB1  DB0  !!!!40-7f!!!!
//                    L    L    L   H    列地址(0~63)  
//功能: DD RAM 的列地址存储在Y地址计数器中,读写数据对列地址有影响,在对DD RAM进行读写操作后,Y地址自动加一。 
//5、状态检测 CODE: R/W D/I DB7 DB6  DB5  DB4  DB3  DB2  DB1  DB0 		   !!!!30-b0!!!
//                    H   L   BF  L  ON/OFF RST  L   L   L      L  
//功能:读忙信号标志位(BF)、复位标志位(RST)以及显示状态位(ON/OFF)。
// BF=H:内部正在执行操作; BF=L:空闲状态。RST=H:正处于复位初始化状态;RST=L:正常状态。            
//ON/OFF=H:表示显示关闭;ON/OFF=L:表示显示开。   
//6、写显示数据 CODE:R/W D/I  DB7  DB6  DB5  DB4 DB3  DB2  DB1 DB0
//                     L   H     D7   D6   D5   D4  D3  D2   D1   D0  	!!!!00-ff!!!
//功能:写数据到DD RAM,DD RAM是存储图形显示数据的,写指令执行后Y地址计数器自动加1。
//D7-D0位数据为1表示显示,数据为0表示不显示。写数据到DD RAM前,要先执行“设置页地址”及“设置列地址”命令。
//7、读显示数据 CODE:RS  R/W  DB7  DB6  DB5   DB4   DB3  DB2  DB1  DB0 
//                    H    H   D7    D6   D5    D4    D3   D2   D1    D0  1!!00-ff!!!
//功能:从DD RAM读数据,读指令执行后Y地址计数器自动加1。从DD RAM读数据前要先执行“设置页地址” 及“设置列地址”命令


#include <avr/io.h>
#include <stdint.h>
#include <avr/delay.h>
#include "header.h"
#define outdata PORTA
#define CS1 PD7
#define CS2 PD6
#define D_I PD4
#define W_R PD1
#define E   PD0
void shortdelay()
{	 
    asm("nop");
    asm("nop");
    asm("nop");
}
void lcdwdata1(unsigned char i)
{
    PORTD|=_BV(CS1);//CS1=1;
    PORTD|=_BV(E);//E=1;
    PORTD&=~_BV(W_R);//W_R=0;
    PORTD|=_BV(D_I);//D_I=1;
    outdata=i;
    PORTD&=~_BV(E);//E=0;
    PORTD&=~_BV(CS1);//CS1=0;
    shortdelay();
}
void lcdwdata2(unsigned char i)
{
    PORTD|=_BV(CS2);//CS2=1;
    PORTD|=_BV(E);//E=1;
    PORTD&=~_BV(W_R);//W_R=0;
    PORTD|=_BV(D_I);//D_I=1;
    outdata=i;
    PORTD&=~_BV(E);//E=0;
    PORTD&=~_BV(CS2);//CS2=0;
    shortdelay();
}
/*unsigned char lcdrdata1()
{
    unsigned char pindata;
    CS1=1;
    E=1;
    W_R=1;
    D_I=1;
    pindata=outdata;
    E=0;
    CS1=0;
    shortdelay();
    return pindata;
}
*/
/*unsigned char lcdrdata2()
{
    unsigned char pindata;
    CS2=1;
    E=1;
    W_R=1;
    D_I=1;
    pindata=outdata;
    E=0;
    CS2=0;
    shortdelay();
    return pindata;
}
*/
void lcdwinst1(unsigned char i)
{
    PORTD|=_BV(CS1);//CS1=1;
    PORTD|=_BV(E);//E=1;
    PORTD&=~_BV(W_R);//W_R=0;
    PORTD&=~_BV(D_I);//D_I=0;
    outdata=i;
    PORTD&=~_BV(E);//E=0;
    PORTD&=~_BV(CS1);//CS1=0;
    shortdelay();
}
void lcdwinst2(unsigned char i)
{
    PORTD|=_BV(CS2);//CS2=1;
    PORTD|=_BV(E);//E=1;
    PORTD&=~_BV(W_R);//W_R=0;
    PORTD&=~_BV(D_I);//D_I=0;
    outdata=i;
    PORTD&=~_BV(E);//E=0;
    PORTD&=~_BV(CS2);//CS2=0;
    shortdelay();
}
void lcdreset()
{
    DDRA=0;//数据口设置为输入
    DDRD=_BV(D_I)|_BV(W_R)|_BV(E)|_BV(CS1)|_BV(CS2);//控制口设置为输出
    
    lcdwinst1(0x3e);
    shortdelay();
    lcdwinst2(0x3e);
    shortdelay();
    lcdwinst1(0x3f);
    shortdelay();
    lcdwinst2(0x3f);
    shortdelay();
    lcdwinst1(0xc0);
    shortdelay();
    lcdwinst2(0xc0);
    shortdelay();
}
void lcddisplay(unsigned char table[])
{
    unsigned char pagenum,i,j;
    pagenum=0xb8;
    for(i=0;i<8;i++)
    {
        lcdwinst1(pagenum+i);
        lcdwinst2(pagenum+i);
        lcdwinst1(0x40);
        for(j=0;j<64;j++)
        {
            
            lcdwdata1(*(table++));
        }
        lcdwinst2(0x40);
        for(j=0;j<64;j++)
        {
            
            lcdwdata2(*(table++));
        }
    }
}
void converse(unsigned char page,unsigned char table[])
{
    unsigned char pagenum,j;
    pagenum=0xb8+page*2;//page0-3
    lcdwinst1(pagenum);
    lcdwinst2(pagenum);
    lcdwinst1(0x40);
    for(j=0;j<64;j++)
    {
        lcdwdata1(~table[256*page+j]);
    }
    lcdwinst2(0x40);
    for(j=0;j<64;j++)
    {
        lcdwdata2(~table[256*page+j+64]);
    }
    lcdwinst1(pagenum+1);
    lcdwinst2(pagenum+1);
    lcdwinst1(0x40);
    for(j=0;j<64;j++)
    {
        lcdwdata1(~table[256*page+j+128]);
    }
    lcdwinst2(0x40);
    for(j=0;j<64;j++)
    {
        lcdwdata2(~table[256*page+j+64+128]);
    }
}

⌨️ 快捷键说明

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