SET1602显示驱动汇编程序样例

合集下载

LCD1602汇编

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。

51单片机驱动1602液晶显示器c程序

51单片机驱动1602液晶显示器c程序

51单片机驱动1602液晶显示器c程序/*程序效果:单片机控制液晶显示器1602 显示字母数字,用户自行更改io程序原创安全:51hei*/#includereg52.h //头文件#define uchar unsigned char //宏定义#define uint unsigned intuchar code table[]=“51HEI XING XING “ ; //显示的字母uchar code table1[]=“51HEI MCUXUE YUAU” ;sbit lcdrs=P1; //寄存器选择引脚sbit lcdwr=P1;//读写引脚sbit lcde=P1 ; //片选引脚void delay(uchar x) //延时子函数{uchar i,j;for(i=x;i0;i--) for(j=110;j0;j--);}void write_com(uchar com) //写指令子函数{ //根据1602 液晶显示器协议编写P2=com; lcdrs=0;lcdwr=0;delay(5);lcde=0; delay(5);lcde=1; }void write_dat(uchar dat) //写数据子函数{P2=dat; lcdrs=1;lcdwr=0;delay(5);lcde=0;delay(5);lcde=1;}void init() //初始化子函数{write_com(0x01); //清屏write_com(0x3f); //功能设置write_com(0x0d); //显示控制write_com(0x06); //输入方式设置}void main(){ uchar i; //定义局部变量init();write_com(0x80+0x02+0x10); //指针的位置for(i=0;i15;i++) //显示{ write_dat(table[i]); delay(50); //延时,用于调节速度不匹配}write_com(0x80+0x40+0x10);for(i=0;i16;i++){ write_dat(table1[i]); delay(50);}for(i=0;i16;i++){ write_com(0x18); delay(50);} while(1);}tips:感谢大家的阅读,本文由我司收集整编。

1602液晶初始化程序(汇编)

1602液晶初始化程序(汇编)

〔原创〕1602液晶初始化程序(2007-12-22 18:10:40)标签:1602液晶it/科技汇编语言液晶初始化,显示数字,按秒计数RS EQU P2.0RW EQU P2.1E EQU P2.2IN_0 EQU P0SECL EQU 40H ;秒低位SECH EQU 41H ;秒高位MH1 EQU 42H ;冒号MINL EQU 43H ;分低位MINH EQU 44H ;分高位MH2 EQU 45H ;冒号HOURL EQU 46H ;时低位HOURH EQU 47H ;时高位;*********************************ORG 0000HAJMP STARTORG 000BHAJMP INTT_0START:MOV SP,#70HMOV R2,#20ACALL INIT_LCD ;初始化液晶MOV R5,#00HMOV IN_0,#84H ;写入显示起始地址(第一行第五个位置ACALL ENABLEMOV TH0,#3fH ;50MSMOV TL0,#0b0HMOV TMOD,#01HACALL SJCZSTART1:SETB EASETB ET0SETB TR0LCALL WDATAAJMP START1;*****时间初值*******SJCZ: MOV 40H,#8 ;显示初值是 08:08:08MOV 41H,#0MOV 42H,#10MOV 43H,#8MOV 44H,#0MOV 45H,#10MOV 46H,#8MOV 47H,#0RET;****T0定时器中断****INTT_0: PUSH ACCMOV TL0,#0b0H ;送定时初值MOV TH0,#3fHDJNZ R2,TTMOV R2,#20INC SECL ;秒记数,到60S就清0MOV A,SECLCJNE A,#0AH,TTINC SECHMOV SECL,#0MOV A,SECHCJNE A,#06H,TTMOV SECH,#0INC MINL ;分记数,到60分请0MOV A,MINLCJNE A,#0AH,TTMOV MINL,#0INC MINHMOV A,MINHCJNE A,#06H,TTMOV MINH,#0INC HOURL ;时记数,到24时清0MOV A,HOURLCJNE A,#04H,TT2MOV A,HOURHCJNE A,#02H,TT1MOV HOURL,#0MOV HOURH,#0AJMP TTTT2: CJNE A,#0AH,TTMOV HOURL ,#0INC HOURHAJMP TTTT1: MOV A,HOURLCJNE A,#0AH,TTMOV HOURL ,#0INC HOURHAJMP TTTT: POP ACCRETI;*******液晶初始化*****INIT_LCD:CALL DELAYL ;延时20ms,等待LCD完成电源的启动MOV IN_0,#01H ;清屏并光标复位ACALL ENABLEMOV IN_0,#38H ;设置显示模式:8位2行5x7点阵ACALL ENABLEMOV IN_0,#0FH ;显示器开、光标开、光标允许闪烁ACALL ENABLEMOV IN_0,#06H ;文字不动,光标自动右移ACALL ENABLEMOV IN_0,#0C0H ;写入显示起始地址(第二行第一个位置)ACALL ENABLERET;******写数据程序***WDATA: MOV IN_0,#84H ;写入显示起始地址(第一行第五个位置ACALL ENABLEMOV R1,#8MOV R0,#47HWDATA1: MOV A,@R0MOV DPTR,#TABLEMOVC A,@A+DPTRMOV IN_0,A ;写入数据SETB RSCLR RWCLR EACALL CHECKBUSYSETB E ; 忙检测DEC R0DJNZ R1,WDATA1MOV R1,#8RET;*******显示字母表********TABLE: DB 30H,31H,32H,33H,34H,35H ;0 1 2 3 4 5DB 36H,37H,38H,39H,3AH,80H,2EH ;6 7 8 9 : 空格 .;*********写指令*****ENABLE: CLR RS ;写入控制命令的子程序CLR RWCLR EACALL CHECKBUSYSETB ERET;*******程序忙检测***CHECKBUSY:MOV IN_0,#0FFH ;判断液晶显示器是否忙的子程序CLR RSSETB RWCLR ENOPSETB EJB P0.7,CHECKBUSY ;如果P1.7为高电平表示忙就循环等待RET;******延时程序****DELAY: MOV R6,#50DEL: MOV R7,#48DJNZ R7,$DJNZ R6,DELRETDELAYL: MOV R7,#100 ;长延时20msD1: MOV R6,#98DJNZ R6,$DJNZ R7,D1RETEND51单片机的1602没做过,只做过其他的控制。

LCD1602显示屏的驱动设置及例程

LCD1602显示屏的驱动设置及例程

LCD1602显示屏的驱动设置及例程一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。

我手里这块LCD1602的型号是HJ1602A,是绘晶科技公司的产品,它有16条引脚。

