1602lcd

时间:2024-07-26 15:36:57编辑:分享君

1602液晶和12864液晶 什么是点阵 ?等等 谢谢进来

是的,液晶可以分为LED和LCD,LCD最常见的小屏幕是TFT,字符型和点阵型也是区别,字符型的可以直接输出字符,一般是内带字库。点阵型的可以画图,自己定义点。
1602是个经典的液晶,可以显示16*2个ASCII码或者日文的片假名(谁叫是日本人出的呢)。5*7是每一个字符是横向5个点纵向7个点。我用的是51开发板,也在用1602,是蓝屏的,花了我15大洋。
12864如果内带字库就可以直接显示汉字啊,如果是带字库的话,这样显示的结果和电子词典的差不多,但是我喜欢不带字库的,带字库的太贵了,我可以直接拿来苗点画函数,要输出中文的话我网上下一个字库,然后放在开发板的EEPROM里面,我的开发板是外置这块芯片的,有4K。
希望能够给你带来帮助


大学理工类都有什么专业

1、通信工程通信工程专业(Communication Engineering)是信息与通信工程一级学科下属的本科专业。该专业学生主要学习通信系统和通信网方面的基础理论、组成原理和设计方法,受到通信工程实践的基本训练,具备从事现代通信系统和网络的设计、开发、调测和工程应用的基本能力。2、软件工程软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。它涉及程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。在现代社会中,软件应用于多个方面。典型的软件有电子邮件、嵌入式系统、人机界面、办公套件、操作系统、编译器、数据库、游戏等。同时,各个行业几乎都有计算机软件的应用,如工业、农业、银行、航空、政府部门等。3、电子信息工程电子信息工程是一门应用计算机等现代化技术进行电子信息控制和信息处理的学科,主要研究信息的获取与处理,电子设备与信息系统的设计、开发、应用和集成。电子信息工程专业是集现代电子技术、信息技术、通信技术于一体的专业。本专业培养掌握现代电子技术理论、通晓电子系统设计原理与设计方法,具有较强的计算机、外语和相应工程技术应用能力,面向电子技术、自动控制和智能控制、计算机与网络技术等电子、信息、通信领域的宽口径、高素质、德智体全面发展的具有创新能力的高级工程技术人才。4、车辆工程车辆工程专业是一门普通高等学校本科专业,属机械类专业,基本修业年限为四年,授予工学学士学位。2012年,车辆工程专业正式出现于《普通高等学校本科专业目录》中。车辆工程专业培养掌握机械、电子、计算机等方面工程技术基础理论和汽车设计、制造、试验等方面专业知识与技能。了解并重视与汽车技术发展有关的人文社会知识,能在企业、科研院(所)等部门,从事与车辆工程有关的产品设计开发、生产制造、试验检测、应用研究、技术服务、经营销售和管理等方面的工作,具有较强实践能力和创新精神的高级专门人才。5、土木工程土木工程(Civil Engineering)是建造各类土地工程设施的科学技术的统称。它既指所应用的材料、设备和所进行的勘测、设计、施工、保养、维修等技术活动,也指工程建设的对象。即建造在地上或地下、陆上,直接或间接为人类生活、生产、军事、科研服务的各种工程设施,例如房屋、道路、铁路、管道、隧道、桥梁、运河、堤坝、港口、电站、飞机场、海洋平台、给水排水以及防护工程等。土木工程是指除房屋建筑以外,为新建、改建或扩建各类工程的建筑物、构筑物和相关配套设施等所进行的勘察、规划、设计、施工、安装和维护等各项技术工作及其完成的工程实体。专业老师在线权威答疑 zy.offercoming.com


1602液晶显示的单片机为什么屏幕亮但不显示数字

