LCD1602汇编显示程序
1602液晶滚动显示 C语言详细程序
/****************************************************************************** *** 描述: LCD1602 滚动显示** 显示方式:* * 1、从左到右逐字显示,闪动二次,清屏。
* * 2、再从右到左逐字显示,闪动二次,清屏。
* * 3、周期性地重复上述显示方式。
* ******************************************************************************* */#include <reg51.h>#include <intrins.h>typedef unsigned char BYTE;typedef bit BOOL;sbit LCD_RS = P2^6;sbit LCD_RW = P2^5;sbit LCD_EP = P2^7;BYTE code dis1[] = {" WELCOME TO "};BYTE code dis2[] = {" "};BYTE code dis3[] = {" OT EMOCLEW "};BYTE code dis4[] = {" MOC.NIHCERP.WWW "};delay(int ms){ // 延时子程序int i;while(ms--){for(i = 0; i< 250; i++){_nop_();_nop_();_nop_();_nop_();}}}BOOL lcd_bz(){ // 测试LCD忙碌状态BOOL result;LCD_RS = 0;LCD_RW = 1;LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();result = (BOOL)(P0 & 0x80);LCD_EP = 0;return result;}lcd_wcmd(BYTE cmd){ // 写入指令数据到LCD while(lcd_bz());LCD_RS = 0;LCD_RW = 0;LCD_EP = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}lcd_pos(BYTE pos){ //设定显示位置lcd_wcmd(pos | 0x80);}lcd_wdat(BYTE dat){ //写入字符显示数据到LCD while(lcd_bz());LCD_RS = 1;LCD_RW = 0;LCD_EP = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}lcd_init(){ //LCD初始化设定lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据delay(1);lcd_wcmd(0x0c); //显示开,关光标delay(1);lcd_wcmd(0x06); //移动光标delay(1);lcd_wcmd(0x01); //清除LCD的显示内容delay(1);}main(){BYTE i;lcd_init(); // 初始化LCDdelay(10);while(1){lcd_wcmd(0x06); //向右移动光标lcd_pos(0); //设置显示位置为第一行的第1个字符i = 0;while(dis1[ i ] != '\0'){ //显示字符"WLCOME TO"lcd_wdat(dis1[ i ]);i++;delay(30); //控制两字之间显示速度}lcd_pos(0x40); //设置显示位置为第二行第1个字符i = 0;while(dis2[ i ] != '\0'){lcd_wdat(dis2[ i ]); //显示字符" "i++;delay(30); //控制两字之间显示速度}delay(800); //控制停留时间lcd_wcmd(0x01); //清除LCD的显示内容delay(1);lcd_wcmd(0x04); //向左移动光标lcd_pos(15); //设置显示位置为第一行的第16个字符i = 0;while(dis3[ i ] != '\0'){ //显示字符"WLCOME TO"lcd_wdat(dis3[ i ]);i++;delay(30); //控制两字之间显示速度}lcd_pos(0x4F); //设置显示位置为第二行的第16个字符i = 0;while(dis4[ i ] != '\0'){lcd_wdat(dis4[ i ]); //显示字符" "i++;delay(30); //控制两字之间显示速度}delay(800); //控制停留时间lcd_wcmd(0x01); //清除LCD的显示内容delay(200); //控制两屏转换时间}}。
LCD1602汇编
1602汇编指令程序ORG 0000HAJMP STARTORG 0013HLJMP INT1ZDORG 0030HRS BIT P3.5RW BIT P3.6E BIT P3.4L0 EQU P0START:CLR RS //初始化CLR RWMOV L0,#38HSETB EACALL DELAYCLR ECLR RSCLR RWMOV L0,#06HSETB EACALL DELAYCLR ECLR RSCLR RWMOV L0,#0CH //选中第二行显示SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#' ' //显示空白SETB EACALL DELAYCLR ECLR RSCLR RWMOV L0,#00HSETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'w' //显示字母 WSETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'w' //显示字母 WSETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'w' //显示字母 WSETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'.' //显示 .SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'1' //显示SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'0'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'0'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'8'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'6'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#' 'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'.'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'c'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'o'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'m'SETB EACALL DELAYCLR ECLR RSCLR RWMOV L0,#0C0HSETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'t'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'e'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'l'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'l'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#':'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'0'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'2'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'8'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'-'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'7'ACALL DELAYCLR ESETB RSCLR RWMOV L0,#'8'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'-'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'5'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'7'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'3'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'6'SETB EACALL DELAYSJMP $DELAY:MOV R5,#10 //延时子程序 D0:MOV R6,#10D1:DJNZ R6,D1DJNZ R5,D0RETEND。
LCD1602-51单片机汇编程序.
1602汇编程序, 51单片机汇编程序,仅需修改引脚定义即可。
晶振大小 12M ,程序测试完全正确。
内部包含写数据、写命令(包括读忙和不读忙、初始化等子函数。
调用时先给 LCD_DAT赋值,给出需要写入的数据或命令,然后调用。
; 端口引脚定义区LCD_RS BIT P2.4 ;1602数据命令选择端口LCD_RW BIT P2.5 ;1602读写选择端口LCD_EN BIT P2.6 ;1602使能端口LCD_DATA EQU P0 ;1602数据端口; 变量声明区ALL_FLAG EQU 20H ; 标志位LCD_FLAG EQU ALL_FLAG.7 ;1602读忙标志位LCD_DAT EQU 30H ;1602数据命令字DELAYED EQU 31H ; 延时字/*****************************************1602读命令函数,高位存至 LCD_LAG中*****************************************/LCD_R_DATA:MOV LCD_DATA,#0FFHLCD_BUSY: CLR LCD_RSSETB L CD_RWNOPSETB L CD_ENNOPMOV Acc,LCD_DATAMOV C,Acc.7MOV LCD_FLAG,CCLR LCD_ENNOPJB LCD_FLAG,LCD_BUSYRET/***************************************** 1602写数据函数,数据存在 LCD_DAT*****************************************/ LCD_W_DATA:LCALL LCD_R_DATASETB L CD_RSCLR LCD_RWNOPMOV LCD_DATA,LCD_DATSETB L CD_ENNOPCLR LCD_ENRET/***************************************** 1602写命令函数,命令存在LCD_DAT,检测忙信号 *****************************************/LCD_W_CMD:LCALL LCD_R_DATACLR LCD_RSCLR LCD_RWNOPMOV LCD_DATA,LCD_DAT SETB L CD_ENNOPCLR LCD_ENRET/***************************************** 1602写命令函数,命令存在LCD_DAT,不检测忙信号 *****************************************/ LCD_CMD:CLR LCD_RSCLR LCD_RWNOPMOV LCD_DATA,LCD_DAT SETB L CD_ENNOPCLR LCD_ENRET/***************************************** 1602初始化函数*****************************************/ LCD_INIT: MOV DELAYED,#30LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD_CMDMOV DELAYED,#10LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD_CMDMOV DELAYED,#10LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD_CMDMOV DELAYED,#10LCALL DELAY_MSMOV LCD_DAT,#038HLCALL LCD_W_CMDMOV LCD_DAT,#08HLCALL LCD_W_CMDMOV LCD_DAT,#01HLCALL LCD_W_CMDMOV LCD_DAT,#06HLCALL LCD_W_CMDMOV LCD_DAT,#0CHLCALL LCD_W_CMDRET/*****************************************延时函数,延时时间为 DELAYED*0.5毫秒 0~100毫秒的延时*****************************************/DELAY_MS:MOV R7,DELAYEDD1: MOV R6,#0F8HD2: DJNZ R6,D2DJNZ R7,D1RET/*****************************************延时函数,延时时间为 DELAYED*2微秒 0~500微秒的延时*****************************************/DELAY_US:MOV R7,ADU1:DJNZ R7,DU1RET。
LCD1602显示的程序
WriteOneChar(0xbe);//发温度转换命令
readtemp[0]=ReadOneChar();//读取相应的温度值低位
readtemp[1]=ReadOneChar();//读取相应的温度值高位
sflag[h]=0;
delayy(20);
}
//18B20读一个字节
ReadOneChar(void)
{
unsigned char i="0";
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
}
}
readtemp[1]=readtemp[1]<<4;//将高低温度和为一个字节,本方法避免了*0。0625,很简单,很准确
readtemp[1]=readtemp[1] & 0x70;
xx="readtemp"[0];
{
displaybuf[k+1]= fentemp%10;
fentemp= fentemp/10;
}
displaybuf[k]= fentemp;
k+=2;
xx="xx">>4;
xx="xx"& 0x0f;
readtemp[1]=readtemp[1] | xx;
temp[h]=readtemp[1];
fentempபைடு நூலகம்"temp"[h];//拆分两路温度值送入显示单元
LCD1602原理与显示程序
LCD1602原理与显示程序LCD1602的原理是基于液晶显示技术。
液晶是一种特殊的物质,具有双折射性质,即能将入射的光线分成两束,通过改变液晶分子的排列方式,可以改变其双折射的性质,从而使得光线透过液晶时会发生偏转。
LCD1602利用这一原理,在液晶显示面板上设置了16列和2行的像素点阵,通过控制每个像素点的液晶分子的排列方式,来实现字符的显示。
初始化是指在使用LCD1602之前,需要对其进行一系列的初始化操作,以确保其正常工作。
具体的初始化步骤如下:1.设置通信协议:LCD1602可以通过并行接口和串行接口进行通信,根据具体的接口方式,选择相应的通信协议。
2.设置工作模式:LCD1602有两种工作模式,分别是4位模式和8位模式。
选择适合的工作模式,并设置相应的控制寄存器。
3.设置显示模式:LCD1602可以显示不同的字符集,如英文字符、数字、特殊符号等。
选择合适的字符集,并设置显示模式。
4.清除显示:设置清除显示寄存器,将显示区域清空。
5.光标设置:设置光标位置和显示方式,如光标是否闪烁、光标位置等。
完成初始化后,就可以将要显示的数据写入LCD1602数据写入是指将要显示的字符或数字写入到LCD1602的显示区域。
具体的数据写入步骤如下:1.设置光标位置:根据需要显示的字符位置,设置光标的位置。
2.数据写入:通过通信接口,将要显示的数据写入到LCD1602的数据寄存器。
3.延时:由于LCD1602的刷新速度较慢,需要等待一定的时间,使得数据能够稳定显示在液晶屏上。
4.更新光标位置:根据数据的长度和显示方式,更新光标的位置。
通过以上的步骤,就可以实现LCD1602的显示功能。
总结起来,LCD1602的原理是基于液晶显示技术,通过控制液晶分子排列方式来实现字符的显示。
其显示程序包括初始化和数据写入两个方面的内容,通过设置通信协议、工作模式、显示模式等参数,并将要显示的数据写入到LCD1602的显示区域,来实现字符的显示。
LCD1602 显示程序
TMOD=0x00; //设定定时器
TR0=1;//定时器0开
set_lcd1602(); //初始化LCD1602
view_lcd1602(0x8f,table);
cgram_set_lcd1602(0x40,tt1);
cgram_set_lcd1602(0x48,tt2);
w_comd(0xca); w_data(0x00); w_data(0x01); //自定义字符显示
{ int j;
w_comd(addr); //写入地址
while(*i>0)
{ w_data(*i); //写入数据
i++;
for(j=0;jdelay(0x15,0xa0);
w_comd(0x18); //左移指令
}
}
/////////////////////////////////////// cgram写入程序段
ucharcode tt2[]={0x0E,0x0E,0x00,0x1F,0x1F,0x0C,0x19,0x1F}; //云
///////////////////////////////////////
void delay(uchar H,uchar L) //定时器延时程序段
{ TF0=0;TH0=H;TL0=L;
w_comd(0x02); //地址指针归位
delay(0xf9,0x98);
w_comd(0x06); //
w_comd(0x0c); //开显示屏
w_comd(0x38); //8位传送数据2行显示
}
///////////////////////////////////显示程序段
void view_lcd1602(ucharaddr,uchar *i) //*i为所传字符串指针
LCD1602显示程序main
/**************************************************** LCD1602显示** 描述:4线数据宽度,操作Lcd1602* 在LCD1602屏幕上第一行显示Hello!LCD1602* 第二行显示123456789abcdef** 时间:2012年3月15日调试成功(出现问题主要是因为LCD初始化)** 硬件电路:MSP430F2132* 硬件连接:** MSP430与LCD连接信息* LCD1602,4位接口,即使用D4-D7数据口,D0-D3不接入MCU* PIN1 --> 地* PIN2 --> VCC(一定要接+5V)* PIN3 -->仿真时悬空,实际电路2K电阻-->地(一定要接好,否则没有任何显示) * PIN4 --> RS --> P2.2* PIN5 --> R/W --> GND* PIN6 --> EN --> P2.1* PIN7 --> D0不接* PIN8 --> D1不接* PIN9 --> D2不接* PIN10 --> D3不接* PIN11 --> D4 --> P1.4* PIN12 --> D5 --> P1.5* PIN13 --> D6 --> P1.6* PIN14 --> D7 --> P1.7* PIN15 --> VCC(一定要接+5V,如果不要背光可以不接* PIN16 --> 地* 调试器:MSP430FET全系列JTAG仿真器* 调试软件:CCS5.1.1 编译**************************************************/#include "msp430f2132.h"#include <intrinsics.h>//定义////////////////////////////////////////////////////////////////////#define LCD_EN_PORT P2OUT//以下2个要设为同一个口#define LCD_EN_DDR P2DIR#define LCD_RS_PORT P2OUT//以下2个要设为同一个口#define LCD_RS_DDR P2DIR#define LCD_DATA_PORT P1OUT //以下3个要设为同一个口#define LCD_DATA_DDR P1DIR //一定要用高4位#define LCD_RS BIT2#define LCD_EN BIT1//#define LCD_DATA BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT6|BIT7 //8位数据线连接模式时使用#define LCD_DATA BIT4|BIT5|BIT6|BIT7 //4位数据线连接模式时使用////预定义函数//////////////////////////////////////////////////////////////////void LCD_init(void);void LCD_en_write(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);void main(){WDTCTL = WDTPW + WDTHOLD; // Stop watchdogLCD_init();delay_1ms();LCD_write_string(0,0,"Hello!LCD1602");delay_1ms();LCD_write_string(0,1,"123456789abcdef");}//LCD液晶操作函数/////////////////////////////////////////////////////////////////LCD1602液晶初始化void LCD_init(void){delay_nms(15);LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出LCD_EN_DDR|=LCD_EN; //设置EN方向为输出LCD_RS_DDR|=LCD_RS; //设置RS方向为输出delay_1ms(); //这4行不要改,否则仿真没显示// LCD_write_command(0x38); //8位数据接口时,使用这行,否则仿真没显示LCD_write_command(0x33); //4位数据接口时,使用这行,否则仿真没显示delay_1ms(); //// LCD_write_command(0x38); //8位数据接口时,使用这行,否则仿真没显示LCD_write_command(0x32); //4位数据接口时,使用这行,否则仿真没显示delay_1ms();// LCD_write_command(0x38); //8位数据接口时,使用这行,否则仿真没显示delay_1ms();// LCD_write_command(0x38); //8位数据接口LCD_write_command(0x2c); //4位数据接口delay_1ms();LCD_write_command(0x0c); //显示开delay_1ms();LCD_write_command(0x01); //清屏delay_1ms();LCD_write_command(0x06);}//液晶使能void LCD_en_write(void){LCD_EN_PORT|=LCD_EN;delay_nus(10);LCD_EN_PORT&=~LCD_EN;}//写指令void LCD_write_command(unsigned char command) {delay_nus(16);LCD_RS_PORT&=~LCD_RS; //RS=0LCD_DATA_PORT&=0X0f; //清高四位LCD_DATA_PORT|=command&0xf0; //写高四位//LCD_DATA_PORT = command; //写8位delay_nus(16);LCD_en_write();command=command<<4; //低四位移到高四位LCD_DATA_PORT&=0x0f; //清高四位LCD_DATA_PORT|=command&0xf0; //写低四位LCD_en_write();}//写数据void LCD_write_data(unsigned char data){delay_nus(16);LCD_RS_PORT|=LCD_RS; //RS=1LCD_DATA_PORT&=0X0f; //清高四位LCD_DATA_PORT|=data&0xf0; //写高四位//LCD_DATA_PORT = data; //写8位LCD_en_write();data=data<<4; //低四位移到高四位LCD_DATA_PORT&=0X0f; //清高四位LCD_DATA_PORT|=data&0xf0; //写低四位LCD_en_write();}//写地址函数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,1void 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,1void 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++)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++)delay_1ms();}。
LCD1602显示程序
#include <>#define uchar unsigned char#define uint unsigned intsbit LCM_E=P3^5;//定义接口sbit LCM_RW=P3^6;sbit LCM_RS=P3^7;#define LCM_Data P1//数据接口void LCM_WriteData(uchar WDLCM);【void LCM_WriteCommand(uchar WCLCM,BuysC);uchar LCM_ReadData(void);uchar LCM_ReadStatus(void);void LCM_Init(void);void DisplayOneChar(uchar X, uchar Y, uchar DData);void DisplayListChar(uchar X, uchar Y, uchar code *DData); void Delay5Ms(void);void Delay400Ms(void);&uchar code uctech[] = {"1602A"};uchar code net[] = {".52c"};void main(void){Delay400Ms();//启动等待,等LCM讲入工作状态LCM_Init();//LCM初始化Delay5Ms();//延时片刻(可不要)>DisplayListChar(6, 1, uctech);DisplayListChar(0, 0, net);LCM_ReadData();//测试用句无意义LCM_Data=255;while(1);}/****************************1602A写数据函数**************************//*函数原型:void LCM_WriteData(uchar WDLCM)|/*函数功能:1602A写数据/*输入参数:要写入的数据/*输出参数:无/*调用模块:/*建立时间:2005/11/14/*作者:站长/******************************************************************** **/void LCM_WriteData(uchar WDLCM)^{LCM_ReadStatus();//检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E = 0;//若晶振速度太高可以在这后加小的延时LCM_E = 0;//延时LCM_E = 1;"}/****************************1602A写指令函数**************************//*函数原型:void LCM_WriteCommand(uchar WCLCM,BuysC)/*函数功能:1602A写指令/*输入参数:要写入的指令/*输出参数:无/*调用模块:/*建立时间:2005/11/14《/*作者:站长/******************************************************************** **/void LCM_WriteCommand(uchar WCLCM,BuysC)//BuysC为0时忽略忙检测{if (BuysC) LCM_ReadStatus();//根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;-LCM_E = 0;LCM_E = 0;LCM_E = 1;}/****************************1602A读数据函数**************************//*函数原型:uchar LCM_ReadData(void)/*函数功能:1602A读数据/*输入参数:无~/*输出参数:1602A返回的数据/*调用模块:/*建立时间:2005/11/14/*作者:站长/******************************************************************** **/uchar LCM_ReadData(void){LCM_RS = 1;…LCM_E = 0;LCM_E = 0;LCM_E = 1;return(LCM_Data);}/****************************1602A读状态函数**************************//*函数原型:uchar LCM_ReadData(void)@/*函数功能:1602A读状态/*输入参数:无/*输出参数:1602A返回的状态/*调用模块:/*建立时间:2005/11/14/*作者:站长/******************************************************************** **/uchar LCM_ReadStatus(void)~{LCM_Data = 0xFF;LCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 1;while (LCM_Data & 0x80);//检测忙信号。
用1602液晶显示万年历用汇编程序
微机原理与接口技术专用周设计报设计科目:1602万年历设计所修课程:单片机课程设计人: 张毅(201212020250)杨梦柳(201212020309)系部:电气系班级:通信一班指导老师:王老师、施老师、杨老师时期:2013-12-9至201312-12-19目录第一章、设计内容及要求 (1)1、1设计内容 (1)1.2 各部分的功能 (1)1.3设计要求 (2)第二章、设计方案 (2)2.1实时时间计算模块方案 (2)2.2 液晶显示模块 (2)第三章、功能模块介绍 (3)3.1液晶模块 (3)3.1.1 功能特性介绍 (3)3.1.2 接口信号说明 (3)3.1.3 基本操作时序 (4)3.1.4 显示说明 (4)3.1.5 接口电路 (5)3.2按键控制模块 (5)3.3稳压电路模块 (6)3.4晶振模块 (6)3.5复位电路 (7)第四章、系统软件设计 (8)4.1程序路程图 (8)4.1.1主程序流程图 (8)4.1.2定时器流程图 (8)4.1.3 时间调整程序流程图 (9)第五章、测试方案和结果分析 (10)5.1 测试仪器 (10)5.2显示模块的调试 (10)5.3测试结果分析 (10)*附录一、程序清单 (11)二、电路总图 (28)三、参考文献 (28)四、专用周总结 (29)摘要:本文主要介绍了LCD1602的各个引脚的功能及其作用,也介绍了单片机的一些比较基础的,比较常用的一些资源的应用,同时也对PROTEUS硬件仿真电路有一定的认识。
对于单片机的原理设计电路,在了解硬件的基础上完成程序设计,是自己掌握对一个系统的初步规划和设计,同时也提高了自己分析问题的能力和资料整理的能力。
关键字:LCD1602,程序设计,硬件电路。
Abstract:T his paper mainly introduces the function and the function of each pin of LCD1602, also introduces micro controller some basis of comparison, some commonly used application resources, but also have a certain understanding to the PROTEUS hardware simulation circuit. The design principle of single chip circuit, completed the program design is based on the understanding of hardware, is in their own hands the preliminary planning and design of a system, but also improve the ability of their own ability to analyze the problem and the collation of data.Keyword:LCD1602, program design, hardware circuit.第一章、设计内容及要求1、1设计内容利用P89V51RD2单片机芯片和LCD1602液晶显示屏做个万年历,在显示屏上显示年、月、日、时、分、秒、星期。
LCD1602简单显示程序(单片机)
#include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit LCD_E=P3^5; //定义接口sbit LCD_RW=P3^6;sbit LCD_RS=P3^7;#define LCD_Data P1 //数据接口uchar up[]={"IvU,hupeixian"};uchar code down[]={"_by fu "}/*************************延时函数*****************************/void Delay_ms(uint time){uint i,j;for(i = 0;i < time;i ++)for(j = 0;j < 930;j ++);}/**********************检测状态************************************/ uchar LCD_ReadStatus(void){LCD_Data = 0xFF;LCD_RS = 0;LCD_RW = 1;LCD_E = 1;LCD_E = 1;LCD_E = 0;while (LCD_Data & 0x80); //检测忙信号return(LCD_Data);}/************************写数据***********************************/ void LCD_WriteData(uchar WDLCD){LCD_ReadStatus();//检测忙LCD_Data = WDLCDLCD_RS = 1;LCD_RW = 0;LCD_E = 1;//若晶振速度太高可以在这后加小的延时LCD_E = 1;//延时LCD_E = 0;}/************************写指令********************************/ void LCD_WriteCommand(uchar WCLCD,BuysC) //BuysC为0时忽略忙检测{if (BuysC)LCD_ReadStatus(); //根据需要检测忙LCD_Data = WCLCD;LCD_RS = 0;LCD_RW = 0;LCD_E = 1;LCD_E = 1;LCD_E = 0;}/*****************初始化***********************************/void LCD_Init(void){LCD_Data = 0;LCD_WriteCommand(0x38,0);//三次显示模式设置,不检测忙信号Delay_ms(5);LCD_WriteCommand(0x38,0);Delay5Ms();LCD_WriteCommand(0x38,0);Delay_ms(5);LCD_WriteCommand(0x38,1); //显示模式设置,开始要求每次检测忙信号LCD_WriteCommand(0x08,1); //关闭显示LCD_WriteCommand(0x01,1); //显示清屏LCD_WriteCommand(0x06,1); // 显示光标移动设置LCD_WriteCommand(0x0C,1); // 显示开及光标设置}/***********************显示一个字符********************************/ void DisplayOneChar(uchar X, uchar Y, uchar DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; // 算出指令码LCD_WriteCommand(X, 0); //这里不检测忙信号,发送地址码LCD_WriteData(DData);}/************************显示一串字符*******************************/ void DisplayListChar(uchar X, uchar Y, uchar code *DData){uchar ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}/******************************************************************/ void main(void){Delay_ms(400); //启动等待,等LCD讲入工作状态LCD_Init(); //LCD初始化Delay_ms(5); //延时片刻(可不要)DisplayListChar(0, 1, up);DisplayListChar(6, 0, down);LCD_Data=0xff;while(1);}。
lcd1602程序 汇编版本
LCALL WR_LCD_CMD
MOV DAT_PORT,#06H ; 光标右移,文字不移
LCALL WR_LCD_CMD
INIT_DS: CLR DS_RST
CLR DS_CLK
SETB DS_RST
MOV DS_DAT,8EH
LCALL WR_DS
MOV R2,#00H
CLR LCD_RS ;选择指令寄存器
SETB LCD_RW ;高电平,读操作
CLR LCD_E ;电平由高到低,执行命令
;=====================DS1302子程序===============================
;---------------------取DS1302数据-------------------------------
;---------------------读DS1302-----------------------------------
RD_DS: MOV R0,#SECOND
MOV R7,#7
MOV R1,#80H ;SECOND ADRESS 80H
SET1: CLR DS_RST
CLR DS_CLK
DS_ADDR EQU 30H
DS_DAT EQU 31H
SECOND EQU 32H
MINUTE EQU 33H
ORG 0000H
LJMP MAIN
ORG 0060H
;=====================初始化程序=================================
1602液晶显示程序(时钟)
// ************1602液晶显示程序************ #include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit lcden=P2^2; //液晶使能位sbit lcdrw=P2^1; //液晶读写位sbit lcdrs=P2^0; //数据命令选择位uchar shi,fen,miao;uchar code time1[]="DATA: 2011-4-19";uchar code time2[]="TIME: 00:00:00";void w_cmd(uint date);void w_data(uint date);void w_cht(uchar add,uchar date);//************初始化及相关子函数*********** void delay(uchar x){uchar y,z;for(y=x;y>0;y--)for(z=110;z>0;z--);}void init() //1602液晶初始化{uchar i,j;lcden=0; //初始使能端lcdrw=0; // 写数据选择w_cmd(0x38);w_cmd(0x01);w_cmd(0x0c);w_cmd(0x06);w_cmd(0x80);for(i=0;i<15;i++)w_data(time1[i]);w_cmd(0x80+0x40);for(j=0;j<15;j++)w_data(time2[j]); //上电初始显示数据}void w_cmd(uint date) //“写”命令子程序{lcdrs=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void w_data(uint date) //”写“数据子程序{lcdrs=1;P0=date;delay(3);lcden=1;delay(5);lcden=0;}void intrupt() //"TO中断"初始{TMOD=0x01; //选择16位定时器0x01 EA=1; //开总中断ET0=1; //开“T0”中断允许位TH0=(65536-50000)/256;TL0=(65536-50000)%256; //定时器装初值TR0=1;}void w_cht(uchar add,uchar date) //时间改变函数{uchar date1,date2;w_cmd(0x80+0x40+add);date1=date/10;date2=date%10;w_data(0x30+date1);w_data(0x30+date2);}//********主函数**************void main(){init();intrupt();while(1);}//*******T0中断子程序************* void T_rupt() interrupt 1{uchar flag; //定义标志位TH0=(65536-50000)/256;TL0=(65536-50000)%256; //赋初值flag++;if(20==flag){flag=0;miao++;if(60==miao){miao=0;fen++;if(60==fen){fen=0;shi++;if(24==shi){shi=0;}w_cht(7,shi);}w_cht(10,fen);}w_cht(13,miao);}}。
LCD1602原理及显示程序
在日常生活中,我们对液晶显示器并不陌生。
液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。
在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。
发光管和LED数码管比较常用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用。
在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。
因此,液晶显示器画质高且不会闪烁。
数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。
功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
10.8.1液晶显示简介①液晶显示原理液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
②液晶显示器的分类液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。
除了黑白显示外,液晶显示器还有多灰度有彩色显示等。
如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(SimpleMatrix)和主动矩阵驱动(ActiveMatrix)三种。
③液晶显示器各种图形的显示原理:线段的显示点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。
(整理)LCD1602汇编程序.
(整理)LCD1602汇编程序.LCD1602汇编程序;* 描述: LCD1602 滚动显示*;* 显示方式:*;* 1、从左到右逐字显示,闪动二次,清屏。
*;* 2、再从右到左逐字显示,闪动二次,清屏。
*;* 3、周期性地重复上述显示方式。
*;************************************************************** ***** LCD_RS EQU P2.0LCD_RW EQU P2.1LCD_EN EQU P2.2;************************************************************** ***** ORG 0000HAJMP MAINORG 0030H;************************************************************** ***** MAIN:MOV SP,#60HMOV R4,#02H ;设置闪烁次数ACALL LCD_INITMAIN1:ACALL LCDSET1MOV DPTR,#CHAR1ACALL WRITE1 ;MOV A,#0C0H ;显示第二行左边第一位位置ACALL LCD_CMDMOV DPTR,#CHAR2 ;显示ACALL WRITE1ACALL DELAY4 ;延时ACALL DELAY4ACALL SHAN ;闪烁两次ACALL LCDSET2MOV DPTR,#CHAR3 ;ACALL WRITE1MOV A,#0C0H ;显示第二行右边第一位位置ACALL LCD_CMDMOV DPTR,#CHAR4 ;显示ACALL WRITE1ACALL DELAY4 ;延时ACALL DELAY4ACALL SHAN ;闪烁两次ACALL MAIN1;************************************************************** *;LCD初始化设定子程序;************************************************************** * LCD_INIT:ACALL DELAY5MS ;延时15MSACALL DELAY5MS ;等待LCD 电源稳定ACALL DELAY5MSMOV A,#38H ;16*2 显示,5*7 点阵,8 位数据ACALL LCD_CMD_NC ;不进行LCD 忙检测ACALL DELAY5MSMOV A,#38H ;16*2 显示,5*7 点阵,8 位数据ACALL LCD_CMD_NC ;不进行LCD 忙检测ACALL DELAY5MSMOV A,#38H ;16*2 显示,5*7 点阵,8 位数据ACALL LCD_CMD_NC ;不进行LCD 忙检测ACALL DELAY5MSMOV A,#08H ;显示关ACALL LCD_CMD ;进行LCD 忙检测MOV A,#01H ;清除屏幕ACALL LCD_CMD ;进行LCD忙检测MOV A,#06H ;移动光标ACALL LCD_CMD ;进行LCD 忙检测MOV A,#0CH ;显示开,关光标ACALL LCD_CMD ;进行LCD 忙检测RET;************************************************************** * ;显示位置与移动光标设定;************************************************************** * LCDSET1:MOV A,#01H ;清除屏幕ACALL LCD_CMDACALL DELAY5MSMOV A,#06H ;移动光标(光标加1)ACALL LCD_CMDACALL DELAY5MSMOV A,#80H ;显示第一行左边第一位位置ACALL LCD_CMDACALL DELAY5MSRETLCDSET2:MOV A,#01H ;清除屏幕ACALL LCD_CMDACALL DELAY5MSMOV A,#06H ;移动光标(光标减1)ACALL LCD_CMDACALL DELAY5MSMOV A,#80H ;显示第一行右边第一位位置ACALL LCD_CMDACALL DELAY5MSRET;************************************************************** * ;写指令数据到LCD;RS=L,RW=L,D0-D7=指令码,E=高脉冲;************************************************************** * LCD_CMD:ACALL CHECKBUSYLCD_CMD_NC:CLR LCD_RSCLR LCD_RWMOV P0,ASETB LCD_ENNOPNOPNOPNOPCLR LCD_ENRET;************************************************************** * ; 发送字符串子程序;************************************************************** * WRITE1:MOV R0,#16WRITE0:CLR AMOVC A,@A+DPTRINC DPTRACALL LCD_WDATACALL DELAY ;加延时形成滚动效果DJNZ R0,WRITE0RET;************************************************************** * ;写显示数据到LCD;RS=H,RW=L,D0-D7=数据,E=高脉冲;************************************************************** * LCD_WDATA:ACALL CHECKBUSYSETB LCD_RSCLR LCD_RWMOV P0,ASETB LCD_ENNOPNOPNOPNOPCLR LCD_ENRET;************************************************************** * ;检测LCD 控制器忙状态;读数据;RS=L,RW=H,E=H,输出:D0-D7=数据;************************************************************** * CHECKBUSY:PUSH ACCMOV P0,#0FFHCLR LCD_RSSETB LCD_RWSETB LCD_ENBUSYLOOP:NOPJB P0.7,BUSYLOOPCLR LCD_ENPOP ACCRET;************************************************************** * ;闪烁子程序;************************************************************** * SHAN:MOV A,#08H ;关闭显示ACALL LCD_CMDACALL DELAY4MOV A,#0CH ;开显示,关闭光标ACALL LCD_CMDACALL DELAY4DJNZ R4,SHANMOV R4,#02H ;设置闪烁次数RET;************************************************************** * ;延时120MS 子程序;发送字符串时使用;************************************************************** * DELAY:MOV R7,#240DL1: MOV R6,#250DL2: DJNZ R6,DL2DJNZ R7,DL1RET;************************************************************** * ;延时800MS 子程序;闪烁时使用;************************************************************** * DELAY4:MOV R0,#40DL3: MOV R1,#100DL4: MOV R2,#100DL5: DJNZ R2,DL5DJNZ R1,DL4DJNZ R0,DL3RET;************************************************************** * ;延时5MS子程序;LCD初始化使用;************************************************************** * DELAY5MS:MOV R1,#10DL6: MOV R2,#249DL7: DJNZ R2,DL7DJNZ R1,DL6RET;************************************************************** * ;延时1MS子程序;************************************************************** * DELAY1MS:MOV R6,#14H ;20DL8: MOV R7,#19H ;25DL9: DJNZ R7,DL9DJNZ R6,DL8RET;************************************************************** * CHAR1:DB "Welcome to Cras-"CHAR2:DB " yBoye WorkGroup"CHAR3:DB " QQ: 15910380 "CHAR4:DB "TEL: 139********";************************************************************** *END12864汇编程序X EQU 26H ;LCD 地址变量RS EQU P2.0RW EQU P2.1EN EQU P2.2PSB EQU P2.3RST EQU P2.5ORG 0000HJMP MAINORG 0003H ;外部中断INT0入口地址MAIN:MOV SP,#40HMOV A,#00HMOV R0,#20HLOOP0: MOV @R0,A ;20H-26H清零INC R0CJNE R0,#27H,LOOP0MOV IE,#81H ;允许总中断中断,使能INT0 外部中断MOV TCON,#01H ;触发方式为脉冲负边沿触发SETB RSTNOPSETB PSB ;8位数据,并口CALL SET_LCD ;初始化TS12864mCALL MENU1CALL MENU2CALL MENU3CALL MENU4LOOP1:MOV A,22HCJNE A,#40H,LOOP2LOOP2: CJNE A,#04H,LOOP3LOOP3: JMP LOOP1;====================================== =======; LCD 初始化设置;====================================== =======-SET_LCD:CLR ENMOV A,#34H ;34H--扩充指令操作CALL WCOMMOV A,#30H ;30H--基本指令操作CALL WCOMMOV A,#0CH ;开显示,关光标,CALL WCOMMOV A,#01H ;清除LCM 显示屏CALL WCOMRET;====================================== ============= ;在LCM 各行显示信息字符;====================================== ============= LCD_SHOW:CJNE A,#1,LINE2 ;判断是否为第一行LINE1: MOV A,#80H ;设置LCD 的第一行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#80H ;设置LCD 的第一行地址CALL WCOM ;写入命令JMP FILLLINE2: CJNE A,#2,LINE3 ;判断是否为第三行MOV A,#090H ;设置LCD 的第三行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#090H ;设置LCD 的第三行地址CALL WCOMJMP FILLLINE3: CJNE A,#3,LINE4 ;判断是否为第三行MOV A,#088H ;设置LCD 的第三行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#088H ;设置LCD 的第三行地址CALL WCOMJMP FILLLINE4: CJNE A,#4,LINE5 ;判断是否为第三行MOV A,#098H ;设置LCD 的第三行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#098H ;设置LCD 的第三行地址CALL WCOMFILL: CLR A ;填入字符MOVC A,@A+DPTR ;由消息区取出字符CJNE A,#0,LC1 ;判断是否为结束码LINE5: RETLC1: CALL WDA TA ;写入数据INC DPTR ;指针加1JMP FILL ;继续填入字符RET;====================================== =========== ;清除该行LCM 的字符;====================================== =========== CLR_LINE:MOV R0,#16CL1: MOV A,#' 'CALL WDATADJNZ R0,CL1RET;====================================== ============ ;LCM 显示工作菜单信息;====================================== ============ MENU1:MOV DPTR,#MENU1AMOV A,#1 ;在第一行显示信息CALL LCD_SHOWRETMENU1A: DB "MUC 控制GPRS模块",0MENU2:MOV DPTR,#MENU2AMOV A,#2 ;在第二行显示信息CALL LCD_SHOWRETMENU2A: DB "TEL:139********",0MENU3:MOV DPTR,#MENU3AMOV A,#3 ;在第三行显示信息CALL LCD_SHOWRETMENU3A: DB "方案设计: 龚伟",0MENU4:MOV DPTR,#MENU4AMOV A,#4 ;在第四行显示信息CALL LCD_SHOWRETMENU4A: DB "程序编写: 靳鹏",0;====================================== ======== ; 写指令使能子程序;RS=L,RW=L,D0-D7=指令码,E=高脉冲;====================================== ======== WCOM:MOV P0,ACLR RSCLR RWSETB ENCALL DELAY0CLR ENRET;====================================== ======= ;写数据使能子程序;RS=H,RW=L,D0-D7=数据,E=高脉冲;=============================================WDATA:MOV P0,ASETB RSCLR RWSETB ENCALL DELAY0CLR ENRETDELAY0: MOV R7,#250 ;延时500微秒DJNZ R7,$RET END。
在LCD1602上显示0--99999 源程序
======================================== 作者:Ni的年少W^o轻狂创建时间:2008.06.25========================================//==========程序功能===========// 在LCD1602上显示0--99999//=============================#include<reg51.h>#include"LCD1602.h"voidIntTOStr(uintn,uchar *str);ucharstr[10 ];//存储数据main(){uint count;LCD_init();LCD_write_command(0x01);//清屏显示delay(200);gotoxy(2,1);LCD_display("2008/06/27");gotoxy(3,2);LCD_display("01:56:56");delay1(2000);LCD_write_command(0x01);//清屏显示delay(200);gotoxy(2,1);LCD_display("LCD1602 TEST");gotoxy(4,2);LCD_display("SUCCESS");delay1(2000);LCD_write_command(0x01);//清屏显示delay(200);while(1){IntTOStr(count++,str);gotoxy(4,2);LCD_display(str);delay1(100);}}voidIntTOStr(uintn,uchar *str){uchar a[5];uchari,j;a[0]=(n/10000)%10;a[1]=(n/1000)%10;a[2]=(n/100)%10;a[3]=(n/10)%10;a[4]=(n/1)%10;for(i=0;i<5;i++)a[i]='0'+a[i];for(i=0; a[i]=='0' && i<=3; i++ );for(j=0;j<i;j++){*str=' '; str++;}for(; i<5; i++){*str=a[i];str++;}*str='\0';}========LCD驱动程序========#define LCD_DB P0//定义LCD的数据端口sbit LCD_RS=P2^0;sbit LCD_RW=P2^1;sbit LCD_E=P2^2;#define uchar unsigned char#define uint unsigned int//===========延时子函数======================== void delay(uint x){uinti,j;for(i=x;i>0;i--)for(j=0;j<2;j++);}//==================写指令函数================= voidLCD_write_command(uchar command){LCD_DB=command;LCD_RS=0;//指令LCD_RW=0;//写入LCD_E=1;LCD_E=0;delay(1);//等待执行完毕。