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

📄 ylf240128a-final.c

📁 自己编制的北京友力发公司的液晶显示模块驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
0x36,0xC6,
0x66,0x00,
0x66,0xFE,
0x3C,0xC6,
0x1C,0xC6,
0x1E,0xC6,
0x33,0xC6,
0x63,0xFE,
0xC0,0xC6,
0x00,0x00};

const uchar zhong16[]={//终_16
0x18,0xC0,//终
0x18,0xC0,
0x30,0xFE,
0x3D,0x8C,
0x6D,0xCC,
0xFB,0x78,
0x18,0x30,
0x30,0x78,
0x60,0xCC,
0xFF,0xE7,
0x00,0x38,
0x00,0x18,
0x1C,0x60,
0xF0,0x38,
0x00,0x1C,
0x00,0x0C};

const uchar dian16[]={//点_16
0x01,0x80,//点
0x01,0x80,
0x01,0xFC,
0x01,0x80,
0x01,0x98,
0x1F,0xFC,
0x18,0x18,
0x18,0x18,
0x18,0x18,
0x1F,0xF8,
0x18,0x18,
0x01,0x98,
0x3C,0xCC,
0x36,0x66,
0x66,0x66,
0x00,0x00};

const uchar pen16[]={//喷_16
0x00,0x60,//喷
0x00,0x60,
0xFF,0xFE,
0xD9,0xF8,
0xD9,0xF8,
0xDF,0xFF,
0xD9,0x98,
0xDB,0xFC,
0xFB,0x6C,
0xDB,0x6C,
0xC3,0x6C,
0x03,0xFC,
0x00,0xD8,
0x01,0x8E,
0x03,0x07,
0x06,0x06};

const uchar sshe16[]={//射_16
0x0C,0x0C,//射
0x18,0x0C,
0x3F,0x8C,
0x31,0x8C,
0x3F,0xFF,
0x31,0x8C,
0x3F,0x8C,
0x31,0xEC,
0x31,0xBC,
0x7F,0xBC,
0x07,0xBC,
0x0D,0x8C,
0x19,0x8C,
0x31,0x8C,
0x67,0xBC,
0x03,0x18};

const uchar fen16[]={//分_16
0x0C,0xC0,//分
0x0E,0xC0,
0x0C,0x60,
0x18,0x30,
0x18,0x38,
0x30,0x1C,
0x60,0x0F,
0xDF,0xF6,
0x06,0x30,
0x06,0x30,
0x06,0x30,
0x06,0x30,
0x0C,0x30,
0x18,0xF0,
0x30,0x60,
0x60,0x00};

const uchar miao16[]={//秒_16
0x0E,0x30,//秒
0xF8,0x30,
0x18,0x30,
0x19,0xBC,
0xFF,0xF6,
0x19,0xB3,
0x3B,0x33,
0x3F,0x30,
0x7E,0x33,
0x7E,0x33,
0xD8,0x06,
0x18,0x0C,
0x18,0x18,
0x18,0x70,
0x19,0xC0,
0x1F,0x00};

const uchar dao16[]={//倒_16
0x18,0x06,//倒
0x1F,0xE6,
0x1B,0x06,
0x33,0x06,
0x3E,0x1E,
0x7C,0xDE,
0xFF,0xFE,
0x33,0xDE,
0x33,0x1E,
0x3F,0xFE,
0x33,0x1E,
0x33,0x1E,
0x33,0x06,
0x33,0xE6,
0x3F,0x1E,
0x30,0x0C};

const uchar ji16[]={//计_16
0x60,0x30,//计
0x30,0x30,
0x38,0x30,
0x30,0x30,
0x00,0x30,
0xFB,0xFF,
0x18,0x30,
0x18,0x30,
0x18,0x30,
0x18,0x30,
0x18,0x30,
0x1B,0x30,
0x1E,0x30,
0x1C,0x30,
0x18,0x30,
0x00,0x30};

const uchar tshi16[]={//时_16
0x00,0x18,//时
0x00,0x18,
0x7E,0x18,
0x66,0x18,
0x67,0xFF,
0x66,0x18,
0x7E,0x18,
0x67,0x98,
0x66,0xD8,
0x66,0xD8,
0x7E,0x18,
0x00,0x18,
0x00,0x18,
0x00,0x18,
0x00,0x78,
0x00,0x30};

const uchar m16[]={//m_16
0x00,0x00,//m
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0xFF,0x00,
0x6D,0x80,
0x6D,0x80,
0x6D,0x80,
0x6D,0x81,
0x6D,0x81,
0xFF,0x83,
0x00,0x03,
0x00,0x06};

const uchar s16[]={//s_16
0x00,0x00,//s
0x00,0x00,
0x18,0x00,
0x30,0x00,
0x30,0x00,
0x60,0x00,
0x60,0x00,
0xC0,0x3F,
0xC0,0x63,
0x80,0x60,
0x80,0x3E,
0x00,0x03,
0x00,0x63,
0x00,0x7E,
0x00,0x00,
0x00,0x00};


void McuInit()
{//初始化后所有管脚为输出高电平
    PORTA=0xff;
    PORTB=0xff;
    DDRA=0xff;
    DDRB=0xff;
}

