msp430单片机驱动LCD1602C语言程序
LCD1602液晶显示C程序
1、关于1602液晶的电气参数一般市场上的1602液晶使用的驱动器为HD44780U或HD44780S,市场上大部分液晶用的是后者。
HD44780S的供电电压为5V±10%,而HD44780U的供电电压为2.7V~5.5V。
也就是说,绝大部分1602液晶只能工作在5V电压下,其供电电压必须为5V。
经过试验发现,1602液晶的供电虽然必须为5V,但其控制总线和数据总线可以用3.3V电平(因为对于TTL电平,一般大于2.5V以上都算高电平,不过最可靠的是大于3.6V),只不过在3.3V电平下,数据的通信速度会大大降低,这一点需要在写驱动时注意。
需要时,可以将MCU的IO配置为漏极开路方式,用上拉电阻拉到5V电平;实在不能配置为漏极开路方式时,请查阅MCU的电气参数,在允许的条件下,直接使用电阻弱上拉也可以。
2、硬件连接1602液晶可以使用4位或8位通信模式,通信可以是双向的或单向的,双向通信主要是为了读取LCD忙标志和AC地址寄存器和DDRAM和CGRAM中的值,一般用处不大,因为1602不支持点阵绘图功能。
在连接时,注意4位通信方式下,LCD只使用DB7~DB4,一般情况下会使用MCU 某端口的高4位或低4位与之连接,注意写驱动时在必要的情况下对端口的其它几位要保护,防止破坏其数据;当然如果没有使用其它4位时则不必要保护(奇怪,不使用其它4位干嘛用4位通信方式嘛?)。
还要注意的是,如果需要双向通信,则必须选择既能做输入又能做输出的IO口,特别是对于RS、RW和E这三条控制线,若能选择支持位寻址的IO口则可以方便编程。
3、底层驱动问题通用1602液晶的时序如图:(1)、写时序(2)、读时序总的说来,按照这个时序图来编写驱动程序是不会出什么问题的,只是要深刻理解时序图中各参数的涵义。
编程中要特别关注E这根控制线。
写操作的时序应该是:①、RS=0(写指令寄存器)或RS=1(写数据寄存器);②、RW=0(写操作);③、将数据写到数据线上;④、E=1;⑤、E=0 。
msp430单片机1602显示
/****************POWSOS__430************************ 程序功能:静态显示各种字符----------------------------------------------------测试说明:观察液晶显示****************************************************/ #include <msp430.h>#include "Cry1602.h"#include "Cry1602.c"uchar shuzi[] = {"0123456789"};uchar zimu1[] = {"abcdefghigklmnopqrstuvwxyz"};uchar zimu2[] = {"ABCDEFGHIGKLMNOPQRSTUVWXYZ"};uchar *fuhao = "~`!@#$%^&*()_+-=/|,.、;'<>?:""";uchar *jieshu = "This is the end!";/***********************主函数************************/ void main( void ){/*下面六行程序关闭所有的IO口*/P1DIR = 0XFF;P1OUT = 0XFF;P2DIR = 0XFF;P2OUT = 0XFF;P3DIR = 0XFF;P3OUT = 0XFF;P4DIR = 0XFF;P4OUT = 0XFF;P5DIR = 0XFF;P5OUT = 0XFF;P6DIR = 0XFF;P6OUT = 0XFF;uchar i;WDTCTL = WDT_ADLY_1000; //间隔定时器,定时1000ms P6DIR |= BIT2;P6OUT |= BIT2; //关闭电平转换LcdReset();DispNChar(3,0,10,shuzi);//延时2sfor(i = 0; i < 3; i++){IFG1 &= ~WDTIFG;while(!(IFG1 & WDTIFG));IFG1 &= ~WDTIFG;}LcdWriteCommand(0x01, 1); //清除显示DispNChar(0,0,26,zimu1);//延时2sfor(i = 0; i < 3; i++){IFG1 &= ~WDTIFG;while(!(IFG1 & WDTIFG));IFG1 &= ~WDTIFG;}LcdWriteCommand(0x01, 1); //清除显示DispNChar(0,0,26,zimu2);//延时2sfor(i = 0; i < 3; i++){IFG1 &= ~WDTIFG;while(!(IFG1 & WDTIFG));IFG1 &= ~WDTIFG;}LcdWriteCommand(0x01, 1); //清除显示 DispStr(0,0,fuhao);//延时2sfor(i = 0; i < 3; i++){IFG1 &= ~WDTIFG;while(!(IFG1 & WDTIFG));IFG1 &= ~WDTIFG;}LcdWriteCommand(0x01, 1); //清除显示 DispStr(0,0,jieshu);while(1);}//1602#include <msp430x14x.h>#include "cry1602.h"typedef unsigned char uchar;typedef unsigned int uint;/**************宏定义***************/#define DataDir P2DIR#define DataPort P2OUT#define Busy 0x80#define CtrlDir P6DIR#define CLR_RS P6OUT&=~BIT3; //RS = P3.0#define SET_RS P6OUT|=BIT3;#define CLR_RW P6OUT&=~BIT4; //RW = P3.1#define SET_RW P6OUT|=BIT4;#define CLR_EN P6OUT&=~BIT5; //EN = P3.2#define SET_EN P6OUT|=BIT5;/***********************************************函数名称:DispStr功能:让液晶从某个位置起连续显示一个字符串参数:x--位置的列坐标y--位置的行坐标ptr--指向字符串存放位置的指针返回值:无***********************************************/ void DispStr(uchar x,uchar y,uchar *ptr){uchar *temp;uchar i,n = 0;temp = ptr;while(*ptr++ != '\0') n++; //计算字符串有效字符的个数for (i=0;i<n;i++){Disp1Char(x++,y,temp[i]);if (x == 0x0f){x = 0;y ^= 1;}}}/******************************************* 函数名称:DispNchar功能:让液晶从某个位置起连续显示N个字符参数:x--位置的列坐标y--位置的行坐标n--字符个数ptr--指向字符存放位置的指针返回值:无********************************************/ void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) {uchar i;for (i=0;i<n;i++){Disp1Char(x++,y,ptr[i]);if (x == 0x0f){x = 0;y ^= 1;}}}/*******************************************函数名称:LocateXY功能:向液晶输入显示字符位置的坐标信息参数:x--位置的列坐标y--位置的行坐标返回值:无********************************************/ void LocateXY(uchar x,uchar y){uchar temp;temp = x&0x0f;y &= 0x01;if(y) temp |= 0x40; //如果在第2行temp |= 0x80;LcdWriteCommand(temp,1);}/******************************************* 函数名称:Disp1Char功能:在某个位置显示一个字符参数:x--位置的列坐标y--位置的行坐标data--显示的字符数据返回值:无********************************************/ void Disp1Char(uchar x,uchar y,uchar data){LocateXY( x, y );LcdWriteData( data );}/*******************************************函数名称:LcdReset功能:对1602液晶模块进行复位操作参数:无返回值:无********************************************/void LcdReset(void){CtrlDir |= 0x38; //控制线端口设为输出状态DataDir = 0xFF; //数据端口设为输出状态LcdWriteCommand(0x38, 0); //规定的复位操作Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 1); //显示模式设置LcdWriteCommand(0x08, 1); //显示关闭LcdWriteCommand(0x01, 1); //显示清屏LcdWriteCommand(0x06, 1); //写字符时整体不移动LcdWriteCommand(0x0c, 1); //显示开,不开游标,不闪烁}/******************************************* 函数名称:LcdWriteCommand功能:向液晶模块写入命令参数:cmd--命令,chk--是否判忙的标志,1:判忙,0:不判返回值:无********************************************/ void LcdWriteCommand(uchar cmd,uchar chk){if (chk) WaitForEnable(); // 检测忙信号?CLR_RS;CLR_RW;_NOP();DataPort = cmd; //将命令字写入数据端口 _NOP();SET_EN; //产生使能脉冲信号_NOP();_NOP();CLR_EN;}/******************************************* 函数名称:LcdWriteData功能:向液晶显示的当前地址写入显示数据参数:data--显示字符数据返回值:无********************************************/ void LcdWriteData( uchar data ){WaitForEnable(); //等待液晶不忙SET_RS;CLR_RW;_NOP();DataPort = data; //将显示数据写入数据端口_NOP();SET_EN; //产生使能脉冲信号_NOP();_NOP();CLR_EN;}/******************************************* 函数名称:WaitForEnable功能:等待1602液晶完成内部操作参数:无返回值:无********************************************/ void WaitForEnable(void){P2DIR &= 0x00; //将P4口切换为输入状态CLR_RS;SET_RW;_NOP();SET_EN;_NOP();_NOP();while((P2IN & Busy)!=0); //检测忙标志CLR_EN;P2DIR |= 0xFF; //将P4口切换为输出状态}/******************************************* 函数名称:Delay5ms功能:延时约5ms参数:无返回值:无********************************************/ void Delay5ms(void){uint i=40000;while (i != 0){i--;}}。
ms430DA程序 键盘输入 1602显示程序
#ifndef __1602_h__#define __1602_h__#include "main.h"void Delay_5ms();void Check_Busy();void Write_Cmd(uchar cmd);void Write_Dat(uchar dat);extern void Init_LcdPort();extern void Init_Lcd();extern void Print_String(uchar *str,uchar addr);#endif/**************************************************************************** 文件名:adc12.c编写者:czhang描述:ADC12模块程序。
用于14xx系列。
MCLK:DCO ACLK:32.768kHz版本:2005-4 V1.0*****************************************************************************/ #include "adc12.h"#define adc_rate0 0.6103515625 //定义ADC转换的倍率#define adc_rate1 6.103515625extern uchar start_dac;extern uint adc_temp;uint adc_value=0;unsigned char Wait=0; //等待转换结束的标志位0:没有结束;1:结束unsigned int AdMem[16]; //转换结果缓冲区#define AD_CI 10unsigned char AdCi=AD_CI; //单通道或者序列多次转换的转换次数#define DUO_CI 0 //0:单通道或者序列单次转换1:单通道或者序列多次转换/**************************************************************************** 初始化****************************************************************************/ void Adc12Init(){ADC12CTL0 &= ~ENC; //使AD模块处于初始状态ADC12CTL0 = MSC+REFON+REF2_5V+SHT0_15+SHT1_15; //使用内部2.5V参考电压,使用采样保持器。
lcd1602程序
temp_data=-temp_data;
*s='-';
}
else*s=' ';
/*if(temp_data<0.1)temp_data*=10000;
elseif(temp_data<0.1)temp_data*=10000;
elseif(temp_data<1)temp_data*=1000;
{
if(y==0)
{
a1602_write_com(0x80+x);
}
else
{
a1602_write_com(0xc0+x);
}
a1602_write_dat(dat);
}
voidlcd_printf(unsigned char *s,floattemp_data)
{
intdata;
if(temp_data<0)
{
if(y==0)
{
a1602_write_com(0x80+x);
}
else
{
a1602_write_com(0xc0+x);
}
while(*s)
{
a1602_write_dat(*s);
//delay_nms(500);//实现延时输入哦
s++;
}
}
//单个字符输入实现延时输入
voidlcd_write_char(unsigned charx,unsignedchary,unsignedchardat)
{
PORTC&=~RW;//选择为写
PORTC&=~RS;//RS LOW写指令
基于msp430g2553的1602四线驱动C源码
/*--------------------------------------------------------------*/基于msp430G2553de LCD1602四线驱动由于G2系列的IO口过于少,所以我们采用了四线驱动LCD1602的方法程序附后①液晶显示原理液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
②液晶显示器的分类液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。
除了黑白显示外,液晶显示器还有多灰度有彩色显示等。
如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。
③液晶显示器各种图形的显示原理:线段的显示点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。
例如屏的第一行的亮暗由RAM区的000H——00FH的16字节的内容决定,当(000H)=FFH 时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,……(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。
这就是LCD显示的基本原理。
字符的显示用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。
1602 四线制驱动程序
/************************************************************************** 1602 四线制驱动程序--基于MSP430F149File Name: LCD1602x4_mps.hAuthor: HuNB***************************************************************************/#include<msp430x14x.h>#define set(x) P6OUT |=x#define clr(x) P6OUT &=~x#define rs BIT2 //RA1#define rw BIT3 //RA2#define e BIT4 //RA3/*--------------------------------------------------------------------------------------------------函数说明--------------------------------------------------------------------------------------------------*/void init(); //申明I/O口初始化函数void delay_nus(unsigned int n); //N nS延时函数void delay_nms(unsigned int n); //N mS延时函数void LCD_init(void); //LCD初始化函数void LCD_en_write(void); //LCD写入使能函数void LCD_write_command(unsigned char command) ; //LCD写入命令函数void LCD_write_data(unsigned char Recdata); //LCD写入数据函数void LCD_set_xy (unsigned char x, unsigned char y); //LCD设置显示位置函数void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata); //LCD显示字符函数int LCD_PutStr(unsigned char *DData,int pos); //LCD显示字符串函数//int LCD_PutNum(unsigned long num,int XS,int pos);//LCD显示数字函数int p=0;//---------------------------------------//---------------------------------------//I/O口初始化函数void init(){//ADCON1=0X07; //设置A口为普通I/O口//TRISA=0X00; //设置A口为输出//TRISD=0X00; //设置D口为输出P4DIR=0xff;P6DIR=0x1c; //设置A口为输出WDTCTL = WDTPW + WDTHOLD; //杀狗}void delay_1us(void) //1us延时函数{_NOP();}void delay_nus(unsigned int n) //N us延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void) //1ms延时函数{unsigned int i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n) //N ms延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1ms();}void LCD_en_write(void) //液晶使能{set(e);delay_nus(1);clr(e);}void LCD_write_command(unsigned char command) //写指令{unsigned char temp;temp=command>>4; //高四位移到低四位delay_nus(16);clr(rs); //RS=0 选择指令地址clr(rw); //RW=0 写操作P4OUT&=0Xf0; //清低四位P4OUT|=temp&0x0f; //写高四位//command&0x0f;LCD_en_write();P4OUT&=0xf0; //清高四位P4OUT|=command&0x0f; //写低四位LCD_en_write();set(rw); //RW=1 结束写操作}void LCD_write_data(unsigned char Recdata) //写数据{ unsigned char temp;temp=Recdata>>4; //高四位移到低四位delay_nus(16);set(rs); //RS=1 选择数据地址clr(rw); //RW=0 写操作P4OUT&=0Xf0; //清高四位P4OUT|=temp&0x0f; //Recdata&0xf0写高四位LCD_en_write();// Recdata=Recdata<<4; //低四位移到高四位P4OUT&=0Xf0; //清高四位P4OUT|=Recdata&0x0f; //写低四位LCD_en_write();set(rw); //RW=1 结束写操作}void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数{unsigned char address;if (y == 0) address = 0x80 + x;else address = 0xc0 + x;LCD_write_command(address);}void LCD_init(void) //液晶初始化{LCD_write_command(0x28);delay_nus(40);LCD_write_command(0x28);delay_nus(40);LCD_write_command(0x28);delay_nus(40);LCD_en_write();delay_nus(40);LCD_write_command(0x28); //4位显示LCD_write_command(0x0c); //显示开LCD_write_command(0x01); //清屏delay_nms(5);}void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata) //列x=0~15,行y=0,1{LCD_set_xy(X, Y); //写地址LCD_write_data(Recdata);}int LCD_PutStr(unsigned char *DData,int pos){unsigned char i;if(pos==-1){LCD_write_command(0x01); //清屏delay_nms(2);pos=0;}while((*DData)!='\0'){switch(*DData){case '\n': //如果是\n,则换行{if(pos<17){for(i=pos;i<16;i++)LCD_write_char(i%16, i/16, ' ');pos=16;}else{for(i=pos;i<32;i++) LCD_write_char(i%16, i/16, ' ');pos=32;}break;}case '\b': //如果是\b,则退格{if(pos>0) pos--;LCD_write_char(pos%16, pos/16, ' ');break;}default:{if((*DData)<0x20){*DData=' ';}LCD_write_char(pos%16, pos/16,*DData);pos++;break;}}DData++;}return(pos);}/*----------------------------以下函数用于输出数字---------------------int LCD_PutNum(unsigned long num,int XS,int pos){ //从右边数,保留几位小数unsigned long tmp=0;unsigned char numbits=0;if(pos==-1){LCD_write_command(0x01);delay_nms(2);pos=0;}if(num==0){LCD_write_char(pos%16, pos/16, '0');pos++;}else{if(num<0){LCD_write_char(pos%16, pos/16, '-');num*=(-1);pos++;}while(num){tmp=tmp*10+(num%10);num=num/10;numbits++;}while(tmp){LCD_write_char(pos%16, pos/16, (tmp%10)+48);tmp=tmp/10;pos++;numbits--;if(numbits==XS) pos=LCD_PutStr(".",pos); //显示小数点 }while(numbits--){LCD_write_char(pos%16, pos/16, '0');pos++;}}return(pos);}**/。
LCD1602控制C语言编程讲解
LCD1602之msp430单片机和C51单片机C语言/**************************************************************************/1.msp430单片机C语言/*************************************************************************/#include"msp430f6638.h"/*******************************************P5.3----E P57 P56 P55 P54 P53 P52 P51 P50P5.4----RSP5.5----RW P57 P56 RW RS E P52 P51 P50P2OUT---wdata********************************************/#define uchar unsigned char;#define uint unsigned int;//*********显示字符串可将字符串放入数组,例如显示ancd efdg******//**定义一个数组**//**uchar code ttt[]="ancd efdg";//字符串用双引号引起来,空格计入字符串的元素/*uchar code kkk[]="ffba ggddmm";//上句加空格9个元素,该句加两个空格12个元素/**********************************元素个数在循环显示时要使用*****/*********************为循环显示字符串还得定义一个变量**/// uchar n;/定义变量nvoid delay(int time) //延迟函数{while(time--); //延迟时间}void writeCommandLcd(unsigned char comd)// 写入命令{P5OUT &= ~0x10; //RS清0 (运算后P5=xxx0 xxxx,即RS=0其他位状态不变) P5OUT &= ~0x20; //RW清0 (运算后P5=xx0x xxxx, 即RW=0其他位状态不变) P5OUT &= ~0x08; //使能E清0 (运算后P5=xxxx 0xxx, 即E=0其他位状态不变)//上面三个语句执行完后P5OUT=xx000xxx,用P5OUT&=~0x38;可一次完成。
1602程序,430版本
加油,电赛的同学们。
/***************************************************** msp430f449驱动JXD1602AP1.0----RSP1.1----RWP1.2----ENP2-----DATA可在“定义1602引脚”处更改引脚******************************************************/ #include <msp430x44x.h>//定义1602引脚#define LCMDATADIR P2DIR#define LCMDATAOUT P2OUT#define LCMCTLDIR P1DIR#define LCMCTLOUT P1OUT#define LCMCTL_RS_H LCMCTLOUT|=BIT0#define LCMCTL_RS_L LCMCTLOUT&=~BIT0#define LCMCTL_RW_H LCMCTLOUT|=BIT1#define LCMCTL_RW_L LCMCTLOUT&=~BIT1#define LCMCTL_EN_H LCMCTLOUT|=BIT2#define LCMCTL_EN_L LCMCTLOUT&=~BIT2//延时void delay_ms(int delayms){int delayi;while(delayms--){for(delayi=0;delayi<250;delayi++){_NOP();_NOP();_NOP();_NOP();}}}//写数据(一个字节)void lcmwrite_data(char lcmdata){LCMCTL_RS_H;LCMCTL_RW_L;LCMDATAOUT=lcmdata;_NOP();_NOP();_NOP();_NOP();LCMCTL_EN_H;_NOP();_NOP();_NOP();_NOP();LCMCTL_EN_L;delay_ms(1);}//写命令/************************指令说明***************************0011 1000--16*2显示,5*7点阵,8位数据接口(0x38)0000 1dcb--d=1:开显示;c=1:显示光标;b=1:光标闪烁0000 01ns--n=1:当读或写一个字符后地址指针加一,且光标加一;n=0:当读或写一个字符后地址指针减一,且光标减一s=1:当写一个字符,屏幕左移(n=1)或右移(n=0)一个字符。
LCD1602 C语言驱动程序
LCD1602 C语言驱动程序//lcd1602 drive program//for 51 mcu//designed by zhaoliang//2005-6-14 20:16#i nclude <reg51.hJ>/********************************************************************/ //lcd part#define LINE1 0#define LINE2 1#define LINE1_HEAD 0x80#define LINE2_HEAD 0xC0#define LCD_DELAY_TIME 40#define DA TA_MODE 0x38#define OPEN_SCREEN 0x0C#define DISPLAY_ADDRESS 0x80#define CLEARSCREEN LCD_en_command(0x01)//common part#define HIGH 1#define LOW 0#define TRUE 1#define FALSE 0#define ZERO 0#define MSB 0x80#define LSB 0x01/*******************************************************************/ //change this part at different board#define LCDIO P2sbit LCD1602_RS=P0^7; //data command select 1 data 0 command pin 4 sbit LCD1602_RW=P0^6; //read write select 1 read 0 write pin 5sbit LCD1602_EN=P0^5; //LCD enable signal pin 6/********************************************************************/ void LCD_delay(void);//lcd delay functionvoid LCD_en_command(unsigned char command);//write command functionvoid LCD_en_dat(unsigned char temp);//write data functionvoid LCD_set_xy( unsigned char x, unsigned char y );//set display addressfunctionvoid LCD_write_char( unsigned x,unsigned char y,unsigned char dat);//writelcd a character functionvoid LCD_write_string(unsigned char X,unsigned char Y,unsigned char*s);//write lcd string functionvoid LCD_init(void);//lcd initize function/********************************************************************/ void delay_nms(unsigned int n);//delay function/********************************************************************/ void main(void){LCD_init();while(TRUE ){CLEARSCREEN;delay_nms(2);LCD_write_string(0,LINE1," LCD TEST ");LCD_write_string(0,LINE2," SUCCESSFUL ");delay_nms(200);CLEARSCREEN;delay_nms(2);LCD_write_string(0,LINE1," lcd test ");LCD_write_string(0,LINE2," successful ");delay_nms(200);}}/********************************************************************/ /******************** LCD PART *************************************/ void LCD_delay(void){unsigned char i;for(i=LCD_DELAY_TIME;i>ZERO;i--)//be sure lcd reset;}/********************************************************************/ void LCD_en_command(unsigned char command){LCDIO=command;LCD1602_RS=LOW;LCD1602_RW=LOW;LCD1602_EN=LOW;LCD_delay();LCD1602_EN=HIGH;}/********************************************************************/ void LCD_en_dat(unsigned char dat){LCDIO=dat;LCD1602_RS=HIGH;LCD1602_RW=LOW;LCD1602_EN=LOW;LCD_delay();LCD1602_EN=HIGH;}/********************************************************************/ void LCD_set_xy( unsigned char x, unsigned char y ){unsigned char address;if (y == LINE1)address = LINE1_HEAD + x;elseaddress = LINE2_HEAD + x;LCD_en_command(address);}/********************************************************************/ void LCD_write_char( unsigned x,unsigned char y,unsigned char dat){LCD_set_xy( x, y );LCD_en_dat(dat);}/********************************************************************/ void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s){LCD_set_xy( X, Y ); //set addresswhile (*s) // write character{LCDIO=*s;LCD_en_dat(*s);s ++;}}/********************************************************************/ void LCD_init(void){CLEARSCREEN;//clear screenLCD_en_command(DA TA_MODE);//set 8 bit data transmission modeLCD_en_command(OPEN_SCREEN);//open display (enable lcd display)LCD_en_command(DISPLA Y_ADDRESS);//set lcd first display address CLEARSCREEN;//clear screen}/********************************************************************/ /*********************** OTHER PART *********************************/ void delay_nms(unsigned int n){unsigned int i=0,j=0;for (i=n;i>0;i--)for (j=0;j<1140;j++);}/********************************************************************/。
液晶1602 C语言驱动程序
delaytime(10);
}
}
//清屏
void HC1602fullclear()
{
HC1602WriteCmd(0x01);
delaytime(10);
}
/*--------------------------------------------------------------------
{
uint i;
while(n--)
for(i=0;i<200;i++);
}
uint HC1602busy()
{
uchar i;
SysCtlPeripheralEnable(GPIO_PORTA_BASE );
GPIOPinTypeGPIOInput(GPIO_PORTA_BASE , 0xff);
LCD_ESysCtlPeripheralEnable(GPIO_PORTA_BASE );
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE , 0xff);
return busyflag;
}
void HC1602WriteCmd(uchar uldata) //写命令
函数功能: 在1602液晶显示屏上显示一连串的字符串
输入说明: startline:显示起始行 startrow :显示的起始列
uldata:要显示的字符
返回 值 :
说 明:
--------------------------------------------------------------------*/
LCD1602程序
/*lcd1602.c*/#include <string.h>#include <iom16v.h>#include <macros.h>#include "LCD1602.h"#include "delay.h"//LCD端口初始化void LCDPort_Init(void){LCD_BUS = 0X00;LCD_BUS_Direction_REG =0XFF; //LCD数据端口设置为输出LCD_ControlPort_CLR; //RW RW EN低电平LCD_ControlPort_SET; //RS RW EN脚均设置为输出}//LCD初始化void LCD_Init(void){delay_ms(400);Write_Com(0x01);//清屏delay_ms(5);Write_Com(0x38);//显示模式设置16*2,5*7点阵,8位数据接口delay_ms(5);Write_Com(0x38);//显示模式设置16*2,5*7点阵,8位数据接口delay_ms(5);Write_Com(0x38);//显示模式设置16*2,5*7点阵,8位数据接口delay_ms(5);Write_Com(0x06);//光标设置,读或写一个字符后,地址指针加1,光标加1,整屏不移动delay_ms(5);//Write_Com(0x0f);//显示开关控制,开显示,光标显示,光标闪烁Write_Com(0x0c);//显示开关控制,开显示,光标不显示,光标不闪烁delay_ms(5);}//LCD写指令void Write_Com(unsigned char LCD_Com){// Check_Busy();RS_CLR; //RS=0,写指令RW_CLR; //RW=0,写命令EN_SET; //E=1,写操作LCD_BUS=LCD_Com; //数据送往数据端口?delay_ms(1); //这个延时非常重要,结合时序图来理解,可以跟送数据顺序调换EN_CLR;// E=0,下角delay_ms(1);}//LCD写字节数据void Write_Data_Byte(unsigned char LCD_Data){// Check_Busy();RS_SET; //RS=1,数据寄存器RW_CLR;//RW=0,写入EN_SET; //写操作LCD_BUS=LCD_Data; //数据送数据端口delay_ms(1); //这个延时非常重要EN_CLR; //E=0,下降沿送数据delay_ms(1);}//指定当前写字符的位置void Write_Place_xy(unsigned char x,unsigned char y){unsigned char address;if(y==0) //行位置{address=0x80+x; //列位置}else{address=0xc0+x;}Write_Com(address); //写地址}//在指定的(x,y)位置写入字符数据void Write_Data_Char(unsigned char x,unsigned char y,unsigned char Data){Write_Place_xy(x,y);delay_ms(1);Write_Data_Byte(Data);}//在指定的位置写字符串void Write_Data_String(unsigned char x,unsigned char y,unsigned char *data){unsigned char i;unsigned char Length;Write_Place_xy(x,y); //写地址delay_ms(1);Length=strlen(data);//调用字符串函数算出字符的长度,并赋值给Lengthfor(i=0;i<Length;i++) //X坐标应小于0xF{Write_Data_Byte(*data); //显示单个字符data++;}//也可以用下面这个算法来显示字符串/* while(*data){Write_Data_Byte(*data);//写字符data++; //地址指针加1}*/}//读写检测函数,每次对液晶操作前都要进行读写检测void Check_Busy(void){LCD_BUS_Direction_REG = 0X00; //PB口为输入口,准备读取数据RS_CLR; //RS=0,指令寄存器RW_SET; //读操作EN_SET; //使能(读操作都为高电平,写操作下降沿有效)delay_ms(5);while(0x80&LCD_BUS_READ_DA TA) //读入PB7口,为高电平则忙,执行E=0;EN_CLR;LCD_BUS_Direction_REG = 0XFF; //直到PB7口(BF标志位)为0,PB口置为输出口,准备向端口发送数据}/*显示屏清空显示*/void LCD_c lear(void){Write_Com(0x01);delay_ms(5);}。
lcd1602 C语言驱动
/*LCD1602驱动程序*//*程序用法:1、按行显示:display(行号,数据指针)2、定位显示:displayUser(行号,列号,字符/字符串)3、动态显示:Ddisplay(行号、列号、字符/字符串)4、闪烁显示:Fldisplay(行号、列号、字符/字符串)*//*声明代码(放工程中需要包含的自定义头文件中):void delay(unsigned char n);void init();void display(unsigned char a,unsigned char table[]);void write_date(uchar);void write_command(uchar);void displayUser(unsigned char hang,unsigned lie,unsigned char table[]); void Ddisplay(unsigned char hang,unsigned lie,unsigned char table[]); void Fldisplay(unsigned char hang,unsigned lie,unsigned char table[]); */#include <reg51.h>#define uchar unsigned charsbit rs=P2^4;sbit rw=P2^5;sbit e=P2^6;uchar busyc,line;void delay(uchar n){uchar x,y;for(x=n;x>0;x--)for(y=110;y>0;y--);}void busy(uchar busyc){rs=0;rw=1;e=1;delay(1);busyc=P0;e=0;}void write_command(uchar command) {busy(busyc);while(busyc); //判断LCD 是否冗忙rs=0;rw=0;e=1;P0=command;delay(10);e=0;}void write_date(uchar date){busy(busyc);while(busyc); //判断LCD 是否冗忙rs=1;rw=0;e=1;P0=date;delay(10);e=0;}void init(){e=0;write_command(0x38);delay(15);write_command(0x0c);write_command(0x06);write_command(0x01);}void display(unsigned int a,unsigned char *table){uchar i;if(a==1){write_command(0x80); //设置显示位置(第一行开头)for(i=0;i<16;i++)write_date(*(table+i)); //显示字符}if(a==2){write_command(0xc0); //设置显示位置(第二行开头)for(i=0;i<16;i++)write_date(*(table+i)); //显示字符}}void displayUser(unsigned char hang,unsigned lie,unsigned char table[])和列号//定位显示,定位行号{unsigned char add,i;if(hang==1){add=0x80+lie-1;}if(hang==2){add=0xc0+lie-1;}write_command(add);for(i=0;i<(add%15);i++)write_date(table[i]); //显示字符}void Ddisplay(unsigned char hang,unsigned lie,unsigned char table[]) //动态、定位显示,定位行号和列号{unsigned char add,i,m;if(hang==1){add=0x80+lie-1;}if(hang==2){add=0xc0+lie-1;}write_command(add);for(i=0;i<(add%15);i++){write_date(table[i]); //显示字符for(m=0;m<4;m++)delay(250);}}void Fldisplay(unsigned char hang,unsigned lie,unsigned char table[])//闪烁、定位显示,定位行号和列号{unsigned char add,i;if(hang==1){add=0x80+lie-1;}if(hang==2){add=0xc0+lie-1;}write_command(add);while(1){for(i=0;i<(add%15);i++){write_date(table[i]); //显示字符}delay(250);delay(250);delay(250);write_command(0x01); delay(250);delay(250);delay(250);}}。
LCD1602编程
主程序:#include<1602.h>#include <string.h>void main(){Lcd_Int(); //1602初始化while(1){hanying_show();}}LCD1602测试程序源代码:#include<intrins.h> //包含_nop_()函数定义的头文件#include<1602.h>unsigned char code string1[ ]= {"XUE HAO"}; //第一行显示的字符unsigned char code string2[ ]= {"0813********"}; //第二行显示的字符void Lcd_delay1ms() // 函数功能:延时1ms//注:不同单片机不同晶振需要对此函数进行修改{ unsigned char i,j;for(i=0;i<90;i++)for(j=0;j<33;j++);}void Lcd_delay(unsigned int n) // 函数功能:延时若干毫秒,入口参数:n{ unsigned int i;for(i=0;i<n;i++)Lcd_delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。
result=1,忙碌;result=0,不忙***************************************************/bit Lcd_BusyTest(void){bit result;RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1; //E=1,才允许读写_nop_(); //空操作_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间result=BF; //将忙碌标志电平赋给resultE=0;return result;}/*****************************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate***************************************************/void Lcd_WriteCom (unsigned char dictate){ while(Lcd_BusyTest()==1); //如果忙就等待RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0;E=0; //E置低电平(写指令时就是让E从0到1发生正跳变,所以应先置"0"_nop_();_nop_(); //空操作两个机器周期,给硬件反应时间Lcd_Data=dictate; //将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:指定字符显示的实际地址入口参数:x注:此函数已经加上了0x80,故只需写上实际地址就行***************************************************/void Lcd_WriteAddress(unsigned char x){ Lcd_WriteCom(x|0x80); //显示位置的确定方法规定为"80H+地址码x"}/*****************************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y(为字符常量)***************************************************/void Lcd_WriteData(unsigned char y){while(Lcd_BusyTest()==1);RS=1; //RS为高电平,RW为低电平时,可以写入数据RW=0;E=0; //E置低电平(写指令时就是让E从0到1发生正跳变所以应先置"0"Lcd_Data=y; //将数据送入P0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:对LCD的显示模式进行初始化设置***************************************************/void Lcd_Int(void){Lcd_delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间Lcd_WriteCom(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口Lcd_delay(5); //延时5msLcd_WriteCom(0x38);Lcd_delay(5);Lcd_WriteCom(0x38); //3次写设置模式Lcd_delay(5);Lcd_WriteCom(0x0C); //显示模式设置:显示开,有光标,光标闪烁Lcd_delay(5);Lcd_WriteCom(0x06); //显示模式设置:光标右移,字符不移Lcd_delay(5);Lcd_WriteCom(0x01); //清屏幕指令,将以前的显示内容清除Lcd_delay(5);}void hanying_show(void){unsigned char Lcd_i;Lcd_WriteCom(0x01);//清显示:清屏幕指令Lcd_delay(1);Lcd_WriteAddress(0x00); // 设置显示位置为第一行的第1个字Lcd_delay(1);Lcd_i=0;while(string1[Lcd_i] != '\0') //'\0'是数组结束标志// 显示字符XUEHAO {Lcd_WriteData(string1[Lcd_i]);Lcd_i++;Lcd_delay(150);}Lcd_WriteAddress(0x40); // 设置显示位置为第二行的第1个字Lcd_i = 0;while(string2[Lcd_i] != '\0') //'\0'是数组结束标志{ // 显示字符0813********Lcd_WriteData(string2[Lcd_i]);Lcd_i++;Lcd_delay(150);}Lcd_delay(1000);//右侧移位进来Lcd_WriteCom(0x01);//清显示:清屏幕指令Lcd_delay(2);Lcd_WriteAddress(0x10); // 设置显示位置为最右侧Lcd_delay(2);Lcd_i = 0;while(string1[Lcd_i] != '\0') //'\0'是数组结束标志需先将字符存入{Lcd_WriteData(string1[Lcd_i]); // 显示字符WELCOM TO YANLcd_i++;Lcd_delay(2);}Lcd_WriteAddress(0x50); // 设置显示位置为第二行的第1个字Lcd_i = 0;while(string2[Lcd_i] != '\0') //'\0'是数组结束标志{ // 显示字符HAN UNIVERSITY Lcd_WriteData(string2[Lcd_i]);Lcd_i++;Lcd_delay(2);}for(Lcd_i=0;Lcd_i<16;Lcd_i++ ) //开始左移{Lcd_WriteCom(0x18); //左移指令Lcd_delay(400);}Lcd_delay(1000);Lcd_WriteCom(0x08);Lcd_delay(400);Lcd_WriteCom(0x0c);Lcd_delay(400);Lcd_WriteCom(0x08);Lcd_delay(400);Lcd_WriteCom(0x0c);Lcd_delay(400);Lcd_WriteCom(0x08);Lcd_delay(400);Lcd_WriteCom(0x0c);Lcd_delay(400);Lcd_WriteCom(0x08);Lcd_delay(400);Lcd_WriteCom(0x0c);Lcd_delay(1);Lcd_WriteCom(0x01);Lcd_delay(1);}。
LCD1602驱动编程(二)——驱动程序编写
switch( y) {
case 1:LCD_WriteCommand(0x80+x-1);break; //第一行 case2:LCD_WriteCommand(0x80+0x40+x-1); break; //第二行
7. 初始化 void LCD_Initial( void ) { LCD_WriteCommand(0x38); //4 位总线,5*10 点阵字符 LCD_WriteCommand(0x01); //清屏 LCD_WriteCommand(0x06); //显示光标,光标右移 LCD_WriteCommand(0x0c); //开显示 }
8. 滚动字符 Void Character_move( void ) { LCD_WriteCommand(0x18); //字符左移 LCD_WriteCommand(0x1C); //字符右移 }
{
P0=0x00;
RS_SET_C; //数据总线
RW_SET_W; //操作
EN_SET_L;
_NOP( );
//tps1
EN_SET_H; //拉高使能端
while(P0&0x80); } 4. 清屏 Void LCD_Clear( void ) {
Read_busy( ); //判忙 LCD_WriteCommand(0x01) ; DelayMs(5); } 5. 显示字符串
{
Read_busy( ); //判忙
RS_SET_C; //命令总线
RW_SET_R; //写操作
msp430G2553接lcd1602
msp430G2553接lcd1602#include#include#include/*****************************************************端口定义****************************************************/#define LCD_EN_PORT P1OUT //以下2个要设为同一个口使能信号1时读取信息1——0(下降沿)时执行命令#define LCD_EN_DDR P1DIR#define LCD_RS_PORT P2OUT //以下2个要设为同一个口0输入指令1输入数据#define LCD_RS_DDR P2DIR#define LCD_DATA_PORT P2OUT //以下3个要设为同一个口#define LCD_DATA_DDR P2DIR //一定要用高4位#define LCD_RS BIT3#define LCD_EN BIT7#define LCD_DATA BIT7|BIT6|BIT5|BIT4 //4位数据线连接模式/***************************************************预定义函数**************************************************/void LCD_init(void);void LCD_init_first(void);void LCD_en_write1(void); //上升沿使能void LCD_en_write2(void); //下降沿使能void LCD_write_command(unsigned char command);void LCD_write_data(unsigned char data);void LCD_set_xy (unsigned char x, unsigned char y);void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s); // 写命令void LCD_write_char(unsigned char X,unsigned char Y, unsigned char data); // 写数据void delay_1ms(void);void delay_nus(unsigned int n);void delay_nms(unsigned int n);unsigned char LCDBuf1[]={"Hello!LCD1602"}; //第一行要显示的内容unsigned char LCDBuf2[]={"MSP430G2553123"}; //第二行要显示的内容/********************************************主函数*******************************************/void main(){WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗LCD_init_first();LCD_init();delay_nms(100);LCD_write_string(0,0,LCDBuf1);delay_nms(10);LCD_write_string(0,1,LCDBuf2);}/********************************************LCD液晶操作函数*******************************************/void LCD_init_first(void) //LCD1602液晶初始化函数(热启动){delay_nms(500);LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出LCD_EN_DDR|=LCD_EN; //设置EN方向为输出LCD_RS_DDR|=LCD_RS; //设置RS方向为输出delay_nms(50);LCD_write_command(0x30);// delay_nms(50);// LCD_write_command(0x30);// delay_nms(5);// LCD_write_command(0x30);delay_nms(500);}/******************************************* LCD1602液晶初始化函数*****************************************/void LCD_init(void){delay_nms(500);LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出LCD_EN_DDR|=LCD_EN; //设置EN方向为输出LCD_RS_DDR|=LCD_RS; //设置RS方向为输出delay_nms(500);LCD_write_command(0x28); //4位数据接口delay_nms(50);LCD_write_command(0x28); //4位数据接口delay_nms(50);LCD_write_command(0x28); //4位数据接口delay_nms(50);LCD_en_write2();delay_nms(50);LCD_write_command(0x28); //4位数据接口delay_nms(500);LCD_write_command(0x01); //清屏LCD_write_command(0x0c); //显示开,关光标,不闪烁LCD_write_command(0x06); //设定输入方式,增量不移位delay_nms(50);}/******************************************* 液晶使能上升沿*****************************************/void LCD_en_write1(void){LCD_EN_PORT&=~LCD_EN;delay_nus(10);LCD_EN_PORT|=LCD_EN;}/******************************************* 液晶使能下降沿*****************************************/void LCD_en_write2(void){LCD_EN_PORT|=LCD_EN;delay_nus(10);LCD_EN_PORT&=~LCD_EN;}/******************************************* 写指令函数*****************************************/void LCD_write_command(unsigned char command){delay_nus(16);P2SEL=0x00;LCD_RS_PORT&=~LCD_RS; //RS=0 输入指令LCD_en_write1(); //使能信号先置低再置高LCD_DATA_PORT&=0X0f; //清高四位LCD_DATA_PORT|=command&0xf0; //写高四位delay_nus(16);LCD_en_write2(); //使能信号先置高再置低command=command<<4; //低四位移到高四位LCD_en_write1(); //使能信号先置低再置高LCD_DATA_PORT&=0x0f; //清高四位LCD_DATA_PORT|=command&0xf0; //写低四位LCD_en_write2(); //使能信号先置高再置低}/******************************************* 写数据函数*****************************************/void LCD_write_data(unsigned char data){delay_nus(16);P2SEL=0x00;LCD_RS_PORT|=LCD_RS; //RS=1 输入数据LCD_en_write1(); //E上升沿使能信号先置低再置高LCD_DATA_PORT&=0X0f; //清高四位LCD_DATA_PORT|=data&0xf0; //写高四位delay_nus(16);LCD_en_write2();data=data<<4; //低四位移到高四位LCD_en_write1();LCD_DATA_PORT&=0X0f; //清高四位LCD_DATA_PORT|=data&0xf0; //写低四位LCD_en_write2();}/******************************************* 写地址函数*****************************************/void LCD_set_xy( unsigned char x, unsigned char y ){unsigned char address;if (y == 0) address = 0x80 + x;else address = 0xc0 + x;LCD_write_command( address);}/*******************************************LCD在任意位置写字符串,列x=0~15,行y=0,1*****************************************/void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) {LCD_set_xy( X, Y ); //写地址while (*s) //写显示字符{LCD_write_data( *s );s++;}}/******************************************* LCD在任意位置写字符,列x=0~15,行y=0,1*****************************************/void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) {LCD_set_xy( X, Y ); //写地址LCD_write_data( data);}/***************************************** ** 1us延时函数*****************************************/void delay_1us(void){asm("nop");}/***************************************** ** N us延时函数*****************************************/ void delay_nus(unsigned int n){unsigned int i;for (i=0;i<n;i++)< bdsfid="261" p=""></n;i++)<>delay_1us();}/***************************************** ** 1ms延时函数*****************************************/ void delay_1ms(void) {unsigned int i;for (i=0;i<1140;i++);}/***************************************** ** N ms延时函数*****************************************/ void delay_nms(unsigned int n){unsigned int i=0;for (i=0;i<n;i++)< bdsfid="279" p=""></n;i++)<>delay_1ms();}。
手把手教你使用LCD1602(C程序+每个语句的详细说明)
#define __LCD_H__
#include<reg52.h> //包含单片机寄存器的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
#include<delay.h>
#include<hwjm.h>
//------------------------------------------------------------------------------
extern void LCDINT();//1602LCD初始化
//---------------------------------------------------------------------------------------------------
extern void lcd_set_mode(uchar DL, uchar N, uchar F);//功能设定/*显示设置函数*/
{
write_com(0x02);
}
//-------------------------------------------------------------------------------/*向LCM1602写命令*/
void write_com(uchar dictate)//将指令写入液晶
void lcd_display_mode(uchar D, uchar C,uchar B) //显示设置函数
{
unsigned char mode=0x08;
if(D) mode |= 0x04;//显示功能:0关1开
LCD1602 C语言驱动程序
#define LCD_DELAY_TIME 40
#define DATA_MODE 0x38
#define OPEN_SCREEN 0x0C
#define DISPLAY_ADDRESS 0x80
#define CLEARSCREEN LCD_en_command(0x01)
void delay_nms(unsigned int n);//delay function
/********************************************************************/
void main(void)
{
LCD_init();
void LCD_en_dat(unsigned char dat)
{
LCDIO=dat;
LCD1602_RS=HIGH;
LCD1602_RW=LOW;
LCD1602_EN=LOW;
LCD_delay();
LCD1602_EN=HIGH;
}
/********************************************************************/
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);//write lcd string function
void LCD_init(void);//lcd initize function
/********************************************************************/
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
msp430单片机驱动LCD1602 C语言程序
/************************************************ *******************************/
1.msp430单片机C语言
/************************************************ *************************/
#include"msp430f6638.h"
/*******************************************
P5.3----E
P57 P56 P55 P54 P53 P52 P51 P50
P5.4----RS
P5.5----RW
P57 P56 RW
RS
E
P52 P51 P50
P2OUT---wdata
********************************************/
#define uchar unsigned char;
#define uint unsigned int;
//*********显示字符串可将字符串放入数组,例如显示ancd efdg******/
/**定义一个数组**/
/**uchar code ttt[]="ancd efdg";//字符串用双引号引起来,空格计入字符串的元素
/*uchar code kkk[]="ffba ggddmm";//上句加空格9个元素,该句加两个空格12个元素
/**********************************元素个数在循环显示时要使用*****
/*********************为循环显示字符串还得定义一个变量**/
// uchar n;/定义变量n
void
delay(int time)
//延迟函数
{
while(time--); //延迟时间
}
writeCommandLcd(unsigned char comd)// 写入命令 {
P5OUT &= ~0x10; //RS清0
(运算后P5=xxx0 xxxx,即RS=0其他位状态不变)
P5OUT &= ~0x20; //RW清0
(运算后P5=xx0x xxxx,即RW=0其他位状态不变) P5OUT &= ~0x08; //使能E清0
(运算后P5=xxxx 0xxx,即E=0其他位状态不变)
//上面三个语句执行完后P5OUT=xx000xxx,用P5OUT &=~0x38;可一次完成。
P2OUT = comd; //送命令到P2OUT准备输出进入1602,等E下降沿来即可进入1602.
P5OUT |= 0x08; //使能E置1,P5OUT= xxxx
xxxx+0000 1000=xxxx1xxx,E=1.
delay(10);
P5OUT &= ~0x08; //使能E清0,这样E从1变0,产生一个下降,写入命令到1602。
}
void
writeDataLcd(unsigned char dat)// 写入命令
P5OUT |= 0x10; //RS置1
(运算后P5=xxx1 xxxx,即RS=1其他位状态不变)
P5OUT &= ~0x20; //RW清0
(运算后P5=xx0x xxxx,即RW=0其他位状态不变) P5OUT &= ~0x08; //使能E清0
(运算后P5=xxxx 0xxx,即E=0其他位状态不变)
P2OUT = dat; //送数据到P2OUT准备输出进入1602,等E下降沿来即可进入1602.
P5OUT |= 0x08; //使能E置1,P5OUT= xxxx
xxxx+0000 1000=xxxx1xxx,E=1.
delay(10);
P5OUT &= ~0x08; //使能E清0,这样E从1变0,产生一个下降,写入命令到1602。
}
void lcd_init(void) //初始化LCD
{
delay(10);
writeCommandLcd(0x38);//显示模式设置为1602,
5X7点阵显示。
8位数据接口。
delay(10);
writeCommandLcd(0x08);//打开显示液晶
writeCommandLcd(0x01);//清屏,光标回到起点 //writeCommandLcd(0x0C);//开显示,关光标,即不显示光标。
//writeCommandLcd(0x0E);//开显示,开光标,有光标但不闪烁。
writeCommandLcd(0x0F);//开显示,开光标,有光标且光标闪烁。
writeCommandLcd(0x06);//读写操作时地址自动加1。
}
int main(void)
{
WDTCTL=WDTPW+WDTHOLD;
P2DIR=0xff;
P5DIR=0xff;
lcd_init();
/********************字符串显示代替单字显示*************************************
for (n=0;n<9;n++)
{
writeData(ttt[n]);//从第一行第一位显示(第2行显示需80h+40h)
delay(10);
}
weitecommandLcd(0x80+0x40);//第2行显示必须从第2行首地址开始
for (n=0;n<12;n++)
{
writeData(ttt[n]);//从第一行第一位显示(第2行显示需80h+40h)
delay(10);
}
while(1);
********************闪烁动态效果可将延迟时间加长*****************************/
while(1)
{
writeCommandLcd(0x80);//从第一行第一位显示(地址是80h)
/*其实1行1列地址是00h,但在输入地址是时要保证D7位为1,其余位确定的是实际地址,这样
00h=0100 0000b要保证D7为1,就变成了1000 0000b,即80h,相当于给实际地址加8,如第2行2列,
实际地址为41h=0100 0000b,高位变1就成了11000000b=c0h*/
delay(10);
writeDataLcd(0x30+0);//30为0在1602字库的存储地址,依次类推1、2、3....
delay(10);
writeDataLcd(0x30+1);
delay(10);
writeDataLcd(0x30+2);
delay(10);
writeDataLcd(0x30+3);
while(1);
}
}
液晶显示由状态控制端RS、RW和E控制输入输出,但由于只有DB7到DB0一个字节的I/O连接单片机与1602等液晶,控制指令和显示数据都要通过这一个I/O口进出,所以,程序编写要编写两个函数,一个指令输入函数(即void writecommandLcd(char unsigned word)),一个数据输入函数(即void writedataLcd(int signed dat))两个函数的不同只是RS、RW和E的状态不同。