//单片机驱动1602液晶显示的的仿真,可以参考一下。#include#include#define uchar unsigned char#define uint unsigned intsbit E=P3^2;sbit RW=P3^3;sbit RS=P3^4;void delay() //延时函数{_nop_();_nop_();_nop_();_nop_();_nop_();}bit Busy(void){bit busy_flag = 0;RS = 0;RW = 1;E = 1;delay();busy_flag = (bit)(P1 & 0x80);E = 0;return busy_flag;}void wcmd(uchar del){while(Busy());RS = 0;RW = 0;E = 0;delay();P1 = del;delay();E = 1;delay();E = 0;}void wdata(uchar del){while(Busy());RS = 1;RW = 0;E = 0;delay();P1 = del;delay();E = 1;delay();E = 0;}void L1602_init(void){wcmd(0x38);//设置16*2显示,5*7点阵,8位数据口wcmd(0x0c);wcmd(0x06);wcmd(0x01);}void L1602_char(uchar hang,uchar lie,char sign){uchar a;if(hang == 1) a = 0x80;if(hang == 2) a = 0xc0;a = a + lie - 1;wcmd(a);wdata(sign);}void L1602_string(uchar hang,uchar lie,uchar *p){uchar a,b=0;if(hang == 1) a = 0x80;if(hang == 2) a = 0xc0;a = a + lie - 1;while(1){wcmd(a++);b++;if((*p == '\0')||(b==16)) break;wdata(*p);p++;}}void Main(){L1602_init();L1602_string(1,1,"0123456789 ");L1602_string(2,1," ABCDEFGHIJ ");L1602_char(2,15,'O');L1602_char(2,16,'K');while(1);}

为什么我的LCD1602数据显示不了??

#include
#include

#define uchar unsigned char
#define uint unsigned int

sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
sbit T_CLK = P1^6; /*实时时钟时钟线引脚 */
sbit T_IO = P1^5; /*实时时钟数据线引脚 */
sbit T_RST = P1^7; /*实时时钟复位线引脚 */
sbit E=P2^2;//1602使能引脚
sbit RW=P2^1;//1602读写引脚
sbit RS=P2^0;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
sbit key5=P3^4;
sbit nz=P3^7;
uchar lastkey0=0;
uchar lastkey1=0;
uchar lastkey2=0;
uchar lastkey3=0;
uchar lastkey4=0;
uchar lastkey5=0;
uchar lastkey6=0;
uchar lastkey7=0;
uchar lastkey8=0;
uchar a[8]={0x04,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x00}; //代码年
uchar b[8]={0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00}; //代码月
uchar c[8]={0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00}; //代码日
uchar code d[]="MONTUEWEDTHUFRISTASUN";
uchar code num[]="0123456789";
uchar sec, min, hour, day, mon, year,week;
void delay(uint i) //延时误差 0us
{
uchar a,b,c;
for(c=i;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void writecommand(uchar del)
{
P0 = del;
RS = 0;
RW = 0;
E = 0;
delay(1);
E = 1;
delay(1);
}

void writedata(uchar del)
{
P0 = del;
RS = 1;
RW = 0;
E = 0;
delay(1);
E = 1;
delay(1);
}

void L1602_init(void)
{
writecommand(0x01);
writecommand(0x38);
writecommand(0x0c);
writecommand(0x06);
writecommand(0xd0);
}

void L1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
writecommand(a);
writedata(sign);
}


void v_RTInputByte(uchar ucDa) //1302
{
uchar i;
ACC = ucDa;
T_RST = 1;
for(i=8; i>0; i--)
{
T_IO = ACC0;
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}

uchar uc_RTOutputByte(void)
{
uchar i;
T_RST = 1;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
T_IO=1;
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}

void v_W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); // 写地址
_nop_();
_nop_();
v_RTInputByte(ucDa); // 写1Byte数据
T_CLK = 1;
T_RST = 0;
}

uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); //写地址,命令
_nop_();
_nop_();
ucDa = uc_RTOutputByte(); //读1Byte数据
T_CLK = 1;
T_RST = 0;
return(ucDa);
}