uchar ReadState()
{//读取状态字
    uchar state;
    DDRB=0x00;
    CD_SET;
    RD_CLR;
    NOP();NOP();NOP();NOP();NOP();
    state=datain;
    RD_SET;
    DDRB=0xff;
    return state;
}

void STA01()
{//判断状态位是否0,1位为高,并等待置高
    while((ReadState()&0x03)!=0x03)
        ;
}

void STA3()
{//判断状态位是否3位为高,并等待置高
    while((ReadState()&0x08)!=0x08)
        ;
}

void WriteData(uchar dat)
{//把一位数据写入数据总线
    CD_CLR;
    NOP();NOP();NOP();NOP();NOP();
    dataout=dat;
    WR_CLR;
    NOP();NOP();NOP();NOP();NOP();
    WR_SET;
}

void WriteCmd(uchar cmd)
{//把一位命令字写入数据总线
    CD_SET;
    NOP();NOP();NOP();NOP();NOP();
    dataout=cmd;
    WR_CLR;
    NOP();NOP();NOP();NOP();NOP();
    WR_SET;
}

void WriteTwoData(uchar dat1,uchar dat2,uchar cmd)
{//写入有两位数据的命令
    STA01();
    WriteData(dat1);
    STA01();
    WriteData(dat2);
    STA01();
    WriteCmd(cmd);
}

void WriteOneData(uchar dat,uchar cmd)
{//写入有一位数据的命令
    STA01();
    WriteData(dat);
    STA01();
    WriteCmd(cmd);
}

void LcdInit()
{//用于设置显示器的参数
    uchar delay;
    delay=255;
    RS_CLR;
    while(delay--);
    RS_SET;
    
    WriteTwoData(0x00,0x00,0x40);//设置文本显示区域首地址
    WriteTwoData(0x20,0x00,0x41);//设置文本显示区域宽度32
    WriteTwoData(0x00,0x08,0x42);//设置图形显示区域首地址
    WriteTwoData(0x20,0x00,0x43);//设置文本显示区域宽度32

    STA01();
    WriteCmd(0xA7);//光标形状设置
    STA01();
    WriteCmd(0x80);//显示方式设置,逻辑"或"合成
    STA01();
    WriteCmd(0x9C);//显示开关设置,文本、图形显示启用
    
    WriteTwoData(0x03,0x00,0x22);//设置CGRAM OFFSET地址 0000 0011
}

void ClearLcd()
{//用于清空显示器
    uint count=512;
    WriteTwoData(0x00,0x00,0x24);//设置显示RAM指针
    WriteCmd(0xB0);//自动写方式
    while(count--)
    {
        STA3();
        WriteData(0x00);
    }
    WriteCmd(0xB2);//结束自动写指令
    
    count=4096;
    WriteTwoData(0x00,0x08,0x24);//设置显示RAM首地址
    WriteCmd(0xB0);//自动写方式
    while(count--)
    {
        STA3();
        WriteData(0x00);
    }
    WriteCmd(0xB2);//结束自动写指令
}

//通过CGRAM写入用户个人的字符库
//16*16显示
//num表示写入库的字符的个数
//写入的数据放在CGTAB[]数组里
//CGTAB格式
//左半部分--右半部分
//其中code为从零开始的地址,text为字符数组
void CGRamGen(const uchar text[])
{//自动写入CGRAM,共128字符,num表示字符个数
    uint num=0;
    uint round;
    WriteTwoData(0x00,0x1c,0x24);//设置地址指针 (0001 1)(100 0000 0)000
    WriteCmd(0xB0);//自动写方式
    for(round=0;round<10;round++)
    {
        num=16;
        while(num)
        {
            STA3();
            WriteData(text[32-num*2+round*32]);   
            num--;     
        }
        num=16;
        while(num)
        {
            STA3();
            WriteData(text[33-num*2+round*32]);
            num--;
        }        
    }    
    WriteCmd(0xB2);//结束自动写
}

void CGRamGenTry(const uchar text[])
{//自动写入CGRAM,共128字符,num表示字符个数
    uint num=0;
    WriteTwoData(0x00,0x1c,0x24);//设置地址指针 (0001 1)(100 0000 0)000
    WriteCmd(0xB0);//自动写方式
    num=320;
    while(num)
    {
        STA3();
        WriteData(text[320-num]);
        num--;
    }
    WriteCmd(0xB2);//结束自动写
}

//通过CGRAM写入字符图层,位置为8*8字符行和列
void DispChinaCode(uchar o_x,uchar o_y,uchar code)
{//设置在x,y位置显示code代码的字符
    uint temp;
    temp=32*o_y;
    temp=temp+o_x;//得到位置存储器
    temp=temp+0x00;//加上字符区启始位置
    WriteTwoData((uchar)temp,(uchar)(temp>>8),0x24);//设置地址指针
    WriteOneData(code,0xc0);//数据写,地址加1
    WriteOneData(code+2,0xc0);//数据写,地址加1
    temp+=32;
    WriteTwoData((uchar)temp,(uchar)(temp>>8),0x24);//设置地址指针
    WriteOneData(code+1,0xc0);//数据写,地址加1
    WriteOneData(code+3,0xc0);//数据写,地址加1    
}

