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

📄 tg12864.c

📁 4位并口的12864液晶驱动程序
💻 C
字号:
/******TG12864E-02液晶模块C语言程序*******/
#define TG12864_C
#include "includes.h"
/*
#pragma data:code
const uchar str[]={0xCE,0xD2,0xC3,0xC7,0xB6,0xBC,0};//最后一个元素必须是0
const uchar graph[][16]={
{0x00,0x00,0x00,0x00,0x00,0x06,0x30,0x00,0x03,0x83,0xFE,0x00,0x00,0x7E,0x8F,0x00},
{0x00,0x3C,0x05,0xC0,0x00,0x66,0x00,0x40,0x00,0xC0,0x00,0x60,0x01,0x00,0x00,0x30},
{0x03,0x00,0x00,0x18,0x06,0x00,0x00,0x08,0x0C,0x00,0x00,0x08,0x08,0x01,0xE0,0x0C},
{0x09,0xC1,0x31,0xE4,0x0E,0x00,0x00,0x24,0x0B,0x80,0xE0,0x24,0x08,0x18,0x00,0x24},
{0x08,0x10,0x01,0xE4,0x08,0x30,0x00,0xC4,0x08,0x3C,0x00,0x04,0x04,0x00,0x00,0x04},
{0x04,0x00,0xC0,0x0C,0x06,0x01,0x80,0x08,0x03,0x82,0x00,0x18,0x00,0xE0,0x00,0x70},
{0x00,0x30,0x00,0xC0,0x00,0x18,0x03,0x80,0x00,0x0C,0x06,0x00,0x00,0x06,0x04,0x00},
{0x00,0x03,0x9C,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}};
*/
//IO口初始化
void init_LCD_port(void)
{
    LCD_PORT &= 0x0f;
    LCD_DDR |= 0xf0;
    LCD_CON_PORT &= ~(1<<LCD_RS)|(1<<LCD_RW)|(1<<LCD_EN);
    LCD_CON_DDR |= (1<<LCD_RS)|(1<<LCD_RW)|(1<<LCD_EN);
}

//查忙子程序
void Chk_Busy(void)
{
    uchar temp;
    CBIT(LCD_DDR,BIT(7));
    lcd_clear_rs();
    lcd_set_rw();
	do
	{
    lcd_set_en();
    LCD_DEL
    LCD_DEL
    temp = LCD_PIN;
    lcd_clear_en();
    LCD_DEL
    LCD_DEL
    lcd_set_en();
    LCD_DEL
    LCD_DEL
    lcd_clear_en();
    }while(temp&0x80);
    SBIT(LCD_DDR,BIT(7));
}

//读AC地址
uchar Read_addr(void)
{
    uchar addr,temp;
    LCD_DDR &= 0x0f;
    lcd_clear_rs();
    lcd_set_rw();
    lcd_set_en();
    LCD_DEL
    addr = LCD_PIN|0x80;
    lcd_clear_en();
    addr &= 0xf0; 
    lcd_set_en();
    LCD_DEL
    temp = LCD_PIN;
    lcd_clear_en(); 
    LCD_DDR |= 0xf0;
    temp >>= 4;
    addr |= (temp&0x0f);
    return addr;
}

//写指令
void Sent_Inst(uchar data)
{
    Chk_Busy();
    lcd_clear_rs();
    lcd_clear_rw();
	LCD_PORT &= 0x0f;
    LCD_PORT |= (data & 0xf0);
    LCD_DEL
    lcd_set_en();
    LCD_DEL
    LCD_DEL
    lcd_clear_en();
    delay_nus(10);
    data <<= 4;
	LCD_PORT &= 0x0f;
    LCD_PORT |= (data & 0xf0);
    lcd_set_en();
    LCD_DEL
    LCD_DEL
    lcd_clear_en();
}

//写数据
void Sent_Data(uchar data)
{
    Chk_Busy();
    lcd_set_rs();
    lcd_clear_rw();
	LCD_PORT &= 0x0f;
    LCD_PORT |= (data & 0xf0);
    lcd_set_en();
    LCD_DEL
    LCD_DEL
    lcd_clear_en();
    delay_nus(10);		
    data <<= 4;
	LCD_PORT &= 0x0f;
    LCD_PORT |= (data & 0xf0);
    lcd_set_en();
    LCD_DEL
    LCD_DEL
    lcd_clear_en();
}
/*
//读数据
uchar Read_Data(void)
{
    uchar data,temp;
    LCD_DDR &= 0x0f;
    Chk_Busy();
    lcd_set_rs();
    lcd_set_rw();
    lcd_set_en();
    LCD_DEL
    data = LCD_PIN;
    lcd_clear_en();
    data &= 0xf0; 
    lcd_set_en();
    LCD_DEL
    temp = LCD_PIN;
    lcd_clear_en();
    LCD_DDR |= 0xf0;
    temp >>= 4;
    data |= (temp&0x0f);
    return data;
}*/