uchar bcdtodec(uchar bcd)
{
uchar data1;
data1 = bcd & 0x0f; //取BCD低4位
bcd = bcd & 0x70; //剔除BCD的最高位和低4位。
data1 += bcd >> 1;
data1 += bcd >> 3; //用位移代替乘法运算
return data1;
}



void Write_DS1302Init(void)
{
v_W1302(0x8e,0);
v_W1302(0x80,0x48);//写入秒
v_W1302(0x8e,0);
v_W1302(0x82,0x22);//写入分
v_W1302(0x8e,0);
v_W1302(0x84,0x13);//写入小时
v_W1302(0x8e,0);
v_W1302(0x86,0x02);//写入日
v_W1302(0x8e,0);
v_W1302(0x88,0x12);//写入月
v_W1302(0x8e,0);
v_W1302(0x8a,0x05);//写入星期
v_W1302(0x8e,0);
v_W1302(0x8c,0x12);//写入年
}



void Run_DS1302(void)
{
uchar j;


v_W1302(0x8f, 0);
sec = bcdtodec(uc_R1302(0x81)); //读出DS1302中的秒
v_W1302(0x8f, 0);
min = bcdtodec(uc_R1302(0x83)); //读出DS1302中的分
v_W1302(0x8f, 0);
hour = bcdtodec(uc_R1302(0x85)); //读出DS1302中的小时
v_W1302(0x8f, 0);
day = bcdtodec(uc_R1302(0x87)); //读出DS1302中的日
v_W1302(0x8f, 0);
mon = bcdtodec(uc_R1302(0x89)); //读出DS1302中的月
v_W1302(0x8f, 0);
week = bcdtodec(uc_R1302(0x8b)); //读出DS1302中的星期
v_W1302(0x8f, 0);
year = bcdtodec(uc_R1302(0x8d)); //读出DS1302中的年

L1602_char(1, 1,num[year/100] ) ;
L1602_char(1, 2,num[year/1000]);
L1602_char(2, 1, hour / 10 + 48); //48为符号0
L1602_char(2, 2, hour % 10 + 48);
L1602_char(2, 3, ':');
L1602_char(2, 4, min / 10 % 10 + 48);
L1602_char(2, 5, min % 10 + 48);
L1602_char(2, 6, ':');
L1602_char(2, 7, sec / 10 % 10 + 48);
L1602_char(2, 8, sec % 10 + 48);
L1602_char(1, 3, year / 10 +48);
L1602_char(1, 4, year %10+48);
L1602_char(1, 6, mon / 10 % 10 + 48);
L1602_char(1, 7, mon % 10 + 48);
L1602_char(1, 9, day / 10 % 10 + 48);
L1602_char(1, 10, day % 10 + 48);
for(j=0;j<3;j++)
{
L1602_char(1,14+j,d[(week-1)*3+j]);delay(1);
}

}



void displayhanzi(void) //显示中文
{uchar i;
writecommand(0x40); //设置CGRAM地址,写指令
for(i=0;i<8;i++)//数据送入CGRAM地址内
{writedata(a[i]); //年

}
writecommand(0x84); //写需要显示的位置指令位置
writedata(0x00); //把CGRAM的0位的数据送向LCD1602,显示数据存储的数据

writecommand(0x48);//每隔一个汉字+8
for(i=0;i<8;i++)
{writedata(b[i]);} // 月
writecommand(0x87);
writedata(0x01); //把CGRAM的0位的数据送向LCD1602,显示数据存储的数据

writecommand(0x50);
for(i=0;i<8;i++)
{writedata(c[i]);
}
writecommand(0x8a) ;
writedata(0x02);
}