//通过点阵图层写入字符,字符大小为32*32
//写入速度较慢
//位置为x*32,y*32,显示数据为disp[]
void DispChinaPic16(uchar o_x,uchar o_y,const uchar disp[])
{
    uint temp;
    uchar num;
    temp=32*8*o_y;
    temp=temp+o_x;
    temp=temp+0x800;//加上图形区启始位置
    num=16;
    while(num)
    {
        WriteTwoData((uchar)temp,(uchar)(temp>>8),0x24);//设置地址指针
        temp=temp+32;//  换行
        WriteOneData(disp[32-num*2],0xc0);//数据写,地址加1
        WriteOneData(disp[33-num*2],0xc0);//数据写,地址加1
        num--;
    }    
}


void DispChinaPic24(uchar o_x,uchar o_y,const uchar disp[])
{
    uint temp;
    uchar num;
    temp=32*8*o_y;
    temp=temp+o_x;
    temp=temp+0x800;//加上图形区启始位置
    num=24;
    while(num)
    {
        WriteTwoData((uchar)temp,(uchar)(temp>>8),0x24);//设置地址指针
        temp=temp+32;//  换行
        WriteOneData(disp[72-num*3],0xc0);//数据写,地址加1
        WriteOneData(disp[73-num*3],0xc0);//数据写,地址加1
        WriteOneData(disp[74-num*3],0xc0);//数据写,地址加1
        num--;
    }
}

void main()
{
    McuInit();
    LcdInit();
    ClearLcd();
/*    CGRamGen(0,CGTAB);
    CGRamGen(0x80,yi16_1);
    CGRamGen(0x84,er16_2);
    CGRamGen(0x88,san16_3);
    CGRamGen(0x8c,si16_4);
    CGRamGen(0x90,wu16_5);
    CGRamGen(0x94,liu16_6);
    CGRamGen(0x98,qi16_7);
    CGRamGen(0x9c,ba16_8);
    CGRamGen(0xa0,jiu16_9);
    CGRamGen(0xa4,ling16_0);*/

    CGRamGen(number);
//    CGRamGenTry(numbertry);


//    CGRamGen(0x80,ling16_0);


    DispChinaCode(24,0,0x80);
    DispChinaCode(26,0,0x84);
    DispChinaCode(28,0,0x88);
    DispChinaCode(24,2,0x8c);
    DispChinaCode(26,2,0x90);
    DispChinaCode(28,2,0x94);
    DispChinaCode(24,4,0x98);
    
 /*   DispChinaPic24(0,0,yang24);
    DispChinaPic24(3,0,jian24);
    DispChinaPic24(6,0,hao24);
   DispChinaPic24(0,3,ci24);//次
    DispChinaPic24(3,3,shu24);//数
    DispChinaPic24(0,6,su24);//速
    DispChinaPic24(3,6,du24);//度
    DispChinaPic24(0,9,xing24);//行
    DispChinaPic24(3,9,cheng24);//程
    DispChinaPic24(0,12,ding24);//定
    DispChinaPic24(3,12,dian24);//点
    DispChinaPic24(6,12,pen24);//喷
    DispChinaPic24(9,12,sshe24);//射
*/
     DispChinaPic16(0,0,yang16);//样
    DispChinaPic16(2,0,jian16);//件
    DispChinaPic16(4,0,hao16);//号
   DispChinaPic16(0,3,ci16);//次
    DispChinaPic16(2,3,shu16);//数
    DispChinaPic16(0,6,su16);//速
    DispChinaPic16(2,6,du16);//度
    DispChinaPic16(0,9,xing16);//行
    DispChinaPic16(2,9,cheng16);//程
    DispChinaPic16(0,12,ding16);//定
    DispChinaPic16(2,12,dian16);//点
    DispChinaPic16(4,12,pen16);//喷
    DispChinaPic16(6,12,sshe16);//射
    
/*     DispChinaPic16(13,0,ba16_8);//
    DispChinaPic16(15,0,ba16_8);//
    DispChinaPic16(17,0,ba16_8);//
   DispChinaPic16(13,3,ba16_8);//
    DispChinaPic16(15,3,ba16_8);//
    DispChinaPic16(17,3,ba16_8);//
    DispChinaPic16(13,6,ba16_8);//
    DispChinaPic16(15,6,ba16_8);//
    DispChinaPic16(17,6,ba16_8);//
    DispChinaPic16(8,9,ba16_8);//
    DispChinaPic16(10,9,ba16_8);//
    DispChinaPic16(12,9,ba16_8);//
    DispChinaPic16(13,9,ba16_8);//
    DispChinaPic16(15,9,ba16_8);//
    DispChinaPic16(17,9,ba16_8);//
    DispChinaPic16(10,12,ba16_8);//
    DispChinaPic16(12,12,ba16_8);//
    DispChinaPic16(15,12,ba16_8);//
    DispChinaPic16(17,12,ba16_8);//
    */
    while(1);
}

⌨️ 快捷键说明

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