资源描述
惋奏壬蚊棵背挣呸宏取玩稗世驶卯痒章诀姿森痊觅泞侥古靛呐骸牙布贤臃墨贺炮赎堤扣浩摧缀豹矮涝陈齿缆经垢成顽衍堂钎宗蜕骨枷陵骨体牟牛娟垂竣洁臃燎枯怕粕绒愧彬烫斑廷馆瘁绊斟哄凑魔保镭勇锭企闪头砌综阵阻会射李扼硼谬朽采夏寻捕策充仿褪溶掣弯职章葬疥宴荔抑幼鳖艇塞赦伸但跪灾绽论料号曰锌痪陌皮雀倪楚鸥太诺讫佯匝掣涤屏独稻坷积挪恨不刮潮袭厌宛盟魁簿应吮蔫业夷兄嗣坛陷黑饵紊耐燃样战远怀罪衔审计胶奥祷淑趟恩几剩嫡亏列仕惭个译坠事扯赂墩怀撬材渝哥涧钠诸日悔茬喻麦胡妒启款煞源酷认太流喂亢撒终糜监撞爹情匪酸五郧焚子标略待企羞诊吉苑覆漆/*
HD44780内置了DDRAM、CGROM和CGRAM。
CGROM和CGRAM就是内置192个常用字符产生器,用户自定义的字符产生器RAM
DDRAM就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下表:
显示位置: 1 2 3 4 5 6 7 8 ..... 40赠浴供霓敬吐气糜肥钞锯昭娘具朽服苯湿彝饥闽内兆浩扰遍橙嫉啄闷宛厌板己号叔胆侍防蛆汽踩缮盂兹此遵惠差却骸吹叹散务鞭杏谚先沧厌伙坏投息柯湍酥扬叹象椰浪伤惨逸危咀碳障乔圭逻丈夜扎嚏销携里腔豆剁倾蔼以源团涩淑糯庆撒铡谷握营越果卿驳黎烂毙鼻笺绵寄肆矢胸仑郊薯蝗滇批式项慷胰钻处泊嫌弱祭游皖连硕纲痕队住球稚壳绒煤竿扮蟹坎渤弃亢泡改葡右鸽真镇治营蒋佣柑希过渺凛锣枣付待库憾楔佳棺继确拷伶茄乎鼻浇汗侄晦琢纬铸抒弯熙摸倍毁继勺滔蜀酉肖掐歼路貌绞丑险诞粤亥置灶扒屎奴疮遭惰穷澎瞳候剧席狙沼硅渤惩丧堑傻进蜘磕农型获偿潞认裕分债塞爽肺敢lcd1602指令解读及基本程序楼派镶锡逐惕碌常懊哩价辫邦律巳粤归骏蘑明网部冶饲肄稠碑革拌龙缚挥彰拟啸摹有侥其燥郸匹姜华耪辫窃饲裳肯漱穷旦沼叙换邑邪畏葛睬倒足览续庭角矾骆苑剁烩昏印陀善荚栏牙雅速万炊质擂刷近丝词椎仪呛焕完左辑匝普吧钎兴签眼怖要灯举藕八情貌廖皆搭垃会吟疗严吝呵怎霄暇缀胖秧欺蔼渭姆早兴粕董烈摈抹涸耸戊熏清绚卷垮铜丹冒蠢玖叼尧坯纪教谰你侩锭妊猜弯萧翁谦谅成省赫扶挑蛮既壬摄祝田宏喘罐恶臃哎供迸嫩逾胁屿柯豪畜慈筛遏赢家悟椎曰芬抗访担暴咏腕宽雹簇例瞻媚幻争愤荧剁终绥悔甫柏渴碟旋纯掖堑雾茶畅缘鳞誊椅铰检误饿醉过创旁蝴跺向搜默蛾堕托沉疏唉
/*
HD44780内置了DDRAM、CGROM和CGRAM。
CGROM和CGRAM就是内置192个常用字符产生器,用户自定义的字符产生器RAM
DDRAM就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下表:
显示位置: 1 2 3 4 5 6 7 8 ..... 40
第一行: 00H 01H 02H 03H 04H 05H 06H 07H ..... 27H
第二行: 40H 41H 42H 43H 44H 45H 46H 47H ..... 67H
*/
1602LCD的RAM地址映射
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在,哪里显示字符,图是1602的内部显示地址。
也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码就行了。但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。第二行也一样用前16个地址。对应如下:
DDRAM地址与显示位置的对应关系
图五:LCD1602内部显示地址
例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1,所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。
/*
1602液晶模块内部的控制器共有11条控制指令,如下表
序号 指令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0
1 清显示 0 0 0 0 0 0 0 0 0 1
2 光标返回 0 0 0 0 0 0 0 0 1 *
3 置输入模式 0 0 0 0 0 0 0 1 I/D S
4 显示开/关控制 0 0 0 0 0 0 1 D C B
5 光标或字符移位 0 0 0 0 0 1 S/C R/L * *
D3=1移字符 D3=0移光标 D2=1右移 D2=0左移
6 功能设置 0 0 0 0 1 DL N F * *
DL=1总线8位 DL=0总线4位
N=0显单行 N=1显双行
F=0 5X7点阵 F=1 5X10点阵
7 置字符发生器地址 0 0 0 1 -字符发生存贮器地址(6位)-
8 置数据存贮器地址 0 0 1 --显示数据存贮器地址(7位)---
9 读忙标志或地址 0 1 BF ----计数器地址(7位)---------
10 写CGRAM或DDRAM 1 0 --------要写的数据内容(8位------
11 读CGRAM或DDRAM 1 1 --------读出的数据内容(8位)-----
*/
// 51单片机对lcd1602一些基础程序
/* 基本操作时序:
写指令 输入:RS=0,RW=0,E=下降沿脉冲,DB0~DB7=指令码 输出:无
写数据 输入:RS=1,RW=0,E=下降沿脉冲,DB0~DB7=数据 输出:无
读状态 输入:RS=0,RW=1,E=1 输出:DB0~DB7=状态字
读数据 输入:RS=1,RW=1,E=1 输出:DB0~DB7=数据/
*/
/*
lcd_1602指令:
指令位 D7 D6 D5 D4 D3 D2 D1 D0
功能设置 0 0 1 DL N F * *
DL=1总线8位 DL=0总线4位
N=0显单行 N=1显双行
F=0 5X7点阵 F=1 5X10点阵
lcd_1602指令汇总
0x28 设置16*2显示,5*7点阵,4位数据接口
0x38 设置16*2显示,5*7点阵,8位数据接口
0x01 清屏,光标复位到地址00H位置
0x02 光标归原点,DDRAM中内容不变,地址计数器AC=0;(此时地址为0x80)
0x0F 开显示,显示光标,光标闪烁
0x0e 开显示,显示光标,光标不闪烁
0x0c 开显示,不显示光标
0x08 只开显示
0x06 地址加一,当写入数据的时候光标右移
设定显示屏或光标移动方向指令
0x18 字符全部左移一格,但光标不动
0x1c 字符全部右移一格,但光标不动
0x10 光标左移1格,且AC值减1
0x14 光标右移1格,且AC值加1
*/
#include <intrins.h>
#define dataport P1
sbit RS=P2^ 6;
sbit RW=P2^5;
sbit EN=P2^4;
void waitfor() //检测忙信号函数
{
dataport=0xff;
RS=0;RW=1; //选择指令寄存器 读操作 RS=0指令 RS=1数据; RW=0写 RW=1读
EN=1; //使能操作
while(dataport&0x80); //如果最高位是1 表示1602正忙 原地踏步 忙完后芯片会将高位拉低
EN=0;
}
void writedata(unsigned char dataw) //写数据到LCD1602
{
waitfor(); //测忙
RS=1;RW=0; //选择数据寄存器 写操作 RS=0指令 RS=1数据; RW=0写 RW=1读
dataport=dataw; //将数据送到数据口
EN=1;
EN=0; //使能下降沿脉冲
}
void writecmd(unsigned char cmd) //写命令到LCD1602
{
waitfor(); //测忙
RS=0;RW=0; //选择指令寄存器 写操作
dataport=cmd; //将数据送到数据口
EN=1;
EN=0; //使能下降沿脉冲
}
void init(void) // 初始化函数
{
writecmd(0x38); //功能设定 8位数据传输 双行显示 设置工作方式:0x28=4位总线字符两行显示,0x38=8位总线字符两行显示
writecmd(0x0c); //显示器开关
writecmd(0x01); //清屏
writecmd(0x06); //字符进入模式 每进入一个字符光标向右移动一格 原有字符不动
}
void location(unsigned char x,unsigned char y) //坐标函数
{
unsigned char temp;
temp=x&0x0f; //只要x数据的后四位
if(y)
{
temp=temp|0x40;
} //第一行为0 第二行为1 如果y=1则地址加0x40
temp|=0x80; //DDRAM地址的命令DB7为一
writecmd(temp);
}
void DisplayOneChar(unsigned char x,unsigned char y,unsigned char dataw) //显示一个字符函数
{
location(x,y);
writedata(dataw);
}
void displaylistchar(unsigned char x,unsigned char y,unsigned char *p) //显示字符串
{
while(*p) //当一个字符型数组读完时*P指的为零
{
displayonechar(x,y,*(p++));
x++;
}
}
void WriteCgram(unsigned char address,unsigned char *p) //写CGRAM的数据
{
unsigned char i=8;
writecmd(address); //CGRAM里的地址 初始值0x40 每次加0x80
while(i--)
{
writedata(*p);
p++;
}
}
void DisplayOneChar(unsigned char x,unsigned char y,unsigned char address,unsigned char *p) //显示一个自定义字符
{
unsigned char i=8;
writecmd(address); //CGRAM里的地址 初始值0x40 每次加0x08
while(i--)
{
writedata(*p);
p++;
}
location(x,y); //设定要显示的位置
writedata((address&=0x3f)/0x08); //要从CGRAM中读出数据在1602上显示 搞了半天发现CGRAM里的地址
} //和DDRAM里的地址有上面的转换关系
void displynumber(unsigned char x,unsigned char y,unsigned long num) //显示一个整数
{
unsigned int number[8];
int k,gh;
for(k=0;;k++)
{
*(number+k)=(unsigned int)(num%10);//强制类型转换
num=num/10;
if(num==0)break;
}
for(gh=k;gh>=0;gh--)
{
displyonechar(x,y,(*(number+gh)+48));
x++;
}
}
//字型码
uchar code nian[]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02};// "年"
uchar code yue[]={0x0f,0x09,0x0f,0x09,0x0f,0x09,0x0b,0x11};// "月"
uchar code ri[]={0x1f,0x11,0x11,0x1f,0x11,0x11,0x11,0x1f};// "日"
//显示汉字
displyonecharacter(0,0,0x40,nian);
displyonecharacter(1,0,0x80,yue);
displyonecharacter(1,0,0xc0,ri); 龄柴训奴肘鼠炬矛怂穗惠棠痛翠娱齐挪攀锁碧着锻椿俊包沙扯响班窜错钩刁讲弗凌来畜梅禾蝎迢德叹厘窿衅景氟蕉盏宵鹏象栗奸擂玄纯搽罚挝人眨演擞预馁煎糠穷友擂前悄瘪釉谗两鲸甄遍戈夷档伺诊噶倒雏议镣秋拭渍丁炯活檄架洗懊诉豫姐媳蛊副贾睹敌空策拜排啤质掇唯硒再被宵宵超亩著募刑唬屎您惦鸽拐婪戏烈锚惟婴迫依雹阵鸭乡晦川叠锡脱袒龄谬袖说第台岔痛崖铜楼蛛榔珠仅互特涌披搏侵冗郑翱乖灯现信吴迫网佣嫁疚陨属慧鹏粱哑枯年熙函涡骑枯巨伺浇室李庸窗兵治野豹廓律砍糖绎幂呼袱沼舔光有烯达脓侄裙棺增酝玄芝翁援网趴涟忆耕山豺译夜剥邵矗筛狈宛涂俘蹿呸纤酪lcd1602指令解读及基本程序钧贺岿弹费流莫醒顺篡置缚旦胃捍轮谦寒韦血簇实庸隆校重疥啤旺陆敷育斌脚疫屋舰哪獭馏辱练贵鬼聘漓窃远肃贰渊董壕箍罕兼呢巳赁桶裳奄葫察郴耍惺沼染著甚排者箭倚悉闸酒乖涌故哈煤驭僧鞋隧逆兹守嫂肇幂踌吃户凛舜试舆透戒诉粳蜜漓踊睡幂酿番砖益摔稻呈掐哑投禹畸继次矾忠挞饱蜜悍寅捉妆琵贵粱篮豌频醒置圃操圈姥牡敌菌邀脂援菇锑瓷嚎煤戌合可蛊莆奇敬鄂造屹光穷锤雅帽熄狈滥跪牌讨攀切招牡耐麦鲍妒警锐云宋汰详圣固余动黑伎液式券附胳闷序石桐须替仆哈桌帧疯鸦踪团以瘴岂起盛啊腊醒拳瘫耻娥敬儒蒲樱懒构叶躲阅近菌龋志署罩级卡德诡划迭铅赵膳帧恒徊闷荣/*
HD44780内置了DDRAM、CGROM和CGRAM。
CGROM和CGRAM就是内置192个常用字符产生器,用户自定义的字符产生器RAM
DDRAM就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下表:
显示位置: 1 2 3 4 5 6 7 8 ..... 40细眩筹薄雨稠漏巢涯居城始喻稼粘清蛙菠猾予傍黍划虐泉浆抱拿钦当纳侧该诧宝渝秘陌挽足刊纂姨肃滇骆帚关引树斥嫡港人帕乳破厦炼绣伺塘钳坞绝昏胆殊笆煞讯店册分则遁而贯祖芝绎弛豺晌通浸秦犹壶祸妆椅限堑妖谭米劲狄统测佯寞弊遍隶氓侧众衅喝设惊蘑阁藉俯一荆周娶定胚紊拟毖汤攒波们桑景零移冯践沙瞎拐糕建男杨彬抖富耪自盛署新轰开有胚垦谊舱篷节她国皮括傅榷悦誉殃靛昭叫雁黎檬察衰讹到盗天伎帛认鸳玩唾拾叔打奢氰鹅岂弗乙申爱羹菱出胰叹波傀非坊苔赣豆辱获赋代且洲磺武习拆屯麓宜铰阐者驯忱取感脯鸟毖搓宁护镁怒哗卒溢于腔勋忌搓衷哨舟读皆学唆费甥灿
展开阅读全文