void keyscan(void) //按键
{ uchar count1;
uchar sec1, min1, hour1, day1, mon1, year1,week1,j;
if(key1==0)
{ if(count1==9)
count1=1;
else
count1++;
}


/**********************************秒操作**********************************/
if(count1==1)
{
L1602_char(2,10,'S');
{if(key2==0&key2==lastkey2) //秒+
sec++ ;
if(sec==60)
sec=0;
sec1=sec/10*16+sec%10; //16进制化10
v_W1302(0x80,sec1);
delay(1);
while(!key2)
sec1= bcdtodec(uc_R1302(0x81)); //读出DS1302中的秒
L1602_char(2, 7, sec / 10 % 10 + 48);
L1602_char(2, 8, sec % 10 + 48);
lastkey1=key2;
}
if(key3==0&key2==lastkey2) //秒-
{sec--;
if(sec==-1)
sec=0;
sec1=sec/10*16+sec%10; //16进制化10
v_W1302(0x80,sec1);
delay(1);
while(!key3)
sec1= bcdtodec(uc_R1302(0x81)); //读出DS1302中的秒
L1602_char(2, 7, sec1 / 10 % 10 + 48);
L1602_char(2, 8, sec1 % 10 + 48);
lastkey1=key3;
}
if(key4==0)
count1=8 ;
}
/********************************************************************/

/**********************************分操作**********************************/
if(count1==2)
{L1602_char(2,10,'m');
if(key2==0) //分+
{min++;
if(min==60)
min=0;
min1=min/10*16+min%10; //16进制化10
v_W1302(0x82,min1);
delay(1);
while(!key2)
sec1= bcdtodec(uc_R1302(0x83)); //读出DS1302中的分
L1602_char(2, 4, min1 / 10 % 10 + 48);
L1602_char(2, 5, min1 % 10 + 48);
lastkey2=key2;
}
if(key3==0) //分-
{min--;
if(min==-1)
min=0;
while(!key3)
min1=min/10*16+min%10; //16进制化10
v_W1302(0x82,min1);
delay(1);
while(!key3)
sec1= bcdtodec(uc_R1302(0x83)); //读出DS1302中的分
L1602_char(2, 4, min / 10 % 10 + 48);
L1602_char(2, 5, min % 10 + 48);
lastkey2=key3;}

if(key4==0)
count1=8 ;
}
/********************************************************************/

/**********************************时操作**********************************/
if(count1==3)
{ L1602_char(2,10,'H');
if(key2==0) //时+
{hour++;
if(hour==24)
hour=0;
hour1=hour/10*16+hour%10; //16进制化10
v_W1302(0x84,hour1);
delay(1);
while(!key2)
hour1= bcdtodec(uc_R1302(0x85)); //读出DS1302中的时
L1602_char(2, 4, hour1 / 10 % 10 + 48);
L1602_char(2, 5, hour1% 10 + 48);
lastkey3=key2;
}
if(key3==0)
{hour--;
if(hour==-1)
hour=0;
hour1=hour/10*16+hour%10; //16进制化10
v_W1302(0x84,hour1);
delay(1);
while(!key3)
hour1= bcdtodec(uc_R1302(0x85)); //读出DS1302中的时
L1602_char(2, 4, hour1 / 10 % 10 + 48);
L1602_char(2, 5, hour1 % 10 + 48);
lastkey3=key3;
}
if(key4==0)
count1=8 ;
}
/********************************************************************/

/**********************************星期操作**********************************/
if(count1==4)
{L1602_char(2,10,'W');
if(key2==0) //星期+
{week++;
if(week==8)
week=1;
week1=week/10*16+week%10; //16进制化10
v_W1302(0x8a,week1);
delay(1);
while(!key2)
week1= bcdtodec(uc_R1302(0x8b)); //读出DS1302中的星期
for(j=0;j<3;j++)
{
L1602_char(1,14+j,d[(week-1)*3+j]);delay(1);
}
lastkey4=key2;
}
if(key3==0)//星期-
{week--;
if(week==0)
week=7;
week1=week/10*16+week%10; //16进制化10
v_W1302(0x8a,week1);
delay(1);
while(!key3)
week1= bcdtodec(uc_R1302(0x8b)); //读出DS1302中的时
for(j=0;j<3;j++)
{
L1602_char(1,14+j,d[(week1-1)*3+j]);delay(1);
}
lastkey4=key3;
}
if(key4==0)
count1=8 ;
}
/********************************************************************/

/*********************************日操作***********************************/
if(count1==5)
{ L1602_char(2,10,'D');
if(key2==0) //日+
{ if(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12)
if(day==31)
day=1;
else day++;
if(mon==4||mon==6||mon==9||mon==11)
if(day==30)
day=1;
else day++;
if(year%4==0)
{if(mon==2)
{if(day==29)
day=1;
else day++;}
}
if(year%4!=0)
{if(mon==2)
{if(day==28)
day=1;
else day++; }
}
day1=day/10*16+day%10; //16进制化10
v_W1302(0x86,day1);
delay(1);
while(!key2)
day1= bcdtodec(uc_R1302(0x87)); //读出DS1302中的日
L1602_char(1, 9, day1/ 10 % 10 + 48);
L1602_char(1, 10, day1% 10 + 48);
lastkey5=key2;
}
if(key3==0)
{ if(day==1)
day=1;
else
day--;
day1=day/10*16+day%10; //16进制化10
v_W1302(0x86,day1);
delay(1);
while(!key3)
week1= bcdtodec(uc_R1302(0x87)); //读出DS1302中的日
L1602_char(1, 9, day / 10 % 10 + 48);
L1602_char(1, 10, day % 10 + 48);
lastkey5=key3;
}
if(key4==0)
count1=8 ;
}
/********************************************************************/

/*******************************月操作*************************************/
if(count1==6)
{ L1602_char(2,10,'M');
if(key2==0) //月+
{mon++;
if(mon==13)
mon=1;
mon1=mon/10*16+mon%10; //16进制化10
v_W1302(0x88,mon1);
delay(1);
while(!key2)
mon1= bcdtodec(uc_R1302(0x89)); //读出DS1302中的日
L1602_char(1, 6, mon1/ 10 % 10 + 48);
L1602_char(1, 7, mon1% 10 + 48);
lastkey6=key2;

}
if(key3==0) //月-
{if(mon==1)
mon=1;
else
mon--;
mon1=mon/10*16+mon%10; //16进制化10
v_W1302(0x88,mon1);
delay(1);
while(!key3)
mon1= bcdtodec(uc_R1302(0x89)); //读出DS1302中的日
L1602_char(1, 6, mon1/ 10 % 10 + 48);
L1602_char(1, 7, mon1% 10 + 48);
lastkey6=key3;

}
if(key4==0)
count1=8 ;
}
/********************************************************************/

/**********************************年操作********************************/
if(count1==7)
{ L1602_char(2,10,'Y');
if(key2==0)
{year++;
year1=year/10*16+year%10; //16进制化10
v_W1302(0x8c,year1);
delay(1);
while(!key2)
year1= bcdtodec(uc_R1302(0x8d)); //读出DS1302中的日
L1602_char(1, 3, year1/ 10 % 10 + 48);
L1602_char(1, 4, year1% 10 + 48);
lastkey7=key2;
}
if(key3==0)
{ year--;
if(year==0)
year=79;
year1=year/10*16+year%10; //16进制化10
v_W1302(0x8c,year1);
delay(1);
while(!key3)
year1= bcdtodec(uc_R1302(0x8d)); //读出DS1302中的日
L1602_char(1, 3, year1/ 10 % 10 + 48);
L1602_char(1, 4, year1% 10 + 48);
lastkey7=key3;
}
if(key4==0)
count1=8 ;
}

/********************************************************************/
if(count1==8)
{L1602_char(2,10,' ');
count1=0;
}
while(!key1)
lastkey0=key1;
}







