#include<reg51.h>
#include<intrins.h>
#include<stdlib.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
// 汉字字模表 //
// 汉字库: 宋体16.dot,横向取模左高位,数据排列:从左到右从上到下 //
/////////////////////////////////////////////////////////////////////////
//struct typFNT_GB16 code GB_16[] = // 数据表
//{
//"数", 0x08,0x40,0x49,0x40,0x2A,0x40,0x08,0x84,
// 0xFF,0xFE,0x19,0x08,0x2C,0x88,0x4A,0x88,
// 0x10,0x88,0xFE,0x90,0x22,0x50,0x22,0x20,
// 0x14,0x50,0x18,0x88,0x25,0x0E,0x42,0x04
//
//"次", 0x00,0x80,0x40,0x80,0x30,0x80,0x11,0x08,
// 0x01,0xFC,0x02,0x08,0x08,0x50,0x10,0x40,
// 0x20,0x40,0xE0,0x40,0x20,0xA0,0x20,0xA0,
// 0x21,0x10,0x22,0x08,0x24,0x0E,0x28,0x04};
// 汉字表:
// 数
//造字步骤:1设置为扩充指令集2设置SR=O,允许设定CGRAM地址
//3设置为基本指令集4循环执行以下操作写入16个字节数据(设定CGRAM的存储地址;写入自定义数据)5设置DDRAM地址6写入显示CGRAM显示码7
/*端口定义*/
#define lcd_data P0
sbit lcd_rs=P2^6;
sbit lcd_rw=P2^5;
sbit lcd_en=P2^7;
void delay(uint x)//毫秒级延迟函数
{
uint i,j;
for(j=0;j<x;j++)
for(i=0;i<110;i++);
}
/*写指令数据到LCD*/
void LcdWcom(uchar cmd)
{
lcd_rs=0;
lcd_rw=0;
lcd_en=0;
P0=cmd;
delay(5);
lcd_en=1;
delay(5);
lcd_en=0;
}
/*写显示数据到LCD*/
/*rs=H,rw=L,e=高脉冲,D0~D7=数据*/
void LcdWdata(uchar dat)
{
lcd_rs=1;
lcd_rw=0;
lcd_en=0;
P0=dat;
delay(5);
lcd_en=1;
delay(5);
lcd_en=0;
}
/*LCD初始化设定*/
void lcd_init()
{
LcdWcom(0x30);//基本指令操作
delay(5);
LcdWcom(0x0C);//显示开,关光标
delay(5);
LcdWcom(0x01);//清楚LCD的显示内容
delay(5);
}
/*设定显示的起始地址*/
void Set_Cursor(uchar x,uchar y)
{
int dizhi;
if(x==0)
{dizhi=0x80+y;} //第一行首地址为0x80。
if(x==1)
{dizhi=0x90+y;} //第二行首地址为0x90。
if(x==2)
{dizhi=0x88+y;} //第三行首地址为0x88。
if(x==3)
{dizhi=0x98+y;} //第四行首地址为0x98。
LcdWcom(dizhi);
}
//********************************************************
//设置CGRAM字库
//ST7920 CGRAM(用户自定义图标)空间分布
//空间1地址:40H~4FH共16个地址,一个地址对应两个字节数据;对应调用码:0000H
//空间2地址:50H~5FH共16个地址,一个地址对应两个字节数据;对应调用码:0002H
//空间3地址:60H~6FH共16个地址,一个地址对应两个字节数据;对应调用码:0004H
//空间4地址:70H~7FH共16个地址,一个地址对应两个字节数据;对应调用码:0006H
//参数说明:num为空间编号,CGRAM_ZIKU为地址指针
//********************************************************
void SET_CGRAM(unsigned char num,unsigned char *CGRAM_ZIKU)
{
unsigned char i,add;
LcdWcom(0x34); //再次设置为8位并行口,扩展指令集
LcdWcom(0x02); //SR=0,允许设置CGRAM地址
LcdWcom(0x30); //恢复设置为8位并行口,基本指令集
switch(num)
{case 1:
{
add=(num<<4)|0x40; //计算CGRAM的首地址
for(i=0;i<16;i++)
{
LcdWcom(add+i); //设置CGRAM的首地址
LcdWdata(CGRAM_ZIKU[i*2]); //写入高8位数据
LcdWdata(CGRAM_ZIKU[i*2+1]);//写入低8位数据
}
break;
}
case 2:
{
add=(num<<4)|0x50;
for(i=0;i<16;i++)
{
LcdWcom(add+i);
LcdWdata(CGRAM_ZIKU[32+2*i]);
LcdWdata(CGRAM_ZIKU[33+2*i]);
}
break;
}
}
}
//********************************************************
//指定位置显示CGRAM自造字函数
//参数说明:x为行号,y为列号,num为编号
//********************************************************
void Display_CGRAM(unsigned char x,unsigned char y,unsigned char num)
{
Set_Cursor(x,y); //设置显示的起始地址
LcdWdata(0x00); //写入需要显示汉字的高八位数据
LcdWdata(num*2); //写入需要显示字符的低八位数据
}
/******************************************CGRAM字库定义****************************************/
unsigned char code CGRAM_ZIKU_I2C[64]=
{
/*-- 文字: 数 --*/
0x08,0x40,0x49,0x40,0x2A,0x40,0x08,0x84,
0xFF,0xFE,0x19,0x08,0x2C,0x88,0x4A,0x88,
0x10,0x88,0xFE,0x90,0x22,0x50,0x22,0x20,
0x14,0x50,0x18,0x88,0x25,0x0E,0x42,0x04,
/*-- 文字: 次 --*/
0x00,0x80,0x40,0x80,0x30,0x80,0x11,0x08,
0x01,0xFC,0x02,0x08,0x08,0x50,0x10,0x40,
0x20,0x40,0xE0,0x40,0x20,0xA0,0x20,0xA0,
0x21,0x10,0x22,0x08,0x24,0x0E,0x28,0x04
};//I2C
/********************显示自定义的CGRAM********************/
void main()
{
lcd_init();
SET_CGRAM(1,&CGRAM_ZIKU_I2C); //把自定义的字库写入CGRAM
Display_CGRAM(0,3,2); //指定位置显示自定义的字库
SET_CGRAM(2,&CGRAM_ZIKU_I2C);
Display_CGRAM(0,2,1);
while(1);
}
给带字库的12864造字CGRAM
5星 · 超过95%的资源 需积分: 10 189 浏览量
2011-10-16
17:07:47
上传
评论 2
收藏 32KB RAR 举报
rain19890923
- 粉丝: 4
- 资源: 14
最新资源
- 纯用JAVA解析Google的KMZ和KML空间数据的示例代码
- hashcat-gui
- v2.1.6-Unity3D插件 SUIMONO Water System 效果逼真交互水系统
- 基于STM32 Discovery(STM32f407vgt6)Discovery板的STM32裸机项目集合
- 咸鱼快捷指令工具cxtool
- mmexport1717246170188.jpg
- 近代史调查问卷_统计报表_20240601205759.xlsx
- v2.1.2-Unity3D插件 SUIMONO Water System 效果逼真交互水系统
- 农村小别墅图纸编号D040-三层-08.30&14.60米-施工图.dwg
- 三层别墅图纸编号D039-三层-16.70&14.70米- 结构图.dwg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