//液晶初始化
void lcd_init(void)
{
    init_LCD_port();
    delay_nms(40);
    //Sent_Inst(0x20);        //function set
    lcd_clear_rs();
    lcd_clear_rw();
    LCD_PORT &= 0x0F;
    LCD_PORT |= 0x20;
    LCD_DEL
    lcd_set_en();
    LCD_DEL
    LCD_DEL
    lcd_clear_en();
    delay_nus(10);
    delay_nus(100);
    Sent_Inst(0x20);        //function set
    delay_nus(100);
    Sent_Inst(0x0c);        //开显示,关光标,不闪烁
    delay_nus(100);
    Sent_Inst(0x01);        //清除显示
    delay_nms(10);
    Sent_Inst(0x06);        //指定在资料写入或读取时,光标的移动方向    		
}

//设定字符和汉字坐标。水平方向x:0~7,垂直方向y:0~3
void ZuoBiao(uchar x,uchar y)
{
    Sent_Inst((x%2)*0x10+(x/2)*0x08+y+0x80);
}

//显示字符或汉字字符串
void String(const uchar *data)
{
    uchar addr;
    while(*data!=0x00)
    {
        addr=Read_addr();
        Sent_Data(*(data++));
        if(*data==0x00)
            break;
        Sent_Data(*(data++));
        if(addr==0x87)
            Sent_Inst(0x90);
        if(addr==0x97)
            Sent_Inst(0x88);
        if(addr==0x8f)
            Sent_Inst(0x98);
        if(addr==0x9f)
            break;
    }
}

//画一副图画(当要重新写文字时,需要清屏)
void Graph_Disp(const uchar graph[][16],uchar x,uchar y,uchar l,uchar h)
//水平坐标x:0~7;垂直坐标y:0~63;图片长度l:0~15;图片高度h:0~63
{
    uchar i,j;
    Sent_Inst(0x24);    //扩充指令操作
    Sent_Inst(0x26);    //绘图显示开
    for(i=0;i<=31;i++)          //上半屏清屏
    {
        Sent_Inst(i+0x80);      //垂直坐标:0~31
        Sent_Inst(0x80);        //水平坐标:0x80~0x87    
        for(j=0;j<=15;j++)
            Sent_Data(0);
        
    }
    for(i=0;i<=31;i++)          //下半屏清屏
    {
        Sent_Inst(i+0x80);      //垂直坐标:0~31
        Sent_Inst(0x88);        //水平坐标:0x88~0x8f    	
        for(j=0;j<=15;j++)
            Sent_Data(0);
    }
    for(i=0;i<=h;i++)
    {
        if((y+i+0x80)<0xa0)
        {
            Sent_Inst(y+i+0x80);    //垂直坐标
            Sent_Inst(x+0x80);      //水平坐标
        }
        else
        {
            Sent_Inst(y+i+0x60);    //垂直坐标
            Sent_Inst(x+0x88);      //水平坐标
        }
        for(j=0;j<=l;j++)
            Sent_Data(graph[(i*(l+1)+j)/0x10][(i*(l+1)+j)%0x10]);
    }
    Sent_Inst(0x20);    //基本指令操作
}
/*
void main(void)
{
    uchar i;
    init_port();
    lcd_init();
//  ZuoBiao(2,5);
//  String(str);
//  Graph_Disp(graph,3,20,3,31);
//  Sent_Data(0xb1);
//  Sent_Inst(0x68);
//  Sent_Data(0x41);
//  Sent_Inst(0x71);
//  Sent_Data(0x61);
    for(i=0;i<=15;i++)  //CGRAM造字
    {
    Sent_Inst(0x40+i);
    Sent_Data(0x00);
    Sent_Data(0xff);
    }
    for(i=0;i<=15;i++)
    {
    Sent_Inst(0x50+i);  
    Sent_Data(0x00);
    Sent_Data(0xff);
    }
    Sent_Inst(0x01);
    Sent_Data(0x00);
    Sent_Data(0x03);    
    while(1){}
}*/

⌨️ 快捷键说明

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