void Main(void)
{
L1602_init();
displayhanzi();
Write_DS1302Init();
while(1)
{
Run_DS1302();
keyscan();
}
}




这是我的程序 中间是1602部分 看看和你的都是不是一样


LCD1602用C语言编程如何显示字符?

void delay(uint z);//延时,1微妙时间有点短

你看看下面我做的程序,在2051+12M晶振通过你可以套用这个程序,不行的话就改长延时
/******************AT89S51使用12M晶振*******************/
//LCD脚接法,根据实际接法定义
#define LCM_D4_RS P3_2//第4脚数据/命令
#define LCM_D5_RW P3_5//第5脚读/写
#define LCM_D6_E P3_7//第6脚使能
#define LCM_D16_BLK P3_0//背光负极
#define LCM_D7_Data P1//第7-14脚数据
//LCD脚接法,根据实际接法定义

#define Busy 0x80 //用于检测LCM状态字中的Busy标识
#define _LCD_BIT_IS 4 //CPU与LCD1602间使用DB7-DB4这4根数据线进行传输

#include //头文件
#include //strlen()函数头文件

void LCMInit(void); //LCM初始化化
void WriteDataLCM(unsigned char WDLCM);//写数据
void WriteCommandLCM(unsigned char WCLCM,int BuysC); //写指令
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); //按指定位置显示一个字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);//按指定位置显示一串字符
void Delay5Ms(void); //5ms延时
unsigned char ReadStatusLCM(void); //读状态

