lcd12864显示程序 下载本文

内容发布更新时间 : 2024/5/18 8:21:25星期一 下面是文章的全部内容请认真阅读。

/************************************************* 名 称:LCD12864_ST7920并行测试程序

试验功能:测试基于ST7920控制芯片的LCD12864的显示 并行方式连接;晶振11.0592M 编 写:JiangX.net

*************************************************/ #include #include #include #define uchar unsigned char #define uint unsigned int //宏定义 /*****LCD接口定义*****/

sbit LCD_RS = P2^0; //1:输入数据 ;0:输入命令 sbit LCD_RW = P2^1; //1:读数据 0:写数据 sbit LCD_EN = P2^2; //LCM使能端

sbit LCD_PSB = P2^3; //串并口选择 1:并口模式; 0:串口模式; #define LCD_DATA P0 //LCD总线端口 /*****LCD功能初始化指令*****/

#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H #define AC_INIT 0x02 //将AC设置为00H。且游标移到原点位置

#define CURSE_ADD 0x06 //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)

#define FUN_MODE 0x30 //工作模式:8位基本指令集

#define DISPLAY_ON 0x0c //显示开,显示游标,且游标位置反白 #define DISPLAY_OFF 0x08 //显示关

#define CURSE_DIR 0x14 //游标向右移动:AC=AC+1 #define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH #define SET_DD_AC 0x80 /*****汉字地址表*****/

uchar code addr_tab[]={ //便于根据汉字坐标求出地址 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置 };

/*****n(ms)延时子程序*****/ void delayms(uint t) //约延时n(ms) { uint i; while(t--) {

for(i=0;i<125;i++); } }

/*****等待LCD忙*****/

void WaitBusy(void) //延时一小段时间,等待LCD空闲 {

uchar i=5; while(i--); }

/*****写指令代码*****/

void Lcd_WriteCmd(uchar cmdcode) {

LCD_RS = 0; LCD_RW = 0; LCD_EN = 1; WaitBusy();

LCD_DATA = cmdcode; LCD_EN = 0; }

/*****写数据*****/

void Lcd_WriteData(uchar dispdata) {

LCD_RS = 1; LCD_RW = 0; LCD_EN = 1; WaitBusy();

LCD_DATA = dispdata; LCD_EN = 0; }

/*****初始化LCD*****/ void Lcd_Init() {

LCD_PSB = 1; delayms(50);

Lcd_WriteCmd(0x30); //选择基本指令集 delayms(1);

Lcd_WriteCmd(0x30); //选择8bit数据流 delayms(1);

Lcd_WriteCmd(0x0c); //开显示(无游标、不反白) delayms(1);

Lcd_WriteCmd(0x01); //清除显示,并且设定地址指针为00H

delayms(20); }

/*****显示汉字*****/

void hanzi_Disp(uchar x,uchar y,uchar code *s) { //x、y为汉字坐标

Lcd_WriteCmd(addr_tab[8*x+y]); //写地址 while(*s>0) {

Lcd_WriteData(*s); //写数据 s++; } }

/*****显示图片(显示Gdram内容)*****/ /*绘图显示的步骤 1 关闭绘图显示功能

2 先将垂直的坐标(Y)写入绘图RAM地址 3 再将水平的位元组坐标(X)写入绘图RAM地址 4 将D15-D8写入RAM中 5 将D7-D0写入到RAM中 6 打开绘图显示功能*/

//图片取模方式:横向取模,字节正序

void pic_Disp(uchar *pic) //显示Gdram内容(显示图片) {

uchar x,y,i; for(i=0;i<9;i=i+8) for(y=0;y<32;y++) {

for(x=0;x<8;x++) {

Lcd_WriteCmd(0x36); //扩充指令,开绘图显示 Lcd_WriteCmd(0x80+y); //行地址 Lcd_WriteCmd(0x80+x+i); //列地址 Lcd_WriteData(*pic++); //写数据 D15-D8 Lcd_WriteData(*pic++); //写数据 D7-D0 Lcd_WriteCmd(0x30); } } }

/*****整屏显示竖条*****/

//当i=0时显示上面128×32,当i=8时显示下面128×32 //当i=0时显示上面128×32,当i=8时显示下面128×32