如图1所示:图1再来一张它的背面的,如图2所示:引脚号符号引脚说明引脚号符号引脚说明1VSS电源地9D2数据端口2VDD电源正极10D3数据端口3VO偏压信号11D4数据端口4RS命令/数据12D5数据端口5RW读/写13D6数据端口6E使能14D7数据端口图2它的16条引脚定义如下:对这个表的说明:1. VSS接电源地。

2. VDD接+5V。

3. VO是液晶显示的偏压信号,可接10K的3296精密电位器。

或同样阻值的RM065/RM063蓝白可调电阻。

见图3。

图34. RS是命令/数据选择引脚,接单片机的一个I/O,当RS为低电平时,选择命令;当RS为高电平时,选择数据。

5. RW是读/写选择引脚,接单片机的一个I/O,当RW为低电平时,向LCD1602写入命令或数据;当RW为高电平时,从LCD1602读取状态或数据。

如果不需要进行读取操作,可以直接将其接VSS。

6. E,执行命令的使能引脚,接单片机的一个I/O。

7. D0—D7,并行数据输入/输出引脚,可接单片机的P0—P3任意的8个I/O口。

如果接P0口,P0口应该接—10K的上拉电阻。

如果是4线并行驱动,只须接4个I/O口。

8. A背光正极,可接一个10—47欧的限流电阻到VDD。

7D0数据端口15A背光正极8D1数据端口16K背光负极9. K背光负极,接VSS。

见图4所示。

图4二.基本操作LCD1602的基本操作分为四种:1. 读状态:输入RS=0,RW=1,E=高脉冲。

输出:D0—D7为状态字。

2. 读数据:输入RS=1,RW=1,E=高脉冲。

输出:D0—D7为数据。

3. 写命令:输入RS=0,RW=0,E=高脉冲。

LCD1602显示~~C程序

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 。

1602液晶滚动显示汇编程序

1602液晶滚动显示汇编程序
ms2:djnz 31h,ms2
djnz 30h,ms1
ret
dely_us:mov 30h,#30
us:djnz 30h,us
ret
dely:mov 30h,#5
y1:mov 31h,#200
y2:mov 32h,#200
y3:djnz 32h,y3
djnz 31h,y2
djnz 30h,y1
ret
tab1:db "Baby I love you for life! "
db 00
end
sz7:clr rs
clr rw
mov p0,#90h
setb ep
nop
nop
clr ep
lcall dely_us
ret
//写入数据
xr: lcall sz4
setb rs //数据标志位
clr rw //写入标志位
mov a,r1
movc a,@a+dptr //查表
jz gret //检测是否显示完全//零为标志位
mov p0,a //并行输出数据
setb ep
nop
nop
clr ep
lcall dely
inc r1 //读下一个字符
lcall sz1 //清屏初始化设置
lcall sz7 //设置第一行显示坐标
mov dptr,#tab1 //设置段码表地址一行显示段码表
lcall xr
ys:lcall dely
ljmp main
//清屏指令写入
sz1:clr rs //写指令标志

液晶显示控制(1602)c语言实例

液晶显示控制(1602)c语言实例