unsigned char code Greetings_Line1[] = {"Welcome Control"};
unsigned char code Greetings_Line2[] = {" ChuLong Make "};
data unsigned char cou = 0; // 定义软计数器,放在程序最前面的寄存器定义部分

void main(void)
{
LCMInit(); //LCM初始化
LCM_D16_BLK= 0;//开背光灯

TMOD = 0x11; // 定时/计数器0,1工作于方式1 16位定时
TH0 = 0x3c; // 预置产生50ms时基信号
TL0 = 0xb0;
EA = 1; // 开总中断
ET0 = 1; // 定时/计数器0允许中断
TR0 = 1; // 开定时/计数器0

DisplayListChar(0, 0, Greetings_Line1);
DisplayListChar(0, 1, Greetings_Line2);

//while(1);
}
//

void LCMInit(void) //LCM初始化
{
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,0);

#if(_LCD_BIT_IS == 8) //CPU与LCD1602间使用DB0-DB8这8根数据线进行传输
WriteCommandLCM(0x38,1); //显示8位模式设置,开始要求每次检测忙信号
#else //CPU与LCD1602间使用DB0-DB4这4根数据线进行传输
WriteCommandLCM(0x28,1); //显示4位模式设置,开始要求每次检测忙信号
#endif

WriteCommandLCM(0x08,1); //关闭显示
WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置
WriteCommandLCM(0x0C,1); // 显示开及光标设置
}

//写数据
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //检测忙

LCM_D4_RS = 1;
LCM_D5_RW = 0;
#if(_LCD_BIT_IS == 8) //CPU与LCD1602间使用DB0-DB8这8根数据线进行传输
{
LCM_D7_Data = WDLCM;
}
#else //CPU与LCD1602间使用DB0-DB4这4根数据线进行传输
{
LCM_D7_Data &= 0x0f; //清高四位
LCM_D7_Data |= WDLCM & 0xf0; //写高四位
LCM_D6_E = 0;
LCM_D6_E = 1;

WDLCM = WDLCM << 4; //低四位移到高四位
LCM_D7_Data &= 0x0f; //清高四位
LCM_D7_Data |= WDLCM & 0xf0; //写低四位
}
#endif

LCM_D6_E = 0;
LCM_D6_E = 1;
}

