lcd1602控制c语言编程讲解Word文档格式.docx
- 文档编号:16259193
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:6
- 大小:18.33KB
lcd1602控制c语言编程讲解Word文档格式.docx
《lcd1602控制c语言编程讲解Word文档格式.docx》由会员分享,可在线阅读,更多相关《lcd1602控制c语言编程讲解Word文档格式.docx(6页珍藏版)》请在冰豆网上搜索。
//字符串用双引号引起来,空格计入字符串的元素/*ucharcodekkk[]="
ffba
ggddmm"
//上句加空格9个元素,该句加两个空格12个元素/**********************************元素个数在循环显示时要使用*****/*********************为循环显示字符串还得定义一个变量**///uchar
n;
/定义变量n
void
delay(inttime)
//延迟函数
{
while(time--);
//延迟时间
}void
writeCommandLcd(unsignedcharcomd)//写入命令
P5OUT&
=~0x10;
//RS清0
(运算后P5=xxx0xxxx,即RS=0其他位状态不变)
=~0x20;
//RW清0
(运算后P5=xx0xxxxx,
即RW=0其他位状态不变)
=~0x08;
//使能E清0
(运算后P5=xxxx0xxx,
即E=0其他位状态不变)
//上面三个语句执行完后P5OUT=xx000xxx,用P5OUT&
=~0x38;
可一次完成。
P2OUT
=
comd;
//送命令到P2OUT准备输出进入1602,等E下降沿来即可进入1602.
P5OUT|=
0x08;
//使能E置1,P5OUT=xxxxxxxx+00001000=xxxx1xxx,E=1.
delay(10);
//使能E清0,这样E从1变0,产生一个下降,写入命令到1602。
}
writeDataLcd(unsignedchardat)//写入命令
P5OUT
|=0x10;
//RS置1
(运算后P5=xxx1xxxx,即RS=1其他位状态不变)
dat;
//送数据到P2OUT准备输出进入1602,等E下降沿来即可进入1602.
voidlcd_init(void)//初始化LCD
writeCommandLcd(0x38);
//显示模式设置为1602,5X7点阵显示。
8位数据接口。
writeCommandLcd(0x08);
//打开显示液晶
writeCommandLcd(0x01);
//清屏,光标回到起点
//writeCommandLcd(0x0C);
//开显示,关光标,即不显示光标。
//writeCommandLcd(0x0E);
//开显示,开光标,有光标但不闪烁。
writeCommandLcd(0x0F);
//开显示,开光标,有光标且光标闪烁。
writeCommandLcd(0x06);
//读写操作时地址自动加1。
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;
P2DIR=0xff;
P5DIR=0xff;
lcd_init();
/********************字符串显示代替单字显示*************************************
for(n=0;
n<
9;
n++)
writeData(ttt[n]);
//从第一行第一位显示(第2行显示需80h+40h)
weitecommandLcd(0x80+0x40);
//第2行显示必须从第2行首地址开始
12;
while
(1);
********************闪烁动态效果可将延迟时间加长*****************************/
while
(1)
writeCommandLcd(0x80);
//从第一行第一位显示(地址是80h)/*其实1行1列地址是00h,但在输入地址是时要保证D7位为1,其余位确定的是实际地址,这样00h=01000000b要保证D7为1,就变成了10000000b,即80h,相当于给实际地址加8,如第2行2列,实际地址为41h=01000000b,高位变1就成了11000000b=c0h*/
writeDataLcd(0x30+0);
//30为0在1602字库的存储地址,依次类推1、2、3....
delay(10);
writeDataLcd(0x30+1);
writeDataLcd(0x30+2);
writeDataLcd(0x30+3);
}液晶显示由状态控制端RS、RW和E控制输入输出,但由于只有DB7到DB0一个字节的I/O连接单片机与1602等液晶,控制指令和显示数据都要通过这一个I/O口进出,所以,程序编写要编写两个函数,一个指令输入函数(即void
writecommandLcd(charunsigned
word)),一个数据输入函数(即voidwritedataLcd(intsigned
dat))两个函数的不同只是RS、RW和E的状态不同。
/*******************************************************************/
2.C51单片机C语言/********************************************************************/#include<
AT89x51.h>
/*****************************************电路连接
P1------DB0~DB7P2.0------RS
P2.1------RW
P2.2------E
*****************************************/
#defineLCD_DB
P1
sbitLCD_RS=P2^0;
sbitLCD_RW=P2^1;
sbitLCD_E=P2^2;
/******定义函数****************/
#defineucharunsignedchar
#defineuintunsignedint
LCD_init(void);
//声明初始化函数
LCD_write_command(ucharcommand);
//写指令函数
LCD_write_data(uchardat);
//写数据函数
void
LCD_disp_char(ucharx,uchary,uchardat);
//在某个屏幕位置上显示一
个字符,X(0-16),y(1-2)
//void
LCD_check_busy(void);
//检查忙函数。
我没用到此函数,因为通过率极
低。
delay_n40us(uintn);
//延时函数
//********************************
//*******初始化函数***************
LCD_init(void)
{
LCD_write_command(0x38);
//设置8位格式,2行,5x7
LCD_write_command(0x0c);
//整体显示,关光标,不闪烁
//LCD_write_command(0x06);
//设定输入方式,增量不移位
//LCD_write_command(0x01);
//清除屏幕显示
delay_n40us(100);
//实践证明,我的LCD1602上,用for循环200次就能可靠
完成清屏指令。
}
//********写指令函数***********设置先向1602写入的数据为地址*
LCD_write_command(uchardat)
LCD_DB=dat;
LCD_RS=0;
//指令
LCD_RW=0;
//写入
LCD_E=1;
//允许
LCD_E=0;
//产生下降沿
delay_n40us
(1);
//实践证明,我的LCD1602上,用for循环1次就能完成普通
写指令。
//*******************************
//********再写数据函数*****向1602中写入数据********
LCD_write_data(uchardat)
LCD_RS=1;
//数据
//*******显示一个字符函数*********
voidLCD_disp_char(ucharx,uchary,uchardat)
ucharaddress;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
LCD_write_data(dat);
/*******检查忙函数*************
voidLCD_check_busy()
//实践证明,在我的LCD1602上,检查忙指令通
过率极低,以至于不能正常使用LCD。
因此我没有再用检查忙函数。
而使
do//用了延时的方法,延时还是非常好用的。
我试了一下,用//
{LCD_E=0;
//for循环作延时,普通指令只要1次循就可完成。
清屏指令
//要用200次循环便能完成。
LCD_RW=1;
LCD_DB=0xff;
while(LCD_DB^7==1);
}
******************************/
//********延时函数***************
voiddelay_n40us(uintn)
{uinti;
ucharj;
for(i=n;
i>
0;
i--)
for(j=0;
j<
2;
j++);
//在这个延时循环函数中我只做了
2次循环,
}//实践证明我的LCD1602上普
通的指令只需1次循环就能可靠完成。
//*********主函数*****************
voidmain(void)
LCD_init();
LCD_disp_char(0,1,"
A"
);
while
(1);
}/**************************************************************************
3
灯光闪烁程序**************************************************************************/#include<
msp430g2553.h>
/*************************************msp430G2553控制与P1.0和P1.6连接的两个LED等闪烁闪烁效果可以用数组形式设定,循环将数组的值赋给输出P1.******************************************/char
dis[12]={0x41,0x00,0x41,0x00,0x01,0x00,0x40,0x00,0x40,0x00,0x01,0x00};
//定义有12的元素的数组dis[12],可以存储12种显示状态intn,t;
voiddelay()/*设置自定义函数,如果在主程序前可直接设置,在主程序后设置则要先声明主程序前声明,然后在主程序后设置*/{while(t--);
}voidmain(void){
WDTCTL=WDTPW+WDTHOLD;
//停止看门狗
P1DIR|=(BIT0+BIT6);
//设置P1.0和P1.6为输出,其余状态不变while
(1)
P1OUT=dis[n];
delay(100);
}}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- lcd1602 控制 语言 编程 讲解