DB1 低4位三态、 双向数据总线 1位
9
DB2 低4位三态、 双向数据总线 2位
10 DB3 低4位三态、 双向数据总线 3位
11 DB4 高4位三态、 双向数据总线 4位
12 DB5 高4位三态、 双向数据总线 5位
13 DB6 高4位三态、 双向数据总线 6位
14 DB7 高4位三态、 双向数据总线 7位 (最高位)(也是busy flag)
4 可视角度
➢大多数光都是从屏幕中垂直射出来的,所以从某一个 较大的角度观看液晶显示器时,便不能看到原本的颜 色,甚至只能看到全白或全黑。为了解决这个问题, 到目前为止有三种比较流行的技术,分别是: TN+FILM、IPS(IN-PLANE -SWITCHING)和 MVA(MULTI-DOMAIN VERTICAL align MENT)。
(8)写指令38H:显示模式设置; (9)写指令08H:显示关闭;
(10)写指令01H:显示清屏; (11)写指令06H:显示光标移动设置; (12)写指令0CH:显示开及光标设置;
2011年春
LCD 1602初始化函数实例
void Initialize_LCD( )
{
Write_LCD_Command(0x38);
4 RS RS为寄存器选择,高电平1时选择数据寄 存器、低电平0时选择指令寄存器。
5 R/W R/W为读写信号线,高电平时进行读操作, 低电平时进行写操作。
6E
E(或EN)端为使能(enable)端,下降沿使 能。
2011年春
引脚 符号
功能说明
7
DB0 低4位三态、 双向数据总线 0位
(最低位)
8
(2)写指令: 输入:RS=L;RW=L; D0~D7=指令码;E=高脉冲

我的51单片机之 液晶1602 的C语言和汇编编程

我的51单片机之 液晶1602 的C语言和汇编编程

//三次显示模式设置,不检测忙信号
//显示模式设置,开始要求每次检测忙信号 //关闭显示 //显示清屏 // 显示光标移动设置 // 显示开及光标设置
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
#include<reg51.h>
#include<intrins.h>
#define DBPort P1 //液晶数据口
sbit RW=P0^1; //寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器
sbit RS=P0^0; //读写信号线,高电平时进行读操作,低电平时进行写操作。
sbit E=P0^2;
void main(void) {
Delay400Ms(); Init(); //LCM 初始化 DisplayListChar(0, 1, uctech); DisplayListChar(0, 0, net); while(1); }
//第二行第一列开始 //第一行第一列开始
//写数据 void WriteData(unsigned char WD) {
ReadStatus(); //检测忙 DBPort = WD; RS = 1; RW = 0; E = 0; //可加小延时 delay(); E = 1; }
//写指令 void WriteCommand(unsigned char WC,BuysC) {
if (BuysC) ReadStatus(); DBPort = WC; RS = 0; RW = 0; E = 0; E = 1; }

液晶1602 C语言驱动程序

液晶1602 C语言驱动程序
HC1602WriteCmd(systemtab[i]);
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:要显示的字符
返回 值 :
说 明:
--------------------------------------------------------------------*/

STM32的LCD1602显示程序

STM32的LCD1602显示程序

STM32的LCD1602显⽰程序STM32的LCD1602显⽰程序以下为课设期间为1602显⽰屏驱动写的stm32的程序,其中参考了许多⼤佬的例⼦程序设计:硬件原理:D0-D7⽤的是PD0-PD7,RS为PB10,E为PB11,RW为PB12,使⽤的板⼦是STM32F103VET6下⾯是我的程序,只完成了基础功能,并没有⾃定义字模部分的代码lcd.h#ifndef __LCD_H#define __LCD_H#include "stm32f10x.h"/////////////////////////////////////////////////////////#define D0_1 GPIO_SetBits(GPIOD,GPIO_Pin_0)#define D0_0 GPIO_ResetBits(GPIOD,GPIO_Pin_0)#define D1_1 GPIO_SetBits(GPIOD,GPIO_Pin_1)#define D1_0 GPIO_ResetBits(GPIOD,GPIO_Pin_1)#define D2_1 GPIO_SetBits(GPIOD,GPIO_Pin_2)#define D2_0 GPIO_ResetBits(GPIOD,GPIO_Pin_2)#define D3_1 GPIO_SetBits(GPIOD,GPIO_Pin_3)#define D3_0 GPIO_ResetBits(GPIOD,GPIO_Pin_3)#define D4_1 GPIO_SetBits(GPIOD,GPIO_Pin_4)#define D4_0 GPIO_ResetBits(GPIOD,GPIO_Pin_4)#define D5_1 GPIO_SetBits(GPIOD,GPIO_Pin_5)#define D5_0 GPIO_ResetBits(GPIOD,GPIO_Pin_5)#define D6_1 GPIO_SetBits(GPIOD,GPIO_Pin_6)#define D6_0 GPIO_ResetBits(GPIOD,GPIO_Pin_6)#define D7_1 GPIO_SetBits(GPIOD,GPIO_Pin_7)#define D7_0 GPIO_ResetBits(GPIOD,GPIO_Pin_7)#define RS_1 GPIO_SetBits(GPIOB,GPIO_Pin_10)#define RS_0 GPIO_ResetBits(GPIOB,GPIO_Pin_10)#define RW_1 GPIO_SetBits(GPIOB,GPIO_Pin_12)#define RW_0 GPIO_ResetBits(GPIOB,GPIO_Pin_12)#define E_1 GPIO_SetBits(GPIOB,GPIO_Pin_11)#define E_0 GPIO_ResetBits(GPIOB,GPIO_Pin_11)/////////////////////////////////////////////////////////void LCD_Init(void);//初始化void LCD_Clear(void);//清除显⽰void LCD_CursorReset(void);//光标返回void LCD_SetInput(u16,u16);//置输⼊模式void LCD_Display(u16,u16,u16);//显⽰开关控制void LCD_COD(u16,u16);//光标或显⽰移动指令void LCD_Mode(u16,u16,u16);//⼯作⽅式设置void LCD_CGRAM_Addr(u8);//设置CGRAN地址,除置位位以外共六位void LCD_DDRAM_Addr(u8);//设置DDRAM地址,除置位位以外共七位void LCD_RB(void);//当1602处于忙状态时,不接受指令,当不忙时,接受指令void LCD_Write(u8);//写⼊数据void LCD_Read(void);//读取数据void LCD_WriteStr(u8*,int);//写⼊字符串#endiflcd.c#include "lcd.h"#include "stm32f10x_gpio.h"void LCD_Init(void){GPIO_InitTypeDef GPIO_LCDStr;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_LCDStr.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_LCDStr.GPIO_Speed=GPIO_Speed_50MHz;GPIO_LCDStr.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; GPIO_Init(GPIOD,&GPIO_LCDStr);GPIO_LCDStr.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_10;GPIO_Init(GPIOB,&GPIO_LCDStr);}//////////////////////////////////////////////////////////////////////////////void LCD_Clear(void){E_0;LCD_RB();RS_0;RW_0;GPIO_Write(GPIOD,0x01);E_1;E_0;}//////////////////////////////////////////////////////////////////////////////////void LCD_CursorReset(void){E_0;LCD_RB();RS_0;RW_0;GPIO_Write(GPIOD,0x02);E_1;E_0;}//////////////////////////////////////////////////////////////////////////////////////void LCD_SetInput(u16 ID,u16 S){E_0;LCD_RB();RS_0;RW_0;D7_0;D6_0;D5_0;D4_0;D3_0;D2_1;if(ID==1)/*⾼电平光标右移,低电平左移*/D1_1;else if(ID==0)D1_0;if(S==1)/*屏幕上所有的⽂字是否左移或右移,⾼电平有效,低电平⽆效*/ D0_1;else if(S==0)D0_0;E_1;E_0;}//////////////////////////////////////////////////////////////////////////////////////////void LCD_Display(u16 D,u16 C,u16 B){E_0;LCD_RB();RS_0;RW_0;D7_0;D6_0;D5_0;D4_0;D3_1;if(D==1)//⾼电平开,低电平关D2_1;else if(D==0)D2_0;if(C==1)//⾼电平有光标,低电平⽆光标D1_1;else if(C==0)D1_0;if(B==1)//光标是否闪烁,⾼电平闪烁,低电平⽆D0_1;else if(B==0)D0_0;E_1;E_0;}////////////////////////////////////////////////////////////////////////////////////////////void LCD_COD(u16 SC,u16 RL){E_0;LCD_RB();RS_0;RW_0;D7_0;D6_0;D5_0;D4_1;D1_1;D0_1;if(SC==1)//⾼电平显⽰移动的⽂字,低电平移动坐标D3_1;else if(SC==0)D3_0;if(RL==1)//⾼电平右移,低电平左移D2_1;else if(RL==0)D2_0;E_1;E_0;}////////////////////////////////////////////////////////////////////////////////////////////void LCD_Mode(u16 DL,u16 N,u16 F){E_0;LCD_RB();E_1;RS_0;RW_0;D7_0;D6_0;D5_1;D1_1;D0_1;if(DL==1)//⾼电平⼋位数据接⼝,低电平四位数据接⼝D4_1;else if(DL==0)D4_0;if(N==1)//⾼电平两⾏显⽰,低电平⼀⾏显⽰D3_1;else if(N==0)D3_0;if(F==1)//⾼电平5x10点阵,低电平5x8点阵D2_1;else if(F==0)D2_0;E_0;}////////////////////////////////////////////////////////////////////////////////////////void LCD_CGRAM_Addr(u8 addr)//{E_0;LCD_RB();RS_0;RW_0;D6_1;E_1;E_0;}//////////////////////////////////////////////////////////////////////////////void LCD_DDRAM_Addr(u8 addr)//{E_0;LCD_RB();RS_0;RW_0;GPIO_Write(GPIOD,0x0000);//清空地址GPIO_Write(GPIOD,addr);E_1;E_0;}//////////////////////////////////////////////////////////////////////////////////void LCD_RB(void)//{GPIO_InitTypeDef pp;RS_0;RW_1;pp.GPIO_Mode=GPIO_Mode_IN_FLOATING;pp.GPIO_Speed=GPIO_Speed_50MHz;pp.GPIO_Pin=GPIO_Pin_7;GPIO_Init(GPIOD,&pp);//将端⼝设为输⼊E_1;while(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7));//若忙信号存在,则⼀直循环,直⾄忙信号结束E_0;pp.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; pp.GPIO_Mode=GPIO_Mode_Out_PP;pp.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOD,&pp);//将端⼝重新设为输出}//////////////////////////////////////////////////////////////////////////////////////////void LCD_Write(u8 data)//{LCD_RB();RS_1;RW_0;E_1;GPIO_Write(GPIOD,data);E_0;}////////////////////////////////////////////////////////////////////////////void LCD_Read(void)//{LCD_RB();RS_1;RW_1;E_1;E_0;}////////////////////////////////////////////////////////////////////////////void LCD_WriteStr(u8 *str,int length)//{int i=0;for(i=0;i<length;i++){if(i<=15){LCD_DDRAM_Addr(0x80+i);LCD_Write(str[i]);}else{LCD_DDRAM_Addr(0xc0+i-16);LCD_Write(str[i]);}}}main.c#include "lcd.h"#include "string.h"int main(){u8 strMCU[]=" **** YOU 1602! TEST TEST "; LCD_Init();LCD_Clear();LCD_SetInput(1,0);LCD_Display(1,0,0);LCD_Mode(1,1,0);LCD_WriteStr(strMCU,strlen(strMCU));。

LCD1602驱动及显示计数值程序

LCD1602驱动及显示计数值程序
1.6.2 显示开/关及光标设置
1.6.3 数据指针设置 1.6.4 其它设置
5
1.7 外形
嵌入式应用软件园,版权所有,请勿转载/销售。
6
嵌入式应用软件园,版权所有,请勿转载/销售。
第 2 章 程序功能
程序中包含 LCM 用到的所有函数:初始化、写指令、写数据、判忙碌、清屏 幕。
单片机外接 2x2 (P3.7,P3.6 与 P3.0,P3.1)矩阵键盘,利用定时器 T0 的定时中断, 查询矩阵键盘。矩阵键盘被命名为 A、B、C、D。对键盘被按下的次数进行计数, 计数值会在 LCM 上显示。
LCM 与单片机的连接
7
嵌入式应用软件园,版权所有,请勿转载/销售。
第 3 章 程序代码
我们的辛勤付出,需要您的肯定,请访问: 嵌入式应用软件园。
;******************************************************************************
9
嵌入式应用软件园,版权所有,请勿转载/销售。
LCALL WRITE_DATA MOV A,#10001010B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#3AH LCALL WRITE_DATA ;显示 C: MOV A,#11000000B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#43H LCALL WRITE_DATA MOV A,#11000001B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#3AH LCALL WRITE_DATA ;显示 D: MOV A,#11001001B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#44H LCALL WRITE_DATA MOV A,#11001010B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#3AH LCALL WRITE_DATA ;计数的循环,一直执行,永不跳出 START: MOV LCM_P,#10000010B ;数据指针(显示地址设置) MOV R0,#A4 LCALL DISP MOV LCM_P,#10001011B ;数据指针(显示地址设置) MOV R0,#B4 LCALL DISP MOV LCM_P,#11000010B ;数据指针(显示地址设置) MOV R0,#C4 LCALL DISP MOV LCM_P,#11001011B ;数据指针(显示地址设置) MOV R0,#D4 LCALL DISP LJMP START

用1602液晶显示万年历用汇编程序

用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液晶显示屏做个万年历,在显示屏上显示年、月、日、时、分、秒、星期。

1602四线八线驱动程序,非常完整

1602四线八线驱动程序,非常完整

/*--------------------------------------------------------------*///防止被重复定义#ifndef __LCD1602_8A_H__#define __LCD1602_8A_H__/*--------------------------------------------------------------*///模式选择(条件编译)#define Port_Type_Select 1 //=1, 选择八位数据模式//=0, 选择四位数据模式, LCD高四位接MCU端口高四位#defineInt_Transfer 1 //=1, 允许中断服务函数调用//=0, 不允许中断服务函数调用/*--------------------------------------------------------------*///LCD1602与单片机接口定义#define LCD_IO P0 //P0-0x80,P1-0x90,P2-0xA0,P3-0xB0; sbit LCD_RS = P1^0; //LCD数据/命令选择端(H/L)sbit LCD_RW = P1^1; //LCD 读/写选择端(H/L)sbit LCD_EN = P1^2; //LCD使能控制端/*--------------------------------------------------------------*///工作方式设置#define LCD_DISPLAY8_DOUBLE_LINE LCD_cmd(0x38); //两行显示8-bits#define LCD_DISPLAY8_SINGLE_LINE LCD_cmd(0x30); //单行显示8-bits#define LCD_DISPLAY4_DOUBLE_LINE LCD_cmd(0x28); //两行显示4-bits#define LCD_DISPLAY4_SINGLE_LINE LCD_cmd(0x20); //单行显示4-bits/*--------------------------------------------------------------*///输入方式设置#define LCD_AC_AUTO_INCREMENT LCD_cmd(0x06); //数据读、写操作后,AC 自动加1#define LCD_AC_AUTO_DECREASE LCD_cmd(0x04); //数据读、写操作后,AC自动减1#define LCD_MOVE_ENABLE LCD_cmd(0x07); //数据读、写操作,画面平移#define LCD_MOVE_DISENABLE LCD_cmd(0x06); //数据读、写操作,画面不动/*--------------------------------------------------------------*///设置显示、光标及闪烁开、关#define LCD_DISPLAY_ON LCD_cmd(0x0c); //LCD开显示#define LCD_DISPLAY_OFF LCD_cmd(0x08); //LCD关显示#define LCD_CURSOR_ON LCD_cmd(0x0e); //光标显示#define LCD_CURSOR_OFF LCD_cmd(0x0c); //光标不显示#define LCD_CURSOR_BLINK_ON LCD_cmd(0x0f); //光标闪烁#define LCD_CURSOR_BLINK_OFF LCD_cmd(0x0e); //光标不闪烁#define LCD_GO_HOME LCD_cmd(0x02); //AC=0,光标、画面回HOME位, DDRAM内容不变#define LCD_CLR LCD_cmd(0x01); //LCD清屏, 清除DDRAM, 清除屏幕, 置AC为0, 光标回位?/*--------------------------------------------------------------*///光标、画面移动,不影响DDRAM#define LCD_LEFT_MOVE LCD_cmd(0x18); //LCD显示左移一位#define LCD_RIGHT_MOVE LCD_cmd(0x1c); //LCD显示右移一位#define LCD_CURSOR_LEFT_MOVE LCD_cmd(0x10); //光标左移一位#define LCD_CURSOR_RIGHT_MOVE LCD_cmd(0x14); //光标右移一位/*--------------------------------------------------------------*///LCD1602地址相关/*#define LINE1_HEAD 0x80 //第一行DDRAM起始地址#define LINE2_HEAD 0xc0 //第二行DDRAM起始地址#define LINE1 0 //第一行#define LINE2 1 //第二行#define LINE_LENGTH 16 //每行的最大字符长度(40-DDRAM)/*--------------------------------------------------------------*///函数声明void LCD_busy (void); //检测LCD是否忙void LCD_init (void); //LCD初始化void LCD_cmd (unsigned char cmd); //写入指令void LCD_dat (unsigned char dat); //写入数据void LCD_pos (unsigned char x, unsigned char y); //显示定位void LCD_printc(unsigned char x, unsigned char y, unsigned char c); //定位输出字符void LCD_prints(unsigned char x, unsigned char y, unsigned char *s); //定位输出字符串void LCD_printn(unsigned char x, unsigned char y, unsigned int num); //定位输出16位二进制数字unsigned char LCD_current_addr(void); //读出AC当前地址(DB6~DB0)或忙标志位DB7unsigned char LCD_current_addr_dat(void); //读出AC当前地址的数据//unsigned char LCD_addr_dat(unsigned char x, unsigned char y); //读出AC指定地址的数据//void LCD_pos_CG(unsigned char x, unsigned char *CGRAM_dat); //指定地址(x: 0-7)写入8bytes数据CGRAM/*--------------------------------------------------------------*/ //读出AC当前地址(DB6~DB0)或忙标志位DB7#if Port_Type_Select //选择八位数据模式unsigned char LCD_current_addr(void){unsigned char ac_addr;LCD_EN = 0;LCD_RS = 0; //指令LCD_RW = 1; //读出LCD_IO = 0xff; //端口置为输入方式(P0)LCD_EN = 1;ac_addr = LCD_IO;LCD_EN = 0;return (ac_addr);}#else //选择四位数据模式unsigned char LCD_current_addr(void) {unsigned char ac_addr;LCD_EN = 0;LCD_RS = 0; //指令LCD_RW = 1; //读出LCD_IO |= 0xf0; //端口置为输入方式(P0) LCD_EN = 1;ac_addr = LCD_IO & 0xf0; //高四位LCD_EN = 0;LCD_EN = 1;ac_addr |= LCD_IO >> 4; //低四位LCD_EN = 0;return (ac_addr);}#endif/*--------------------------------------------------------------*/ //检测LCD忙状态#if Int_Transfer //允许中断服务函数调用void LCD_busy(void)unsigned char ac_dat;unsigned char busy_flag;do{ac_dat = LCD_current_addr();busy_flag = ac_dat & 0x80;}while(busy_flag); //=1表示忙, =0表示空闲}#else //不允许中断服务函数调用void LCD_busy(void){unsigned char ac_dat;bit busy_flag;do{ac_dat = LCD_current_addr();busy_flag = (bit)(ac_dat & 0x80);}while(busy_flag); //=1表示忙, =0表示空闲#endif///*--------------------------------------------------------------*/ ////读出AC当前地址的数据//#if Port_Type_Select //选择八位数据模式//unsigned char LCD_current_addr_dat(void)//{//unsigned char addr_dat;//// unsigned char i;//LCD_busy(); //或者检查忙最可靠//// for(i = 0; i < 3; i++) //要连续读出三次才会有效//{//LCD_EN = 0;//LCD_RS = 1; //数据//LCD_RW = 1; //读出//LCD_IO = 0xff; //端口置为输入方式(P0)//LCD_EN = 1;//addr_dat = LCD_IO;//LCD_EN = 0;//}//return (addr_dat);//}//#else //选择四位数据模式//unsigned char LCD_current_addr_dat(void)//{//unsigned char addr_dat;//// unsigned char i;//LCD_busy(); //或者检查忙最可靠//// for(i = 0; i < 3; i++) //要连续读出三次才会有效//{ //LCD_EN = 0;//LCD_RS = 1; //数据//LCD_RW = 1; //读出//LCD_IO |= 0xf0; //端口置为输入方式(P0)//LCD_EN = 1;//addr_dat = LCD_IO & 0xf0; //高四位//LCD_EN = 0;//LCD_EN = 1;//addr_dat |= LCD_IO >> 4; //低四位//LCD_EN = 0;//}//return (addr_dat);//}//#endif/*--------------------------------------------------------------*/ //写入指令#if Port_Type_Select //选择八位数据模式void LCD_cmd(unsigned char cmd){LCD_busy(); //检测忙LCD_RS = 0; //指令LCD_RW = 0; //写入LCD_EN = 1;LCD_IO = cmd; //传指令LCD_EN = 0; //下降沿有效}#else //选择四位数据模式void LCD_cmd(unsigned char cmd) {LCD_busy(); //检测忙LCD_IO &= 0x0f; //清高四位LCD_RS = 0; //指令LCD_RW = 0; //写入LCD_EN = 1;LCD_IO |= cmd & 0xf0; //写高四位LCD_EN = 0; //下降沿有效cmd <<= 4; //低四位移到高四位LCD_IO &= 0x0f; //清高四位LCD_EN = 1;LCD_IO |= cmd & 0xf0; //写高四位LCD_EN = 0; //下降沿有效}#endif/*--------------------------------------------------------------*/ //写入数据#if Port_Type_Select //选择八位数据模式void LCD_dat(unsigned char dat){LCD_busy(); //检测忙LCD_RS = 1; //数据LCD_RW = 0; //写入LCD_EN = 1;LCD_IO = dat; //传数据LCD_EN = 0; //下降沿有效}#else //选择四位数据模式void LCD_dat(unsigned char dat) {LCD_busy(); //检测忙LCD_IO &= 0x0f; //清高四位LCD_RS = 1; //数据LCD_RW = 0; //写入LCD_EN = 1;LCD_IO |= dat & 0xf0; //写高四位LCD_EN = 0; //下降沿有效dat <<= 4; //低四位移到高四位LCD_IO &= 0x0f; //清高四位LCD_EN = 1;LCD_IO |= dat & 0xf0; //写高四位LCD_EN = 0; //下降沿有效}#endif/*--------------------------------------------------------------*///显示定位DDRAMvoid LCD_pos(unsigned char x, unsigned char y){if(y) LCD_cmd(x|0xc0);//y=1第二行显示,y=0第一行显示0<=x<16(40-DDRAM)else LCD_cmd(x|0x80);//数据指针=80+地址码(00H~27H,40H~67H) }///*--------------------------------------------------------------*/////指定地址(x: 0-7)写入8bytes数据CGRAM//void LCD_pos_CG(unsigned char x, unsigned char *CGRAM_dat)//{//unsigned char i;//x <<= 3; //转化为6位数据的高三位,就是x*8;//x |= 0x40;//LCD_cmd(x); //写入地址//for(i = 0; i < 8; i++)//LCD_dat(CGRAM_dat[i]); //写入数据//}///*--------------------------------------------------------------*/////读出AC指定地址的数据//unsigned char LCD_addr_dat(unsigned char x, unsigned char y) //{//unsigned char addr_dat;//LCD_pos(x, y); //定位//addr_dat = LCD_current_addr_dat(); //读出数据//return (addr_dat);//}/*--------------------------------------------------------------*///定位输出字符void LCD_printc(unsigned char x, unsigned char y, unsigned char c) {LCD_pos(x, y);LCD_dat(c);}/*--------------------------------------------------------------*///定位输出字符串void LCD_prints(unsigned char x, unsigned char y, unsigned char *s) {LCD_pos(x, y);while(*s){LCD_dat(*s);s++;}}/*--------------------------------------------------------------*///定位输出16位二进制数字// 0<= num <65536void LCD_printn(unsigned char x, unsigned char y, unsigned int num) {char i=0;unsigned char ii=0;unsigned char dat[6]={0,0,0,0,0,0};for(i = 0; i < 6; i++) dat[i] = 0; i = 0; //初始化数据while(num / 10) //拆位{dat[i] = num % 10; //最低位num /= 10; i++;}dat[i] = num; //最高位ii = i; //保存dat的位数for(; i >= 0; i--) dat[i] += 48; //转化成ASCIILCD_prints(x, y, " "); //清显示区域LCD_pos(x, y);for(i = ii; i >= 0; i--) LCD_dat(dat[i]); //输出数字字符///*--------------------------------------------------------------*/////定位输出32位二进制数字//// 0<= num <65536//void LCD_print_long(unsigned char x, unsigned char y, unsigned long num)//{////char i;//unsigned char ii;//unsigned char dat[11];//for(i = 0; i < 11; i++) dat[i] = 0; i = 0; //初始化数据//while(num / 10) //拆位//{//dat[i] = num % 10; //最低位//num /= 10; i++;//}//dat[i] = num; //最高位//ii = i; //保存dat的位数//for(; i >= 0; i--) dat[i] += 48; //转化成ASCII//LCD_prints(x, y, " "); //清显示区域//LCD_pos(x, y);//for(i = ii; i >= 0; i--)// LCD_dat(dat[i]); //输出数字字符//}/*--------------------------------------------------------------*/ //LCD初始化void LCD_init(void){#if Port_Type_Select //选择八位数据模式LCD_DISPLAY8_DOUBLE_LINE //设置LCD为16X2显示,5X7点阵,八位数据接口#elseLCD_DISPLAY4_DOUBLE_LINE //设置LCD为16X2显示,5X7点阵,四位数据接口#endifLCD_AC_AUTO_INCREMENT //LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)LCD_DISPLAY_ON //LCD开显示及光标设置(光标不闪烁,不显示"_")LCD_CLR //清屏}/*--------------------------------------------------------------*/ #endif。

单片机驱动LCD1602显示字符串程序

单片机驱动LCD1602显示字符串程序

;声 明: ; ; ;
版权所有,嵌入式应用软件园。 此文件只限购买者个人使用,请勿在互联网中传播,如有侵权,将追究相应责任。 如需单片机代码/技术支持,请访问:嵌入式应用软件园
如需源代码/此代码技术支持,请访问: 嵌入式应用软件园。
8
;****************************************************************************** ;函数名:DISP ;输 入:无 ;输 出:无 ;调 用:WRITE_DATA ;描 述:显示字符串到 LCM ;****************************************************************************** ;*******子程序******** DISP:
MOV A,#00000001B
7
嵌入式应用软件园,版权所有,请勿转载/销售。
LCALL WRITE_COM RET
;****************************************************************************** ;函数名:DEL ;输 入:无 ;输 出:无 ;调 用:无 ;描 述:延时 ;****************************************************************************件园,版权所有,请勿转载/销售。
第 1 章 程序功能
程序中包含 LCM 用到的所有函数:初始化、写指令、写数据、判忙碌、清屏 幕。
单片机(51/STC)P1.1,P1.2,P1.3,P1.4 外接按键,按下不同的按键,LCM 上会显 示不同的字符串,用于报警。

Task 2 驱动1602液晶显示

Task 2 驱动1602液晶显示

驱动1602液晶显示任务要求:1、弄清楚液晶1602驱动的原理,理解并写在实训报告中2、在DE2板上的液晶上显示你的名字和学校的名字。

建议步骤:1、建立所需其他辅助模块,包括分频等;2、建立LCD控制模块(用纯硬件实现,也可以先实现NIOS II,再用C实现);通过1602时序资料我们知道LCD_EN最小允许脉冲宽度周期为900纳秒(无最大值)、数据传输允许的最小时钟周期为1000纳秒,由于我们DE2实验板为50MHZ因此我们这里分频时钟周期大于1微秒就可,这里分频为4HZ。

本实验在LCD1602中间第一行,第二行分别显示某个字符,并且显示完后,以一定的速率向左循环移动。

module lcd1602(clk,rst,lcd_e,lcd_rw,lcd_rs,data,lcd_on,lcd_blon);input clk,rst;output lcd_e,lcd_rw,lcd_rs,lcd_blon,lcd_on;output [7:0] data;reg lcd_rw,lcd_rs;reg [7:0] data;reg [9:0] state;reg [5:0] address;reg [22:0] cnt;reg clk500hz;parameter IDLE =10'b0000000000;parameter CLEAR =10'b0000000001; //清屏parameter RETURNCURSOR =10'b0000000010; //归home位parameter SETMODE =10'b0000000111;//输入方式设置,读写数据后ram地址增/减1;画面动/不动parameter SWITCHMODE =10'b0000001111;//显示状态设置,显示开/关;光标开/关;闪烁开/关parameter SHIFT =10'b0000011100;//光标画面滚动画面/光标平移一位;左/右平移一位parameter SETFUNCTION =10'b0000111100;//工作方式设置1:8/1:4位数据接口;两行/一行显示;5x10/5x7点阵parameter SETCGRAM =10'b0001000000; //设置CGRAMparameter SETDDRAM1 =10'b0010000001; //设置DDRAMparameter SETDDRAM2 =10'b0010000010; //设置DDRAMparameter READFLAG =10'b010*******; //读状态parameter WRITERAM1 =10'b1000000001; //写RAMparameter WRITERAM2 =10'b1000000010; //写RAMparameter READRAM =10'b1100000000; //读RAMassign lcd_on=1'b1;assign lcd_blon=1'b1;always@(posedge clk ) //由50MHZ时钟分频得到4HZ时钟begin if(cnt==19'h7a120) //19'h7a120=19'd500000begin cnt<=0;clk500hz<=~clk500hz; //500000*20ns=1000000us 取反即为2ms=1/500 s endelse cnt<=cnt 1;endassign lcd_e=clk500hz;function [7:0] ddram; //input [5:0] n;begincase(n)//下面修改成你所需内容6'b000_000:ddram=8'b0100_0011;//C6'b000_001:ddram=8'b0100_1000;//H6'b000_010:ddram=8'b0100_0101;//E6'b000_011:ddram=8'b0100_1110;//N6'b000_100:ddram=8'b0010_0000;//6'b000_101:ddram=8'b0100_1010;//J6'b000_110:ddram=8'b0101_0101;//U6'b000_111:ddram=8'b0100_1110;//N6'b001_000:ddram=8'b0100_1010;//J6'b001_001:ddram=8'b0100_1001;//I6'b001_010:ddram=8'b0100_0001;//A6'b001_011:ddram=8'b0100_1110;//N6'b001_100:ddram=8'b0111_0111;//G6'b001_101:ddram=8'b0010_0000;//6'b001_110:ddram=8'b0101_1000;//X6'b001_111:ddram=8'b0100_1001;//I6'b010_000:ddram=8'b0010_0000;//6'b010_001:ddram=8'b0101_0010;//R6'b010_010:ddram=8'b0100_0101;//E6'b010_100:ddram=8'b0100_1110;//Nendcaseendendfunctionalways@(posedge clk500hz or negedge rst)if(!rst) beginstate<=IDLE;address<=6'b000000;data<=8'b00000000;lcd_rs<=0;lcd_rw<=0;endelse begincase(state)IDLE: begin state<=CLEAR;data<=8'bzzzz_zzzz;endCLEAR:begin lcd_rs<=0;lcd_rw<=0;data<=8'h01;state<=SETFUNCTION; //清屏endSETFUNCTION :begin lcd_rs<=0;lcd_rw<=0;data<=8'h3c;state<=SWITCHMODE;endSWITCHMODE: begin lcd_rs<=0;lcd_rw<=0; //显示状态开关设置0C data<=8'h0c; //开光标、开闪烁state<=SETMODE;endSETMODE: begin lcd_rs<=0;lcd_rw<=0;data<=8'h06;//采取增量方式,光标不移动state<=SHIFT;endSHIFT: begin lcd_rs<=0;lcd_rw<=0;data<=8'h18;state<=SETDDRAM1;endSETDDRAM1 :begin lcd_rs<=0;lcd_rw<=0;data<=8'b10000100; //显示数据存储器地址80 4 state<=WRITERAM1;endSETDDRAM2 :begin lcd_rs<=0;lcd_rw<=0;data<=8'b11000010; //显示数据存储器地址80 40 2state<=WRITERAM2;endWRITERAM1 :beginif(address<=6'b000_111 )beginlcd_rs<=1;lcd_rw<=0;data<=ddram(address);address<=address 1;state<=WRITERAM1;endelsebeginlcd_rs<=0;lcd_rw<=0;state<=SETDDRAM2;endendWRITERAM2 :beginif(address<=6'b010_100 )beginlcd_rs<=1;lcd_rw<=0;data<=ddram(address);address<=address 1;state<=WRITERAM2;endelsebeginlcd_rs<=0;lcd_rw<=0;state<=SHIFT;address<=6'b000000; endendendcaseendendmodule。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SET1602显示驱动汇编程序样例;--------------------------------------------------------------------------------------------------------------------- ;SET1602测试程序,参照KS0074控制器,针对A T89S52、32MHZ晶振而编程;SET1602引脚为:1VCC,2VCC,3GND,4BLA,5DB7,6DB6,7DB5,8DB4,9E,10RW,11RS,12V0,13GND,14GND,15VCC.实际上,可任用其中一个VCC引脚和一个GND 引脚。

;KS0074有8线并行、4线并行和2线串行输入方式,但set1602默认的输入方式为4数据总线并行输入方式;V0引脚应通过串接800欧左右电阻后接VCC(5V)。

或者,在VCC和GND之间串接一个5~10可调电位器,滑动端接V0,利用调节滑动端控制LCD显示对比度。

;BLA输入电压应为3.3V,可通过串接合适电阻后接VCC(5V),避免高温烧坏LCD。

;--------------------------------------------------------------------------------------------------------------------- ;以下为硬件连接要求DB4 equ p2.4DB5 equ p2.5DB6 equ p2.6DB7 equ p2.7RS EQU P2.0RW EQU P2.1E EQU P2.2RCOMDATE equ 20H;作为读取的BF相关指令信息的暂存单元WCOMdate equ 21H;作为拟写入指令代码的暂存单元RLCDDATE Equ 22H;作为读取LCD相关显示代码或信息的暂存单元WLCDDATe EQU 23H;作为拟写入LCD显示信息的暂存单元;-------------------------------------------------------------------------------------------------------ORG 00HSJMP MAINORG 50HMAIN: MOV SP,#30H;--------------------------------------------------------------------------------------------------------------------- ;首先,开机或复位后,应进行4数据总线和LCD初始化,将默认的8位数据接口改为4位。

;--------------------------------------------------------------------------------------------------------------------- LCALL Delay1MS;开机或复位后,至少应等待20MS以上LCALL Delay1MSLCALL Delay1MSLCALL Delay1MSLCALL Delay1MSLCALL Delay1MSLCALL Delay1MSLCALL Delay1MSLCALL Delay1MSLCALL Delay1MSLCALL Delay1MSLCALL Delay1MSLCALL Delay1MSLCALL Delay1MSLCALL Delay1MSLCALL Delay1MSLCALL Delay1MSLCALL Delay1MSLCALL Delay1MSLCALL Delay1MS;第一步功能设置,设为4位数据总线方式输入(DL=0)MOV WCOMDA TE,#20HLCALL INPUTCOMMAND;输入指令0010XXXX(低四位忽略);第二步功能设置,在保持4位数据总线输入方式下设为两行模式(输入指令00101XXX)MOV WCOMDA TE,#28H;设成2行显示LCALL INPUTCOMMAND;输入指令00101XXX;第三步显示开关设置MOV WCOMDA TE,#0CH;设成显示开,而光标开和光标闪烁关LCALL INPUTCOMMAND;输入指令00001111;第四步清屏MOV WCOMDA TE,#01H;LCALL INPUTCOMMAND;输入指令00000001LCALL DELAY1MS;输入功能设置指令需延迟1.53MS以上(除归位指令和本指令执行时间为1.53MS,其余指令执行时间均不足0.1MS);第五步输入模式设置MOV WCOMDA TE,#06H;LCALL INPUTCOMMAND;输入指令00000110;- ------------------------------------------------------------------------------------------------------------------ ;然后,将逆序显示变更为正常显示(即使用KS0074的镜向功能);-------------------------------------------------------------------------------------------------------------------- ;第一步,功能设置指令,使RE=1MOV WCOMDA TE,#2CH;LCALL INPUTCOMMAND;输入指令00101100;第二步,输入模式设置指令,使BID=1(逆序显示)?MOV WCOMDA TE,#07H;LCALL INPUTCOMMAND;输入指令00000111;第三步,功能设置指令,使RE=0,以便后续应用时可使用正常指令MOV WCOMDA TE,#28H;LCALL INPUTCOMMAND;输入指令00101000;-----------------------------------------------------------------------------------------------------------------;最后,可实际应用,以下为测试段,未作精简;-----------------------------------------------------------------------------------------------------------------;第一步,显示第一行的固定字符(40H~4EH,起始位址40H),测试要求全部显示出来MOV WCOMDA TE,#2CH;功能设置指令,使RE=1,以执行扩充命令LCALL INPUTCOMMAND;输入指令00101100MOV WCOMDA TE,#40H;设SEGRAM地址(格式为01XXABCD,起始地址为40H)LCALL INPUTCOMMAND;输入指令40H;(1)显示第一个段码字符即信号强度标志,默认为不显示MOV WLCDDATe,#0ffH;40H控制第一个字符的大部分段码位LCALL INPUTDA TACODEMOV WLCDDATe,#0ffH;41H控制第一个字符中除40H控制段码外的其它位LCALL INPUTDATACODEMOV WLCDDATe,#0FFH;42H无用LCALL INPUTDA TACODEMOV WLCDDATe,#0FFH;43H无用LCALL INPUTDA TACODE;(2)显示第二个段码字符即电量显示符号,默认显示满电量MOV WLCDDATe,#0FFH;44H控制全部电量显示段码位,对应关系应进一步测试LCALL INPUTDA TACODE;(3)显示第三个段码字符主菜单标志符,默认显示主菜单符号MOV WLCDDATe,#0FFH;45H控制全部主菜单显示段码位LCALL INPUTDA TACODEMOV WLCDDATe,#00H;46H无用LCALL INPUTDA TACODEMOV WLCDDATe,#00H;47H无用LCALL INPUTDA TACODEMOV WLCDDATe,#00H;48H无用LCALL INPUTDA TACODE;(4)显示第四个段码字符即闹铃符号,默认不显示MOV WLCDDATe,#0ffH;49H控制闹铃所有段码位LCALL INPUTDA TACODEMOV WLCDDATe,#00H;4A无用LCALL INPUTDA TACODE;(5)显示第五个段码字符打开修笺(书本)符号,默认不显示MOV WLCDDATe,#0ffH;4BH控制该符号全部段码LCALL INPUTDA TACODEMOV WLCDDATe,#00H;4CH无用LCALL INPUTDA TACODE;(6)显示第六个段码字符,默认显示MOV WLCDDATe,#0ffH;4DH控制该符号全部段码LCALL INPUTDA TACODEMOV WLCDDA Te,#00H;4EH无用LCALL INPUTDA TACODE;(7)显示第七个段码字符即接听电话符号,默认显示MOV WLCDDATe,#0FFH;55H控制该符号全部段码LCALL INPUTDA TACODEMOV WCOMDA TE,#28H;功能设置指令,使RE=0,恢复正常命令状态LCALL INPUTCOMMAND;输入指令00101000;第二步,在第二行(起始位址为80H)显示“2013-05-15”MOV WCOMDA TE,#83H;设置DDRAM地址,该行起始80HLCALL INPUTCOMMANDMOV WLCDDATe,#"2"LCALL INPUTDA TACODEMOV WLCDDATe,#"0"LCALL INPUTDA TACODEMOV WLCDDATe,#"1"LCALL INPUTDA TACODEMOV WLCDDATe,#"3"LCALL INPUTDA TACODEMOV WLCDDATe,#"-"LCALL INPUTDA TACODEMOV WLCDDATe,#"0"LCALL INPUTDA TACODEMOV WLCDDATe,#"5"LCALL INPUTDA TACODEMOV WLCDDATe,#"-"LCALL INPUTDA TACODEMOV WLCDDATe,#"1"LCALL INPUTDA TACODEMOV WLCDDATe,#"6"LCALL INPUTDA TACODE;第三步,在第三行(起始位址为90H)显示“21:49:38”MOV WCOMDA TE,#94H;设置DDRAM地址LCALL INPUTCOMMANDMOV WLCDDATe,#"2"LCALL INPUTDA TACODEMOV WLCDDATe,#"1"LCALL INPUTDA TACODEMOV WLCDDATe,#":"LCALL INPUTDA TACODEMOV WLCDDATe,#"4"LCALL INPUTDA TACODEMOV WLCDDATe,#"9"LCALL INPUTDA TACODEMOV WLCDDATe,#":"LCALL INPUTDA TACODEMOV WLCDDATe,#"3"LCALL INPUTDA TACODEMOV WLCDDATe,#"8"LCALL INPUTDA TACODESJMP $;-------------------------------------------------------------------------------------------------------------------;读BF并判断状态子程序;直到LCD空闲时退出本程序;------------------------------------------------------------------------------------------------------------------ READBFAC:PUSH ACCBFWAIT:SETB DB4;将4位数据线设置到读有效状态SETB DB5SETB DB6SETB DB7CLR RS;设置成读BF及AC值操作状态SETB RWSETB E;第一次读,使LCD将BF及AC值的高4位信息释放到数据总线上。

相关文档
最新文档