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

📄 ylf240128a-3._c

📁 自己编制的北京友力发公司的液晶显示模块驱动程序
💻 _C
字号:
/*ATMega16 */
/* T6963C LCD Controller */
/*
D0-D7     --  PORTB
C/D       --  PORTA.1
RD        --  PORTA.2
WR        --  PORTA.3
*/
/***********************************************************
内置T6963C液晶控制器驱动程序(间接方式)
***********************************************************/
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int 

//文字地址
#define TXHOME 0x40

//文字区域
#define TXAREA 0x41

//图形地址
#define GRHOME 0x42

//图形区域
#define GRAREA 0x43

//偏移****特别注意
#define OFFSET 0x22

//设置指针
#define ADPSET 0x24

//自动写打开
#define AWRON  0xB0

//自动写关闭
#define AWROFF 0xB2

//偏移地址量
#define OFFSET 0x22

const uchar EXTCG[64]={0x01,0x01,0xff,0x01,0x3f,0x21,0x3f,0x21,//upper left dong 80H
                         0x00,0x00,0xff,0x00,0xfc,0x04,0xfc,0x04,//upper right dong 81H
                         0x21,0x3f,0x05,0x0d,0x19,0x31,0xe1,0x01,//lower left dong 82H
                         0x04,0xfc,0x40,0x60,0x30,0x1c,0x07,0x00,//lower right dong 83
                         0x08,0x08,0xff,0x08,0x09,0x01,0x01,0x7f,//upper left zhi 84H
                         0x10,0x10,0xff,0x10,0x10,0x00,0x00,0xfc,//upper right zhi 85H
                         0x00,0x00,0x00,0x01,0x07,0x3c,0xe7,0x00,//lower left zhi 86H
                         0x18,0x30,0x60,0xc0,0x00,0x00,0xe0,0x3f};//lower right zhi 87H
                         
const uchar TXPRT[13]={0x34,0x00,0x2f,0x00,0x33,0x00,
                       0x28,0x00,0x29,0x00,0x22,0x00,0x21};//TOSHIBA
                       
const uchar EXPRT1[6]={0x80,0x81,0x00,0x00,0x84,0x85};//东芝上半部分
const uchar EXPRT2[6]={0x82,0x83,0x00,0x00,0x86,0x87};//东芝下半部分

//读取LCD状态字
uchar readstate(void)
{
    uchar lcd_state;
    DDRB=0x00;
    DDRA|=(1<<1);
    DDRA|=(1<<2);   // /RD
    PORTA|=(1<<1); // C/D=1
    PORTA&=~(1<<2); // /RD=0
    lcd_state=PINB&0xff; // 读取引脚B物理电平
    NOP();
    NOP();
    PORTA|=(1<<2); // /RD=1
    return lcd_state;
}

//判断指令(数据)读写状态
void st01(void)
{
    while((readstate()&0x03)!=3)
        ;
}

//判断数据自动读状态
void st2(void)
{
    while((readstate()&0x04)!=4)
        ;
}

//判断数据自动写状态
void st3(void)
{
    while((readstate()&0x08)!=8)
        ;
}

//指令写入函数
void writecode(uchar comd0)
{
    st01();
    DDRA|=(1<<1);
    PORTA|=(1<<1); // C/D=0,数据通道
    DDRB=0xff; //B口方向为输出
    PORTB=comd0; //送数据到B口寄存器
    DDRA|=(1<<3);
    PORTA&=~(1<<3); // /WR=0
    NOP();
    PORTA|=(1<<3); // /WR=1
}

//数据写入函数
void writedata(uchar onedata)
{
    st01();
    DDRA|=(1<<1);
    PORTA&=~(1<<1); // C/D=0,数据通道
    DDRB=0xff; //B口方向为输出
    PORTB=onedata; //送数据到B口寄存器
    DDRA|=(1<<3);
    PORTA&=~(1<<3); // /WR=0
    NOP();
    PORTA|=(1<<3); // /WR=1
}

