找回密码
 立即注册
查看: 51|回复: 0

36.4-LCD128x64显示图形文字-ST7920-IO口模拟M6800并行接口,AI8051U实验箱演示程序

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:274
  • 最近打卡:2026-07-21 08:44:27
已绑定手机

292

主题

1027

回帖

3313

积分

超级版主

积分
3313
QQ
发表于 2026-6-30 14:11:26 | 显示全部楼层 |阅读模式
36.4-LCD128x64显示图形文字-ST7920-IO口模拟M6800并行接口,AI8051U实验箱演示程序

主程序main.C代码如下(汇编版本在附件中):

/*---------------------------------------------------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- BBS: www.STCAIMCU.com  -----------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序            */
/*---------------------------------------------------------------------*/

/*************  功能说明    **************



本例程基于AI8051U为主控芯片的实验箱9.6版本进行编写测试。

使用Keil C51编译器,为了达到比较高的效率,一般建议选择"Small"模式。

当编译器出现 "error C249: 'DATA': SEGMENT TOO LARGE" 错误时,则需要手动将部分比较大的数组通过"xdata" 强制分配到 XDATA 区域(例如: char xdata buffer [256];)

128*64的LCD显示程序

显示图形,汉字,英文,数字

下载时, 选择时钟 12MHz (用户可自行修改频率).

******************************************/

#include "../comm/AI8051U.h"
#include "stdio.h"
#include "intrins.h"

typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;

#define MAIN_Fosc        12000000UL

/****************************** 用户定义宏 ***********************************/
sbit    LCD_RS = P4^5;  //定义引脚
sbit    LCD_RW = P3^6;  //9.5版本之前实验箱需要将P42与P44对调才能正常使用
sbit    LCD_E  = P3^7;
//sbit    PSB    = P3^5;      //PSB脚为12864的串、并通讯功能切换,我们使用8位并行接口,PSB=1
sbit    LCD_RESET   =   P4^7;   //  17---RESET  L-->Enable
#define LCD_Data P2

#define Busy    0x80 //用于检测LCD状态字中的Busy标识
/*****************************************************************************/

/*************  本地常量声明    **************/
u8  code uctech[] = {"深圳国芯人工智能"};
u8  code net[]    = {" www.stcai.com "};
u8  code mcu[]    = {"专业设计51单片机"};
u8  code qq[]     = {"AI8051U LQFP48 "};

    //128*64点阵图形数据