//写指令
void WriteCommandLCM(unsigned char WCLCM,int BuysC) //BuysC为0时忽略忙检测
{
if(BuysC)
ReadStatusLCM(); //根据需要检测忙

LCM_D4_RS = 0;
LCM_D5_RW = 0;

#if(_LCD_BIT_IS == 8) //CPU与LCD1602间使用DB7-DB4这4根数据线进行传输
{
LCM_D7_Data = WCLCM;
}
#else
{
LCM_D7_Data &= 0x0f; //清高四位
LCM_D7_Data |= WCLCM & 0xf0; //写高四位
LCM_D6_E = 0;
LCM_D6_E = 1;

WCLCM = WCLCM << 4; //低四位移到高四位
LCM_D7_Data &= 0x0f; //清高四位
LCM_D7_Data |= WCLCM & 0xf0; //写低四位
}
#endif

LCM_D6_E = 0;
LCM_D6_E = 1;
}

//读状态
unsigned char ReadStatusLCM(void)
{
LCM_D7_Data = 0xff;
LCM_D4_RS = 0;
LCM_D5_RW = 1;
LCM_D6_E = 1;
while (LCM_D7_Data & Busy); //检测忙信号
return(LCM_D7_Data);
}

//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; //算出指令码
WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
WriteDataLCM(DData);
}

//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
int ListLength;

Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
for(ListLength = 0;ListLength < strlen(DData);ListLength++) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
X++;
}
}
}

//5ms延时
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}

//10s延时
void tiem0(void) interrupt 1
{ // T/C0中断服务程序(产生50ms时基信号)
if(cou < 60)
{ // 计数值到1000(1s) (****时间为倒计时****)
cou = 0; // 软计数器清零


}
cou++; // 软计数器加1
TH0 = 0x3c; // 重置定时常数
TL0 = 0xb0;
}


字符型1602LCD自定义字符地址设置后,字符显示时,地址需要用c语言编程调用吗?还是程序默认调