//数据自动写入函数
void writeauto(const uchar onedata)
{
    st3();
    DDRA|=(1<<1);
    PORTA&=~(1<<1); // C/D=0,数据通道
    DDRB=0xff; //B口方向为输出
    PORTB=onedata; //送数据到B口寄存器
    DDRA|=(1<<3);
    PORTA&=~(1<<3); // /WR=0
    NOP();
    PORTA|=(1<<3); // /WR=1
}

//一字节参数指令写入函数
void oneparameter(uchar onep1,uchar comd1)
{
    writedata(onep1);
    writecode(comd1);
}

//两字节参数指令写入函数
void twoparameter(uchar twop1,uchar twop2,uchar comd2)
{
    writedata(twop1);
    writedata(twop2);
    writecode(comd2);
}

/***********************************************************
液晶初始化,清屏
***********************************************************/
//内置T6963C控制器液晶初始化函数
void lcd_init(void)
{
    twoparameter(0x00,0x00,TXHOME); //文本显示区域首地址0x0000
    twoparameter(0x00,0x02,GRHOME); //图形显示区域首地址0x0200

    twoparameter(0x1E,0x00,TXAREA); //文本显示区域宽度30字节
    twoparameter(0x1E,0x00,GRAREA); //图形显示区域宽度30字节
    writecode(0x80); //显示方式设置(使用内部CGROM,OR合成)
    
    twoparameter(0x02,0x00,OFFSET);//偏移地址,1400
    
    writecode(0x94); //显示开关(Text on,graphics off,cursor off)
}

//清除屏幕(清所有8K存储空间)
void lcd_clear(void)
{
    uint cl_count;
    twoparameter(0x00,0x00,ADPSET); //设置显示存储器首地址
    writecode(AWRON); //设置自动写状态
    for(cl_count=960;cl_count>0;cl_count--)
        writeauto(0x00);
    writecode(AWROFF); //关闭自动写状态
}

//16*8点阵显示
//x:0~29; y:0~127
/*
void disp168(uchar x,uchar y)
{
uchar i;
uint address;
address=y*30+x+0x0800; //计算显示存储器地址
for(i=8;i>0;i--)
{
twoparameter((uchar)(address),(uchar)(address>>8),0x24); //设置显示存储器地址
oneparameter(*ptr0++,0xc0); //点阵左部
oneparameter(*ptr0++,0xc0); //点阵右部
address+=30; //修改显示存储器地址
}
}
*/

//连续写点阵
//x:0~29; y:0~127
void dispauto(uchar x,uchar y,uchar line,uchar column)
{
    uchar i,j;
    uint address;
    address=y*30+x+480; //计算显示存储器地址
    for(i=line;i>0;i--) //显示line行
    {
        twoparameter((uchar)(address),(uchar)(address>>8),0x24); //设置显示存储器地址
        writecode(0xb0); //数据自动写状态
        for(j=column;j>0;j--) //共column列
        {
        //writeauto(*ptr0); //自动写入数据
        }
        writecode(0xb2); //关闭自动写状态
        address+=30; //修改显示存储器地址
    }
}

void main()
{
    unsigned char count;
    DDRA|=0xff;
    DDRB|=0xff;
    PORTA|=0xff;
    PORTB|=0xff;
    lcd_init();
    lcd_clear();
    twoparameter(0x00,0x14,ADPSET);
    writecode(AWRON); //数据自动写状态
    for(count=0;count<64;count++)//写入CG
    {
        writeauto(EXTCG[count]);
    }
    writecode(AWROFF);
    
    twoparameter(0x40,0x00,ADPSET);
    writecode(AWRON); //数据自动写状态
    for(count=0;count<13;count++)//写入CG
    {
        writeauto(TXPRT[count]);
    }
    writecode(AWROFF);
    while(1);
}

⌨️ 快捷键说明

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