u8 code gImage_gxw[1024] = { /* 0X10,0X01,0X00,0X80,0X00,0X40, */
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x3F,0x03,0xF0,0x3F,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x21,0x02,0x10,0x21,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x21,0x02,0x10,0x21,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x21,0x02,0x10,0x21,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x21,0x02,0x10,0x21,0x02,0x10,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7F,0xF0,
    0x00,0x21,0x02,0x10,0x21,0x02,0x10,0x01,0xFF,0xF0,0x41,0x00,0x7F,0xC0,0x00,0x00,
    0x00,0x21,0x02,0x10,0x21,0x02,0x10,0x01,0x08,0x10,0x41,0x00,0x40,0x40,0x00,0x00,
    0x00,0x21,0x02,0x10,0x21,0x02,0x10,0x01,0x08,0x10,0x41,0x00,0x40,0x40,0x00,0x00,
    0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF9,0x1F,0x90,0x41,0x00,0x7F,0xC0,0x00,0x00,
    0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF9,0x31,0x10,0x7F,0xF0,0x40,0x41,0xFF,0xFC,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x4A,0x10,0x40,0x00,0x40,0x40,0x02,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x04,0x10,0x40,0x00,0x7F,0xC0,0x02,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x1B,0x10,0x40,0x00,0x11,0x00,0x22,0x20,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0xE0,0xF0,0x7F,0x81,0x11,0x10,0x22,0x10,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0C,0x10,0x40,0x80,0x91,0x10,0x42,0x08,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x02,0x10,0x40,0x80,0x51,0x20,0x82,0x04,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x18,0x10,0x40,0x80,0x51,0x41,0x02,0x04,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x06,0x10,0x80,0x80,0x11,0x00,0x0A,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0xFF,0xF0,0x80,0x83,0xFF,0xF8,0x04,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x00,0x11,0x00,0x80,0x00,0x00,0x00,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x63,0x07,0x87,0x83,0xCF,0xC1,0x8C,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x67,0x83,0x0C,0xC6,0x6C,0x03,0x8C,0xD8,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,
    0x6C,0xC3,0x0C,0xC6,0xEC,0x0F,0x8C,0xD8,0x00,0x3C,0x00,0x00,0x00,0xFF,0x80,0x00,
    0x6C,0xC3,0x0E,0xC6,0xEC,0x01,0x8C,0xD8,0x00,0xFF,0x80,0x00,0x03,0xFF,0xE0,0x00,
    0x6C,0xC3,0x07,0x86,0x6F,0x81,0x8C,0xD8,0x03,0xFF,0xE0,0x00,0x07,0xFF,0xF0,0x00,
    0x6F,0xC3,0x0D,0xC7,0x60,0xC1,0x8C,0xD8,0x07,0x80,0xF0,0x00,0x0F,0xFF,0xF8,0x00,
    0x6C,0xC3,0x0C,0xC7,0x60,0xC1,0x8C,0xD8,0x0E,0x18,0x38,0x00,0x1F,0xFF,0xFC,0x00,
    0x6C,0xC3,0x0C,0xC6,0x61,0x81,0x8C,0xD8,0x1C,0x18,0x1C,0x00,0x1F,0xFF,0xFC,0x00,
    0x6C,0xC7,0x87,0x83,0xCF,0x01,0x87,0x98,0x38,0x18,0x0E,0x00,0x3F,0xFF,0xFE,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x30,0x18,0x06,0x00,0x3F,0xFF,0xFE,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x70,0x18,0x07,0x00,0x7C,0x3E,0x1F,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x60,0x18,0x03,0x00,0x7C,0x3E,0x1F,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x60,0x18,0x03,0x00,0x7E,0x7F,0x3F,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0xF0,0x18,0x07,0x80,0x7F,0xFF,0xFF,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0xF8,0x1F,0xCF,0x80,0x7F,0xFF,0xFF,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0xF8,0x1F,0xCF,0x80,0x7F,0xFF,0xFF,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0xF0,0x00,0x07,0x80,0x7F,0xFF,0xFF,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x60,0x00,0x03,0x00,0x7F,0x80,0xFF,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x70,0x00,0x07,0x00,0x3F,0x80,0xFE,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x30,0x00,0x06,0x00,0x3F,0xC1,0xFE,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x38,0x00,0x0E,0x00,0x1F,0xE3,0xFC,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x1C,0x00,0x1C,0x00,0x0F,0xFF,0xF8,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x18,0x38,0x00,0x07,0xFF,0xF0,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x07,0xBC,0xF0,0x00,0x03,0xFF,0xE0,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x03,0xFF,0xE0,0x00,0x01,0xFF,0xC0,0x00,
    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0xFF,0x80,0x00,0x00,0x3E,0x00,0x00,
    0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,
    0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x21,0x02,0x10,0x21,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x21,0x02,0x10,0x21,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x21,0x02,0x10,0x21,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x21,0x02,0x10,0x21,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x21,0x02,0x10,0x21,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x21,0x02,0x10,0x21,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x21,0x02,0x10,0x21,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x3F,0x03,0xF0,0x3F,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};


/*************  本地变量声明    **************/


/*************  本地函数声明    **************/
void    delay_ms(u16 ms);
void    WriteDataLCD(u8 WDLCD);
void    WriteCommandLCD(u8 WCLCD,u8 BuysC);
u8      ReadDataLCD(void);
u8      ReadStatusLCD(void);
void    LCDInit(void);
void    LCDClear(void);
void    LCDFlash(void);
void    DisplayOneChar(u8 X, u8 Y, u8 DData);
void    DisplayListChar(u8 X, u8 Y, u8 code *DData);
void    DisplayImage (u8 code *DData);

/********************* 主函数 *************************/
void main(void)
{
    WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXSFR(); //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0xc0;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0xa0;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

    delay_ms(100); //启动等待,等LCD讲入工作状态
    LCDInit(); //LCM初始化
    delay_ms(5); //延时片刻(可不要)

    while(1)
    {
        LCDClear();
        DisplayImage(gImage_gxw);//显示图形
        delay_ms(3000);
        LCDClear();
        DisplayListChar(0,1,uctech);    //显示字库中的中文数字
        DisplayListChar(0,2,net);       //显示字库中的中文数字
        DisplayListChar(0,3,mcu);       //显示字库中的中文
        DisplayListChar(0,4,qq);        //显示字库中的中文数字
        delay_ms(3000);
    }
}

