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

📄 123.c

📁 12864液晶程序
💻 C
📖 第 1 页 / 共 2 页
字号:
其中,部分注释是本人注的,大家讨论一下这个程序吧。 




/* 
KS0108 128*64 LCD C语言驱动 
参考ICCAVR资料和网上的资料改写  
LCD引脚定义 
1---GND  
2---VCC 
3---VLCD 
4---D/I 
5---R/W 
6---E 
7到14 D0-D7 
15--CS1 
16--CS2 
17--RESET 
18--VEE 
19--SW 
20--NC  
*/ 
#include <iom16v.h> 
#include <macros.h> 

/* 当前行、列存储,行高16点,列宽8点 */ 
unsigned char CurOffset,CurRow,CurPage,CurCol;         

/*  常量定义  */ 
#define LCD_STATUS_BUSY 0x80 
#define  START_LINE0   0xc0 
#define  DISPLAY_ON    0x3f 
#define  DISPLAY_OFF   0x3e 
#define  PARA1         0x40 
//PORTA---数据口  PORTB----控制口 
#define LCD_DIR_PORT        DDRA 
#define LCD_IP_PORT                PINA 
#define LCD_OP_PORT                PORTA 

#define LCD_EN_PORT                PORTC 
#define LCD_CS2_PORT        PORTC 
#define LCD_CS1_PORT        PORTC 
#define LCD_RW_PORT                PORTC 
#define LCD_DI_PORT                PORTC 

#define LCD_DI_BIT                BIT(7)//0x80 
#define LCD_RW_BIT                BIT(6)//0x40 
#define LCD_EN_BIT                BIT(5)//0x20 
#define LCD_CS1_BIT                BIT(4)//0x10 
#define LCD_CS2_BIT                BIT(3)//0x08 

#define SET_LCD_E                LCD_EN_PORT |= LCD_EN_BIT    //LCD使能 
#define CLEAR_LCD_E                LCD_EN_PORT &= ~LCD_EN_BIT   //LCD禁止 

//以下可能出错,数据指令接口 

#define SET_LCD_DATA        LCD_DI_PORT |= LCD_DI_BIT    //选择数据端口 
#define SET_LCD_CMD                LCD_DI_PORT &= ~LCD_DI_BIT   //选择指令端口 

#define SET_LCD_READ        LCD_RW_PORT |= LCD_RW_BIT    //读模式 
#define SET_LCD_WRITE        LCD_RW_PORT &= ~LCD_RW_BIT   //写模式 

#define SET_LCD_CS2     LCD_CS2_PORT |= LCD_CS2_BIT  //右屏选择禁止 
#define CLEAR_LCD_CS2   LCD_CS2_PORT &= ~LCD_CS2_BIT //右屏选择使能 

#define SET_LCD_CS1     LCD_CS1_PORT |= LCD_CS1_BIT  //左屏选择禁止 
#define CLEAR_LCD_CS1   LCD_CS1_PORT &= ~LCD_CS1_BIT //左屏选择使能 

#define LEFT 0 
#define RIGHT 1 
#define CMD 0 
#define DATA 1 

void LCD_BUSY(unsigned char lr) //判断忙标志。。 
{ 
        unsigned char status; 
    CLI(); 
        if(lr==LEFT) 
        { 
        //选择左半屏。。 
            CLEAR_LCD_CS2; //cs2=0 
                SET_LCD_CS1;   //cs1=1 
        } 
        else 
        { 
        //选择右半屏。。 
                SET_LCD_CS2;   //cs2=1 
            CLEAR_LCD_CS1; //cs1=0 
        }         
        SET_LCD_CMD;//选择指令端口。。 
    LCD_DIR_PORT = 0x00;//数据口方向设置。。 
    LCD_OP_PORT = 0xff;//数据口输出高电平。。                 
    SET_LCD_READ;//读模式。。 
    SET_LCD_E;//LCD使能。。                                         
    asm("nop");        asm("nop"); 
    asm("nop");        asm("nop"); 
    while((LCD_IP_PORT) & LCD_STATUS_BUSY)//判断LCD是否忙。。 
    { 
        CLEAR_LCD_E;//LCD禁止。。                                    
                asm("nop");        asm("nop"); 
                asm("nop");        asm("nop"); 
                SET_LCD_E;//LCD使能。。         
                asm("nop");        asm("nop"); 
                asm("nop");        asm("nop"); 
    } 
    CLEAR_LCD_E; 
    SET_LCD_WRITE;//写模式。。 
    LCD_OP_PORT = 0xff;//写入显示RAM 
    SEI(); 
} 

void write_LCD(unsigned char lr,unsigned char cd,unsigned char data) /*写入指令或数据*/ 
{         
    CLI(); 
        LCD_BUSY(lr); 
        if(cd==CMD)        SET_LCD_CMD; 
        else SET_LCD_DATA; 
    SET_LCD_WRITE;  
        SET_LCD_E; 
    LCD_DIR_PORT = 0xff; 
    LCD_OP_PORT = data; 
    asm("nop");        asm("nop"); 
        asm("nop");        asm("nop"); 
    CLEAR_LCD_E; 
    LCD_OP_PORT = 0xff; 
    SEI(); 
} 
unsigned char read_LCD(unsigned char lr)          /*  读显示数据 */ 
{ 
        unsigned char data; 

    CLI(); 
        LCD_BUSY(lr); 
        SET_LCD_DATA; 
    LCD_DIR_PORT = 0x00; 
    LCD_OP_PORT = 0xff; 
    SET_LCD_READ; 
        SET_LCD_E; 
        asm("nop");        asm("nop"); 
    asm("nop");        asm("nop"); 
    data=LCD_IP_PORT; 
    CLEAR_LCD_E; 
    SET_LCD_WRITE; 

        LCD_BUSY(lr); 
        SET_LCD_DATA;  
    LCD_DIR_PORT = 0x00; 
    LCD_OP_PORT = 0xff; 
    SET_LCD_READ;  
        SET_LCD_E; 
    asm("nop");        asm("nop"); 
        asm("nop");        asm("nop"); 
    data=LCD_IP_PORT; 
    CLEAR_LCD_E; 
    SET_LCD_WRITE; 

    SEI(); 
        return data; 
} 