代码贴出,供大家参考需要设定开始地址和移动方式,而后写入数据地址自动加1,给你一段驱动程序,看你会用么首先是库文件,自己建立一个LCD1602.h文件,用记事本或编译器打开,将代码粘贴进去,该文件放在项目文件夹下#ifndef__LCD1602_H__#define __LCD1602_H__#include#include"timer.h"/*以下为函数开关*///#define LCD1602_CKECKBUSY//#define LCD1602_CLEANSCREEN#define LCD1602_DISPLAYSTR#define LCD1602_DSIPLAYINT/****************/#define lcd_port P0 //LCD1602总线接口sbit lcdrs = P2^3;//寄存器选择,高电平1选择数据寄存器、低电平0选择指令寄存器。sbit lcden = P2^5;//使能端,写操作时,下降沿使能,读操作时,E高电平有效sbit lcdrw = P2^4;//读写选通,高电平读,低电平写。//注意改驱动不支持从LCD读取数据void LCD1602_initialise();//初始化函数,开机后,显示内容之前,请初始化#ifdef LCD1602_CLEANSCREENvoid LCD1602_cleanScreen(bit rewind);//清屏函数(rewind为0),或使光标归位(rewind为1时)#endif#ifdef LCD1602_DISPLAYSTR//显示字符(串)void LCD1602_displayStr(unsigned char row,unsigned char position,unsigned char *dat);#endif#ifdef LCD1602_DSIPLAYINT //显示整型数据(-32767~32767)void LCD1602_displayInt(unsigned char row,unsigned char position,int dat);//一次写入整型数(-32767~32767),position为开始位置#endifvoid LCD1602_setCmd(unsigned char command);//设定子函数 写指令或设定地址void LCD1602_writeData(unsigned char dat);//向LCD1602写入数据,记得先用写指令函数设定地址#ifdef LCD1602_CKECKBUSY bit LCD1602_checkBusy();//判忙函数,忙返回值为1#endif/*****************************************************************//* row显示位置行选择,0为第一行,1为第二行 *//* position显示位置的其实位置,为该行所在位置,值:0~15 *//* dat为显示内容 *//*****************************************************************/#endif以下是驱动源代码,自己建立一个LCD1602.c文件,用记事本或编译器打开,复制粘贴进去:该文件放在项目文件夹下#include"LCD1602.h"void delay(unsigned int ms)//延时大约1ms{unsigned int i;for(;ms>0;ms--)for(i=0;i4;us-=4);}void LCD1602_setCmd(unsigned char command) //设定子函数 写指令{ lcdrs=0; //当lcdrs=0 时,允许写入指令 lcd_port=command; delayMicroseconds(5); lcden=1; delayMicroseconds(5); lcden=0; }void LCD1602_writeData(unsigned char dat) //写数据{ lcdrs=1; //当lcdrs=1 时,允许写入显示 lcd_port=dat; delay(1);lcden=1; //lcden高脉冲将P0口数据读走 delayMicroseconds(5); lcden=0; } #ifdef LCD1602_CLEANSCREENvoid LCD1602_cleanScreen(bit rewind)//清屏或光标归位函数{if(rewind)LCD1602_setCmd(0x02);//光标归位指令elseLCD1602_setCmd(0x01);//清屏指令delay(5);}#endif#ifdef LCD1602_CKECKBUSYbit LCD1602_checkBusy(void)//判忙函数{lcd_port=0xFF;lcdrs=0;lcdrw=1;lcden=0;delayMicroseconds(1);lcden=1;return !(bit)(lcd_port&0x80);}#endifvoid LCD1602_initialise() //初始化函数{lcden=0;lcdrw=0;LCD1602_setCmd(0x38); //指令码:设置16X2显示,5X7点阵,8位数据接口 LCD1602_setCmd(0x0C); //指令码:开显示,不显示光标 LCD1602_setCmd(0x06); //指令码:指针加一,整屏不移动 LCD1602_setCmd(0x01); //显示清屏 delay(10);//稍停顿下,让LCD正确配置好}//*/#ifdef LCD1602_DISPLAYSTRvoid LCD1602_displayStr(unsigned char row,unsigned char position,unsigned char *dat)//一次写入字符串(超出不显示),position为开始位置{LCD1602_setCmd(0x80+0x40*row+position);while(*dat){LCD1602_writeData(*dat++);}}#endif#ifdef LCD1602_DSIPLAYINTvoid LCD1602_displayInt(unsigned char row,unsigned char position,int dat)//一次写入整型数(-32767~32767),position为开始位置{unsigned char str[7];unsigned char i=0;bit flag=0;if(dat==0){str[i++]=0x30;}else {if(dat<0){str[i++]=0x2D;dat=-dat;}if(dat/10000 ||flag){str[i++]=dat/10000+0x30; flag=1;}if(dat/1000%10||flag){str[i++]=dat/1000%10+0x30;flag=1;}if(dat/100%10 ||flag){str[i++]=dat/100%10+0x30; flag=1;}if(dat/10%10 ||flag){str[i++]=dat/10%10+0x30; flag=1;}if(dat%10 ||flag){str[i++]=dat%10+0x30; }}str[i]=0;flag=0;i=0;LCD1602_setCmd(0x80+0x40*row+position);while(str[i]){LCD1602_writeData(str[i++]);}}#endif1、需要修改引脚设置,就到LCD1602.h中修改2、主函数头写上#include“LCD1602.h”,将“LCD1602.c”添加到项目中3、使用的时候先调用LCD1602_initialise();对1602初始化;其中光标移动方式已经设定好了4、根据需要开关函数开关(注释掉定义就是关闭相应函数,取消注释则是打开),调用相关函数。关于函数功能,库文件注释得很详细,请自行查看;提供一段main()函数代码,供参考:#include#include"LCD1602.h"void main(void){ LCD1602_initialise(); LCD1602_displayStr(0,0,"Hello World!"); LCD1602_displayInt(1,0,2015); while(1);}手打不易,望采纳!

上一篇:a8n5x

下一篇:充电器输出电流