//========================================================================
// 函数: void delay_ms(u8 ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注:
//========================================================================
void delay_ms(u16 ms)
{
    u16 i;
    do{
        i = MAIN_Fosc / 6000;
        while(--i);
    }while(--ms);
}

//******************************************
void LCD_delay(void)
{
    NOP(30);    //电压降低,IO口翻转速度变慢,驱动信号需要增加延时时间
    NOP(30);
}

//写数据
void WriteDataLCD(u8 WDLCD)
{
    ReadStatusLCD(); //检测忙
    LCD_RS = 1;
    LCD_delay();
    LCD_RW = 0;
    LCD_Data = WDLCD;
    LCD_delay();
    LCD_E = 1;
    LCD_delay();
    LCD_E = 0;
}

//写指令
void WriteCommandLCD(u8 WCLCD,u8 BuysC) //BuysC为0时忽略忙检测
{
    if (BuysC) ReadStatusLCD(); //根据需要检测忙
    LCD_RS = 0;
    LCD_delay();
    LCD_RW = 0;
    LCD_Data = WCLCD;
    LCD_delay();
    LCD_E = 1;
    LCD_delay();
    LCD_E = 0;  
}

//读状态
u8 ReadStatusLCD(void)
{
    LCD_Data = 0xFF;

    LCD_RS = 0;
    LCD_delay();
    LCD_RW = 1;
    LCD_delay();
    LCD_E = 1;
    LCD_delay();
    while (LCD_Data & Busy); //检测忙信号
    LCD_E = 0;

    return(LCD_Data);
}

void LCDInit(void) //LCM初始化
{
//  PSB = 1;    //并口
//  PSB = 0;    //SPI口
    delay_ms(10);
    LCD_RESET = 0;
    delay_ms(10);
    LCD_RESET = 1;
    delay_ms(100);
   
    WriteCommandLCD(0x30,1); //显示模式设置,开始要求每次检测忙信号
    WriteCommandLCD(0x01,1); //显示清屏
    WriteCommandLCD(0x06,1); // 显示光标移动设置
    WriteCommandLCD(0x0C,1); // 显示开及光标设置
}

void LCDClear(void) //清屏
{
    WriteCommandLCD(0x01,1); //显示清屏
    WriteCommandLCD(0x34,1); // 显示光标移动设置
    WriteCommandLCD(0x30,1); // 显示开及光标设置
}


//按指定位置显示一串字符
void DisplayListChar(u8 X, u8 Y, u8 code *DData)
{
    u8 ListLength,X2;
    ListLength = 0;
    X2 = X;
    if(Y < 1)   Y=1;
    if(Y > 4)   Y=4;
    X &= 0x0F; //限制X不能大于16,Y在1-4之内
    switch(Y)
    {
        case 1: X2 |= 0X80; break;  //根据行数来选择相应地址
        case 2: X2 |= 0X90; break;
        case 3: X2 |= 0X88; break;
        case 4: X2 |= 0X98; break;
    }
    WriteCommandLCD(X2, 1); //发送地址码
    while (DData[ListLength] >= 0x20) //若到达字串尾则退出
    {
        if (X <= 0x0F) //X坐标应小于0xF
        {
            WriteDataLCD(DData[ListLength]); //
            ListLength++;
            X++;
        }
    }
}

//图形显示122*32
void DisplayImage (u8 code *DData)
{
    u8 x,y,i;
    unsigned int tmp=0;
    for(i=0;i<9;)       //分两屏,上半屏和下半屏,因为起始地址不同,需要分开
    {
        for(x=0;x<32;x++)   //32行
        {
            WriteCommandLCD(0x34,1);
            WriteCommandLCD((u8)(0x80+x),1);//列地址
            WriteCommandLCD((u8)(0x80+i),1);    //行地址,下半屏,即第三行地址0X88
            WriteCommandLCD(0x30,1);        
            for(y=0;y<16;y++)   
                WriteDataLCD(DData[tmp+y]);//读取数据写入LCD
            tmp+=16;        
        }
        i+=8;
    }
    WriteCommandLCD(0x36,1);    //扩充功能设定
    WriteCommandLCD(0x30,1);
}
36.4-LCD128x64显示图形文字-ST7920-IO口模拟M6800并行接口.zip (8.79 KB, 下载次数: 4)

热线19952583534
www.STCAI.com
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-22 10:20 , Processed in 0.072671 second(s), 43 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表