void set_start_line_L(unsigned char line) /*设置显示起始行*/ //0-63 
{ 
        write_LCD(LEFT,CMD,0xc0|line);  
} 

void set_start_line_R(unsigned char line) /*设置显示起始行*/ //0-63 
{ 
        write_LCD(RIGHT,CMD,0xc0|line);  
} 

void set_page_L(unsigned char page)        /*设置X地址 设置页*/  //0-7 
{ 
        write_LCD(LEFT,CMD,0xb8|page);                      
} 
void set_page_R(unsigned char page)        /*设置X地址 设置页*/ //0-7 
{ 
        write_LCD(RIGHT,CMD,0xb8|page);                      
} 

void set_col_addr_L(unsigned char col) /*设置Y地址*/ //0-63 
{ 
        write_LCD(LEFT,CMD,0x40|col);                      
} 

void set_col_addr_R(unsigned char col) /*设置Y地址*/ //0-63 
{ 
        write_LCD(RIGHT,CMD,0x40|col);                      
} 

void init_lcd(void) /*初始化函数*/ 
{ 
        set_start_line_L(0); /*显示起始行为0*/ 
        set_start_line_R(0); /*显示起始行为0*/ 
        write_LCD(LEFT,CMD,DISPLAY_ON); /*  开显示  */ 
        write_LCD(RIGHT,CMD,DISPLAY_ON); /*  开显示  */ 
} 

void clr_lcd(void) /*清屏函数*/ 
{ 
        unsigned char pages,i; 
        for(pages=0;pages<8;pages++) 
                { 
                        set_page_L(pages);  /* X 页地址 */ 
                        set_page_R(pages);  /* X 页地址 */ 
                        for(i=0;i<64;i++)    
                                { 
                                        set_col_addr_L(i);//Y 
                                        set_col_addr_R(i);//Y 
                                        write_LCD(LEFT,DATA,0x0); 
                                        write_LCD(RIGHT,DATA,0x0); 
                                } 
                } 
} 

/*************************************/ 
/*             绘点函数              */ 
/*************************************/ 

void pixel(unsigned char xx,unsigned char yy,unsigned char flag) 
{ 
        unsigned int y,ch; 
        ch=yy%8;  //余数 

        y=1; 
        for(;ch!=0;) 
                { 
                        y=y*2; 
                        ch--; 
                } 
        if(xx<64) 
                { 
                        set_page_L(yy/8); 
                        set_col_addr_L(xx);         
                        ch=read_LCD(LEFT); 
                        set_col_addr_L(xx); 
                        if(flag) 
                                write_LCD(LEFT,DATA,ch|y); 
                        else 
                        { 
                                y=~y; 
                                ch&=y; 
                                write_LCD(LEFT,DATA,ch|y); 
                        } 
                } 
        else 
                { 
                        set_page_R(yy/8); 
                        set_col_addr_R(xx-64);         
                        ch=read_LCD(RIGHT); 
                        set_col_addr_R(xx-64);         
                        if(flag) 
                                write_LCD(RIGHT,DATA,ch|y); 
                        else 
                        { 
                                y=~y; 
                                ch&=y; 
                                write_LCD(RIGHT,DATA,ch|y); 
                        } 
                } 
} 

//ASCII 字模宽度及高度 
#define ASC_CHR_WIDTH        8 
#define ASC_CHR_HEIGHT        12 

typedef struct typFNT_ASC16        /* 汉字字模显示数据结构 */ 
{ 
        char Index[1]; 
        char Msk[16]; 
}; 
struct typFNT_ASC16 const ASC_16[] = {        /* 显示为8*16  Curier 10 常规*/ 
"1",0x00,0x00,0x08,0x08,0xFC,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x07,0x04,0x04,0x00, 
"2",0x00,0x00,0x08,0x04,0x84,0x44,0x38,0x00,0x00,0x00,0x06,0x05,0x04,0x04,0x04,0x00, 
"3",0x00,0x00,0x08,0x04,0x44,0x44,0xB8,0x00,0x00,0x00,0x02,0x04,0x04,0x04,0x03,0x00, 
"4",0x00,0x00,0x80,0x60,0x18,0xFC,0x00,0x00,0x00,0x00,0x01,0x01,0x05,0x07,0x05,0x00, 
"5",0x00,0x00,0x7C,0x44,0x44,0x44,0x84,0x00,0x00,0x00,0x02,0x04,0x04,0x04,0x03,0x00, 
"6",0x00,0x00,0xF0,0x48,0x44,0x44,0x80,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x00, 
"7",0x00,0x00,0x0C,0x04,0x84,0x64,0x1C,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00, 
"8",0x00,0x00,0xB8,0x44,0x44,0x44,0xB8,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x00, 
"9",0x00,0x00,0x38,0x44,0x44,0x44,0xF8,0x00,0x00,0x00,0x00,0x04,0x04,0x02,0x01,0x00, 
"0",0x00,0x00,0xF8,0x04,0x04,0x04,0xF8,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x00, 
".",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00,0x00, 

⌨️ 快捷键说明

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