基于VHDL的1602LCD液晶显示
1602液晶显示的实验例子

while (DData[ListLength]>0x20) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; //算出指令码
WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
WriteDataLCM(DData);
void Delay5Ms(void);
void Delay400Ms(void);
unsigned char code cdle_net[] = {""};
unsigned char code email[] = {"pnzwzw@"};
void main(void)
LCM_E = 0; //延时
LCM_E = 1;
LCD1602液晶显示实验报告

LCD1602液晶显示实验报告一、实验目的(1)了解LCD1602的基本原理,掌握其基本的工作流程。
(2)学习用Verilog HDL语言编写LCD1602的控制指令程序,能够在液晶屏上显示出正确的符号。
(3)能够自行改写程序,并实现符号的动态显示。
二、实验设备与器件Quartus II 软件、EP2C8Q208C8实验箱三、实验方案设计1.实验可实现的功能可以实现在LCD1602液晶屏第一行左侧第一位的位置循环显示0~9,并且可以用一个拨码开关BM8实现显示的复位功能。
2.LCD1602基本知识LCD1602液晶能够同时显示16x02即32个字符,模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如“A”。
1602通过D0~D7的8位数据端传输数据和指令。
3.系统工作原理系统的状态转换流程图如图3.1.1所示。
通过状态流程图可以看到,LCD1602液晶屏的状态是不断更新的,依次完成液晶的初始化和0~9的动态显示过程,并且过程可由开关控制。
if (!rst_n)cnt <= 0;elsecnt <= cnt + 1'b1;wire lcd_clk = cnt[23]; // (2^23 / 50M)=0.168s always@(posedge lcd_clk)if(cnt1>=24'd2)beginreg lcd_clk1;lcd_clk1=1;cnt1=0;endelsebegincnt1=cnt1+1; //cnt1对lcd_clk二分频lcd_clk1=0;endalways@(posedge lcd_clk1)beginrow1_val<=8'h30;//设初值case(row1_val) //数字0~9循环显示8'h30: row1_val<=8'h31;8'h31: row1_val<=8'h32;8'h32: row1_val<=8'h33;8'h33: row1_val<=8'h34;8'h34: row1_val<=8'h35;8'h35: row1_val<=8'h36;8'h36: row1_val<=8'h37;8'h37: row1_val<=8'h38;8'h38: row1_val<=8'h39;8'h39: row1_val<=8'h30;default: row1_val<=8'h30;endcaseendparameter IDLE = 8'h00;parameter DISP_SET = 8'h01; // 显示模式设置parameter DISP_OFF = 8'h03; // 显示关闭parameter CLR_SCR = 8'h02; // 显示清屏parameter CURSOR_SET1 = 8'h06; // 显示光标移动设置parameter CURSOR_SET2 = 8'h07; // 显示开及光标设置parameter ROW1_ADDR = 8'h05; // 写第1行起始地址parameter ROW1_0 = 8'h04;reg [5:0] current_state, next_state; // 现态、次态always @ (posedge lcd_clk, negedge rst_n)if(!rst_n) current_state <= IDLE;else current_state <= next_state;//在时钟信号作用期间,次态重复的赋给现态alwaysbegincase(current_state)IDLE : next_state = DISP_SET;DISP_SET : next_state = DISP_OFF;DISP_OFF : next_state = CLR_SCR;CLR_SCR : next_state = CURSOR_SET1;CURSOR_SET1 : next_state = CURSOR_SET2;CURSOR_SET2 : next_state = ROW1_ADDR;ROW1_ADDR : next_state = ROW1_0;ROW1_0 : next_state = ROW1_ADDR;default : next_state = IDLE ;endcaseendalways @ (posedge lcd_clk, negedge rst_n)beginif(!rst_n)beginlcd_rs <= 0;lcd_data <= 8'hxx;endelsebegincase(next_state)IDLE : lcd_rs <= 0;DISP_SET : lcd_rs <= 0;DISP_OFF : lcd_rs <= 0;CLR_SCR : lcd_rs <= 0;CURSOR_SET1 : lcd_rs <= 0;CURSOR_SET2 : lcd_rs <= 0;ROW1_ADDR : lcd_rs <= 0;ROW1_0 : lcd_rs <= 1;endcasecase(next_state)IDLE : lcd_data <= 8'hxx;DISP_SET : lcd_data <= 8'h38;DISP_OFF : lcd_data <= 8'h08;CLR_SCR : lcd_data <= 8'h01;CURSOR_SET1 : lcd_data <= 8'h04;CURSOR_SET2 : lcd_data <= 8'h0C;ROW1_ADDR : lcd_data <= 8'h80;ROW1_0 : lcd_data <= row1_val[127:120];endcaseendendassign lcd_e = lcd_clk; // 数据在时钟高电平被锁存assign lcd_rw = 1'b0; // 只写endmodule5.下载电路及引脚分配设计设计中用实验箱自带的50MHz时钟信号作为输入端,用sel0、sel1、sel2三个使能端选通LCD1602液晶屏,EP2C8Q208C8就会工作在给液晶下命令的状态,使得点阵正常工作,如图3.5.1所示。
基于单片机的1602液晶显示电路设计

本科毕业论文(设计)题目:基于单片机的1602液晶显示电路设计学生姓名:学号:系别:理工部专业:电气工程及其自动化入学时间:2012年09月导师姓名:职称/学位:基于单片机的1602液晶显示电路设计摘要本文是一篇介绍利用AT89S52单片机和LCD1602液晶显示屏设计一种液晶显示电路并编程实现信息的显示功能。
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。
1602LCD是指显示的内容为16*2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
从AT89S52单片机与LCD1602液晶显示器性能特点出发,实现两者接口的衔接设计。
经过多次的调试, 使得该设计取得了比较满意的结果, 且系统软硬件设计简单方便、稳定可靠, 可广泛应用于智能化仪器仪表及各种宣传场所, 为嵌入式控制系统提供高灵活、高性价比的解决方案。
关键词:AT89S52单片机;LCD1602液晶显示器;复位电路;时钟电路目录第一章前言 (2)1.1 研究现状 (2)1.2 研究意义 (2)第二章系统硬件电路设计 (3)2.1 AT89S52单片机最小系统 (3)2.1.1 主要性能 (3)2.1.2 功能 (3)2.1.3 引脚说明及实物图 (4)2.2 LCD1602液晶显示器 (7)2.2.1功能 (7)2.2.2 特点 (7)2.2.3 引脚 (7)2.3 复位电路 (9)2.4 时钟电路 (9)第三章软件设计 (10)3.1 软件设计思路 (10)3.1.1 Altium Designer (11)3.1.2 keil (11)3.1.3 AVR_fighter (11)3.2 程序设计 (12)第四章仿真及硬件电路 (15)第五章总结与展望 (17)主要参考文献 (18)致谢 (19)第一章前言本文是一篇研究基于AT89S52单片机的1602液晶显示电路设计,本次设计要求通过对单片机和1602液晶显示模块的学习,设计出完整的电路并焊出电路板,再对单片机写入程序,从而实现在液晶屏上显示出字符。
实验1:1602LCD显示

实验1 1602型LCD显示一、实验目的:1. 了解Altera DE2-70多媒体开发板与PC(个人电脑)的正确连接;2. 掌握PC上安装的硬件设计环境Quartus II和应用程序设计环境Nios II;3. 初步了解IP核(硬件)模块的配置方法;4. 了解与此工程有关的顶层文件(.v);5. 掌握Nios II IDE的“hello world”软件工程模板;二、实验步骤:(一)初建工程:在PC上新建一个名为”demo_lcd”的工程鼠标左键双击桌面上的“Quartus II”快捷方式图标,耐心等待片刻,即可启动“Quartus II”设计页面,如图1-1所示。
图1-1在“Quartus II”设计页面内,鼠标左键单击“File -> New Project Wizard”。
弹出“New Project Wizard :introduction”。
如图1-2所示。
初次实验可以仔细阅读此页面内容,然后鼠标左键单击“next”按钮跳过此页,进入“New Project Wizard: Directory, Name, Top -level entity” 页面,如图1-3所示。
“the working directory for this project”(工程的工作目录)可以任意填写,例如:“E:/demo/demo_LCDdisplay”。
“工程的工作目录”如前“E:/demo/demo_LCDdisplay”,表示将会在E 盘上产生一个文件夹“demo”,在“demo”文件夹里产生另一个文件夹”demo_LCDdisplay”(工程文件夹,保存工程文件),此实验后续步骤中产生的各种文件会自动保存到路径“E:/demo/demo_LCDdisplay”下。
图1-2图1-3“the name of this project”(工程名字)填写为”demo_lcd”。
这里需要注意:由于“SOPC Builer”工具不能识别空格、中划线等符号,故实验所有步骤中如果需要命名,命名中不允许有空格、中划线出现,但“SOPC Builer”工具能识别下划线。
基于51单片机的1602LCD显示

标签:单片机LCD基于51单片机的1602LCD显示基于51单片机的1602LCD显示LCD(liquid crystal display)为液晶显示器,它一般不会单独使用,而是将LCD面板、驱动与控制电路组合成LCD模块(1iquid crystal display moulde,简称为LCM)来使用。
LCM是一种很省电的显示设备,常被应用在数字或微处理器控制的系统,做为简易的人机接口,但人们一般还是习惯称之为LCD显示器。
1 硬件设计采用51单片机控制1602LCD显示器的电路如下所示。
在桌面上双击图标,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。
单击菜单命令“文件”→“新建设计”,选择DEFAULT 模板,保存文件名为“LCD.DSN”。
在器件选择按钮中单击“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表所示的元件。
51单片机AT89C51 一片晶体CRYSTAL 12MHz 一只瓷片电容CAP 22pF 二只电解电容CAP-ELEC 10uF 一只电阻RES 10K 一只排阻RESPAC-8 10K 一只1602液晶显示器LM016L 一只若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U1的31脚,都可以不画,它们都是默认的。
在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER和GROUND放置电源和地。
放置好元件后,布好线。
左键双击各元件,设置相应元件参数,完成电路图的设计。
2 软件设计用1602LCD显示两行字符的流程图如下所示。
用1602LCD显示“Welcom to China”和“Hi!Good morning!”的详细C51程序如下。
//用LCD循环显示"Welcome to China"和"Hi!Good morning!"#include<reg51.h> //包含单片机的头文件#include<intrins.h> //包含_nop_()函数定义的头文件sbit RS="P2"^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW="P2"^1; //读写选择位,将RW位定义为P2.1引脚sbit E="P2"^2; //使能信号位,将E位定义为P2.2引脚sbit BF="P0"^7; //忙碌标志位,,将BF位定义为P0.7引脚unsigned char code string[ ]={"Welcome to China"};unsigned char code string1[ ]={"Hi!Good morning!"};/*************************************************函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒*************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************函数功能:延时若干毫秒入口参数:n******************************/void delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*******************************************函数功能:判断液晶模块的忙碌状态返回值:result。
基于51单片机24小时可调时钟1602液晶显示程序

基于51单片机24小时可调时钟1602液晶显示程序#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit key1=P1^0;sbit key2=P1^1;sbit key3=P1^2;sbit key4=P1^3;sbit key5=P1^4;sbit key6=P1^5;sbit rs=P0^0; //液晶的第4端RS由开关独立s2 p3^5控制高电平写数据,低电平写命令。
sbit lecdn=P0^1; //使能端需控制LECDN,p3^6控制。
根据硬件电路而定uchar miao ,fen ,shi,num;uchar miao1,miao2,shi1,shi2,fen1,fen2;uchar table[]="0123456789";void delay(uint x){uint i,j;for(i=x;i>0;i--)for(j=10;j>0;j--);}void write_com(uchar com )//写指令{P2=com;//RW=0;写指令位定义一个io口控制lecdn=0; //起初为低电平时序图rs=0; //写指令rs为低delay(10); //简短延时lecdn=1; //给以高脉冲delay(5);lecdn=0;}void write_data(uchar shu ) //写数据{P2=shu; //将数据送给控制数据位的io口//RW=0;写指令位定义一个io口控制lecdn=0;rs=1; //写数据rs为低区别delay(10);lecdn=1;delay(5);lecdn=0;}void init() //初始化{write_com(0x38); //显示模式设置delay(20);write_com(0x0f); // 显示开关,和光标设置,开关必开,光标不开ox0c,开并闪烁0x0fdelay(20);write_com(0x06); //写完一个数据,数据地址指针自动往后移动一位delay(20);write_com(0x01); //清屏指令,按下复位键上次的结果变清掉。
【精选资料】1602液晶显示屏模块资料-附程序
BSET TIE,#%00000001;TC0开中断
MOVB #%10000000,TSCR1;开定时器,标志位正常清除
MOVW #125,TC0
;定时器使能,标志位正常清除
;***************液晶显示初始化************************
7脚~14脚D0~D7:数据总线;
15脚LED+:背景光源,接+5V;
16脚LED-:背景光源,接地。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了不同的点阵字符图形,这些字符有,阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,其中数字与字母同ASCII码兼容。
ABC_1:FCB $44,$65,$73,$69,$67,$6e,$65,$72,$A0,$62,$79,$A0,$63,$68,$65,$6e
ABC_2:FCB $A0,$A0,$A0,$32,$30,$31,$31,$2e,$30,$37,$2e,$32,$35,$A0,$A0,$A0
;****************定时器中断子程序********************
4.开机初始化;
5.各个模块的开关:
(1)开启LCD模块;
(2)开启定时器模块;
(3)开中断;
6.主程序(空操作):
7.子程序:
(1)写入地址
(2)写入命令
(3)写入数据
(4)定时器中断
2.流程图:该程序就是一个单线条的,比较简单,在这里就不说了。
3.程序设计:
;********************SCI初始化****************************
51单片机控制基于1602液晶显示 电子时钟【带闹铃和整点报时】
write_date(week6[num]);
delay1();
}
};
break;
}
}
void display() //显示时间子程序
{
write_week(week);
write_ymd(3,year);
write_ymd(6,months);
write_ymd(9,day);
write_sfm(0,shi);
write_sfm(3,fen);
write_sfm(6,miao);
}
void display_1() //显示闹钟子程序
{
write_week(week_1);
write_ymd(3,year1);
write_ymd(6,months1);
write_ymd(9,day1);
write_sfm(0,shi1);
write_com(0x80+add);
write_date(0x30+sh);
write_date(0x30+ge);
}
void write_week(uchar add) //周几显示
{
switch(add)
{
case 0:{
write_com(0x80+12);//设置数据起始地址
for(num=0;num<3;num++)
{
write_date(week3[num]);
delay1();
}
};
break;
case 4:{
write_com(0x80+12);//设置数据起始地址
for(num=0;num<3;num++)
基于VHDL的LCD控制器的设计与实现
第2期2009年2月工矿自动化Industr y and M ine AutomationNo.2 Feb.2009收稿日期:2008-10-29作者简介:周 雷(1985-),男,中国矿业大学信号与信息处理专业2006级硕士研究生,研究方向为EDA 技术应用。
E 2mail:zhoul35@文章编号:1671-251X(2009)02-0093-02基于VHDL 的LCD 控制器的设计与实现周 雷, 付慧生, 熊建伟(中国矿业大学信电学院,江苏徐州 221008)摘要:文章介绍了基于VH DL 语言状态机的LCD 控制器的设计方法,说明了字符型液晶显示器显示的基本原理,给出了显示字符的方法及实现LCD 控制器的部分VH DL 语言程序。
基于VH DL 设计的LCD 控制器具有很好的移植性,稍加改动就可以应用到不同场合。
关键词:LCD 控制器;VH DL;字符显示 中图分类号:TP312 文献标识码:B 参考文献:[1] 高丽珍.新型矿用本质安全型电源的设计与研究[J].机械工程与自动化,2006(3):125~127.[2] 杨智敏,侯传教,刘 霞.单片式开关稳压器LM2576-ADJ 及其应用[J ].移动电源与车辆,2004(1):34~36.[3] 张乃国.电源技术[M].北京:中国电力出版社,1998.[4] 崔保春,王 聪,卢其威,等.矿用本质安全开关电源的研究[J].中国煤炭,2006(3):49~51.0 引言传统的LCD 控制器通常由单片机组成,具有集成电路复杂、移植性差等缺点。
随着可编程逻辑器件的发展,以FPGA(现场可编程门阵列)为平台,采用硬件编程语言来实现LCD 控制器,具有易于集成到片上系统、方便修改、适应不同液晶显示器等优点。
本文设计的LCD 控制器是一种基于FPGA 的液晶显示控制器,它采用VH DL 语言实现控制器的编程设计,这种设计方法稍加改动就可以应用于常见的LCD 接口电路中[1]。
Vhdl1602可调数字钟
--LCD1602数字钟--Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_arith.all;Use ieee.std_logic_unsigned.all;Entity clock isPort( rst,clk : in std_logic;rs,en,rst_out,sec_out: out std_logic;rw : out std_logic;data_out : out std_logic_vector(7 downto 0);RD,WR : IN STD_LOGIC; --读写控制DATA_O ,CONT_O : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --数据输出DATA_I,CONT_I : IN STD_LOGIC_VECTOR(7 DOWNTO 0); --数据和地址输入SCLK : OUT STD_LOGIC;IO : INOUT STD_LOGIC;IOB : OUT STD_LOGIC ;k1,k2 : IN STD_LOGIC);End clock;Architecture fwm of clock isTYPE states IS(hold,func_set,dis_on,mode_set,write_char1,write_char2,write_char3,write_char4,write_char5, write_char6,write_char7,write_char8,write_char9,write_char10,return_home,toggle_e,rst1,rst2,rst3,dis_off,dis _clr);SIGNAL state,n_state:states;SIGNAL s0,s1,m0,m1,h0,h1,t: std_logic_vector(3 downto 0);SIGNAL clk_400Hz,clk_10Hz,clk_40Hz: std_logic;SIGNAL DATA_TEMP : STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL CONT_TEMP : STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL SECOND : STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL MINUTE : STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL HOUR : STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL DAY : STD_LOGIC_VECTOR(7 DOWNTO 0);CONSTANT PROCECT : STD_LOGIC_VECTOR:="10001110"; --保护位CONSTANT SECOND_WRITE: STD_LOGIC_VECTOR:="10000000";CONSTANT SECOND_READ : STD_LOGIC_VECTOR:="10000001";CONSTANT MINUTE_WRITE: STD_LOGIC_VECTOR:="10000010";CONSTANT MINUTE_READ : STD_LOGIC_VECTOR:="10000011";CONSTANT HOUR_WRITE : STD_LOGIC_VECTOR:="10000100";CONSTANT HOUR_READ : STD_LOGIC_VECTOR:="10000101";CONSTANT DAY_WRITE : STD_LOGIC_VECTOR:="10000110";CONSTANT DAY_READ : STD_LOGIC_VECTOR:="10000111";-- CONSTANT MONTH_WRITE : STD_LOGIC_VECTOR:="10001000";-- CONSTANT MONTH_READ : STD_LOGIC_VECTOR:="10001001";-- CONSTANT YEAR_WRITE : STD_LOGIC_VECTOR:="10001100";-- CONSTANT YEAR_READ : STD_LOGIC_VECTOR:="10001101";Beginrst_out<=NOT rst;sec_out<=s0(0);Process(clk,rst) --50MHz分频到400Hzvariable cnt1: integer range 0 to 62500;beginif rst='0' then cnt1:=0;clk_400Hz<='0';elsif clk'EVENT and clk='1'thenif cnt1<62500 then cnt1:=cnt1+1; else cnt1:=0;clk_400HZ<= not clk_400Hz;end if;end if;end process;process(clk_400HZ,rst)variable cnt2: integer range 0 to 199;beginif rst='0' then state<=rst1;data_out<=X"38";n_state<=rst2;en<='1';rs<='0';rw<='0';elsif clk'EVENT and clk='1' thenif cnt2<19 then cnt2:=cnt2+1; else cnt2:=0;clk_400Hz<=not clk_400Hz;end if;CASE state IS --LCD控制WHENrst1=>en<='1';rs<='0';rw<='0';data_out<=X"38";state<=toggle_e;n_state<=rst2; --设置功能WHENrst2=>en<='1';rs<='0';rw<='0';data_out<=X"38";state<=toggle_e;n_state<=rst3;WHENrst3=>en<='1';rs<='0';rw<='0';data_out<=X"38";state<=toggle_e;n_state<=func_set;WHENfunc_set=>en<='1';rs<='0';rw<='0';data_out<=X"38";state<=toggle_e;n_state<=dis_off;WHENdis_off=>en<='1';rs<='0';rw<='0';data_out<=X"08";state<=toggle_e;n_state<=dis_clr; --显示控制,显示关,光标关WHENdis_clr=>en<='1';rs<='0';rw<='0';data_out<=X"01";state<=toggle_e;n_state<=dis_on; --清屏WHENdis_on=>en<='1';rs<='0';rw<='0';data_out<=X"0c";state<=toggle_e;n_state<=mode_set; --显示控制,显示开,光标关WHENmode_set=>en<='1';rs<='0';rw<='0';data_out<=X"06";state<=toggle_e;n_state<=write_char1; --显示设置,自动增地址,光标右移WHEN write_char1=>en<='1';rs<='1';rw<='0';data_out<=X"3" & h1;state<=toggle_e;n_state<=write_char2; --LCD写入字符且定位第一个字符WHEN write_char2=>en<='1';rs<='1';rw<='0';data_out<=X"3" & h0;state<=toggle_e;n_state<=write_char3; --时低位WHENwrite_char3=>en<='1';rs<='1';rw<='0';data_out<=X"3a";state<=toggle_e;n_state<=write_char4; --写冒号WHEN write_char4=>en<='1';rs<='1';rw<='0';data_out<=X"3" & m1;state<=toggle_e;n_state<=write_char5; --分高位WHEN write_char5=>en<='1';rs<='1';rw<='0';data_out<=X"3" & m0;state<=toggle_e;n_state<=write_char6; --分低位WHENwrite_char6=>en<='1';rs<='1';rw<='0';data_out<=X"3a";state<=toggle_e;n_state<=write_char7; --写冒号WHEN write_char7=>en<='1';rs<='1';rw<='0';data_out<=X"3" & s1;state<=toggle_e;n_state<=write_char8; --秒高位WHEN write_char8=>en<='1';rs<='1';rw<='0';data_out<=X"3" & s0;state<=toggle_e;n_state<=write_char9; --秒低位WHENwrite_char9=>en<='1';rs<='1';rw<='0';data_out<=X"2e";state<=toggle_e;n_state<=write_char10; --写小数点WHEN write_char10=>en<='1';rs<='1';rw<='0';data_out<=X"3" & t;state<=toggle_e;n_state<=return_home; --写十分之一秒WHENreturn_home=>en<='1';rs<='0';rw<='0';data_out<=X"80";state<=toggle_e;n_state<=write_char1; --返回写地址到第一行第一列WHEN toggle_e=> en <='0'; state<=hold; --下降沿WHEN hold =>state <=n_state; --保持end case;end if;end process;PROCESS(clk_40Hz)V ARIABLE COUNT1 : INTEGER RANGE 0 TO 7 ;V ARIABLE COUNT2 : STD_LOGIC_VECTOR (1 DOWNTO 0);V ARIABLE COUNT3 : STD_LOGIC_VECTOR (1 DOWNTO 0);variable cnt3: integer range 0 to 19;V ARIABLE COUNT4 : STD_LOGIC_VECTOR(3 DOWNTO 0);V ARIABLE COUNT5 : STD_LOGIC_VECTOR(2 DOWNTO 0);V ARIABLE COUNT6 : STD_LOGIC_VECTOR(2 DOWNTO 0);BEGINif rst='0' then cnt3:=0;clk_40Hz<='0';elsif clk_400Hz'EVENT and clk_400HZ='1' thenif cnt3<19 then cnt3:=cnt3+1; else cnt3:=0;clk_40HZ<= not clk_40Hz;end if;IF RD ='1' AND WR ='0' THEN --读数据CASE COUNT3 ISWHEN "00" =>CASE COUNT2 ISWHEN "00" => CONT_TEMP<=CONT_I; SCLK<='0'; IO<=CONT_I(COUNT1); COUNT2:="01"; --写地址rst<='1';WHEN "01" => SCLK<='1'; COUNT1:=COUNT1+1; COUNT2:="10";WHEN "10" => SCLK<='0'; IO<=CONT_TEMP(COUNT1);IF COUNT1=7 THEN COUNT2:="11"; ELSE COUNT2:="01"; END IF;WHEN "11" => SCLK<='1'; COUNT2:="00"; COUNT3:="01"; IOB<='Z';END CASE;WHEN "01" =>CASE COUNT2 ISWHEN "00" => SCLK<='0'; COUNT2:="01"; COUNT1:=0;IO<='Z'; --读数据WHEN "01" => SCLK<='1'; DA TA_TEMP(COUNT1)<=IO; COUNT2:="10";WHEN "10" => SCLK<='0'; COUNT1:=COUNT1+1;IO<='Z';IF COUNT1=7 THEN COUNT2:="11"; ELSE COUNT2:="01"; END IF;WHEN "11" => DATA_TEMP(COUNT1)<=IO; COUNT3:="10"; COUNT2:="00"; DATA_O<= DA TA_TEMP; IOB<='1';END CASE;WHEN "10" => DATA_O<= DATA_TEMP; COUNT1:=0; IOB <='0';-- rst<='0';WHEN OTHERS => NULL;END CASE;END IF;IF WR ='1'AND RD ='0' THEN --写数据CASE COUNT3 ISWHEN "00" =>CASE COUNT2 ISWHEN "00" => CONT_TEMP<=CONT_I; DA TA_TEMP<=DA TA_I;SCLK<='0'; IO<=CONT_I(0); COUNT2:="01"; COUNT1:=0;-- RST<='1';WHEN "01" => SCLK<='1'; COUNT1:=COUNT1+1; COUNT2:="10";WHEN "10" => SCLK<='0'; IO<=CONT_TEMP(COUNT1);IF COUNT1=7 THEN COUNT2:="11"; ELSE COUNT2:="01"; END IF;WHEN "11" => SCLK<='1'; COUNT2:="00"; COUNT3:="01"; COUNT1:=0;END CASE;WHEN "01" =>CASE COUNT2 ISWHEN "00" => SCLK<='0'; IO<=DA TA_TEMP(COUNT1); COUNT2:="01"; --写数据WHEN "01" => SCLK<='1'; COUNT1:=COUNT1+1; COUNT2:="10";WHEN "10" => SCLK<='0'; IO<=DA TA_TEMP(COUNT1);IF COUNT1=7 THEN COUNT2:="11"; ELSE COUNT2:="01"; END IF;WHEN "11" => SCLK<='1'; COUNT2:="00"; COUNT3:="10"; COUNT1:=0; IOB<='1';END CASE;WHEN "10" => COUNT1:=0; IOB<='0'; --RST<='0';WHEN OTHERS => NULL;END CASE;END IF;IF RD ='0' AND WR ='0' THEN SCLK<='0'; COUNT1:=0; COUNT3:="00"; COUNT2:="00"; DATA_O<="ZZZZZZZZ";END IF;END IF;h1<= X"0";h0<= X"0";m1<= X"0";m0<= X"0";s1<= X"0";s0<= X"0";IF k1 ='1' THENIF COUNT5<"111" THENCASE COUNT5 ISWHEN "000" => CONT_O<=SECOND_WRITE; DA TA_O<="00000000"; COUNT5:="001"; --写秒WHEN "001" => COUNT5:="010";WHEN "010" => CONT_O<=MINUTE_WRITE; DA TA_O<="00110000"; COUNT5:="011"; --写分钟WHEN "011" => COUNT5:="100";WHEN "100" => CONT_O<=HOUR_WRITE; DA TA_O<="00010010"; COUNT5:="101"; --写小时WHEN "101" => COUNT5:="110";WHEN "110" => CONT_O<=DAY_WRITE; DA TA_O<="00010101"; COUNT5:="111"; --写天WHEN OTHERS =>NULL;END CASE;END IF;ELSE COUNT5:="000";END IF;IF k2 ='1' THENIF COUNT6<"111" THENCASE COUNT6 ISWHEN "000" => CONT_O<=SECOND_READ; COUNT6:="001";WHEN "001" => s1 <=DATA_I(7 downto 4);s0 <=DA TA_i(3 downto 0); COUNT6:="010";WHEN "010" => CONT_O<=MINUTE_READ; COUNT6:="011";WHEN "011" => m1 <=DATA_I(7 downto 4); m0 <=DATA_i(3 downto 0); COUNT6:="100";WHEN "100" => CONT_O<=HOUR_READ; COUNT6:="101";WHEN "101" => h1 <=DATA_I(7 downto 4); h0 <=DATA_i(3 downto 0); COUNT6:="110";WHEN "110" => CONT_O<=DAY_READ; COUNT6:="111";WHEN OTHERS => NULL;END CASE;END IF;ELSE COUNT6:="000"; DA TA_O<="ZZZZZZZZ";CONT_O<="ZZZZZZZZ";END IF;END PROCESS;end fwm;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
地址: 01000000 01000001 01000010 01000011 01000100 01000101 01000110 01000111
数据: 00010000 00000110 00001001 00001000 00001000 00001001 00000110 00000000
表示忙,此时模块不能接收命令或者数据,如果为低电平 表示不忙。 ➢ 指令10——写数据。 ➢ 指令11——读数据。
1602LCD的CGROM、CGRAM和DDRAM
CGROM 中存储了一些标准的字符的字模编码,是液晶屏出厂时固化 在控制芯片中的,用户不能改变其中的存储内容,只能读取调用,包含有 标准的ASCII码、日文字符和希腊文字符。(若干个)
1602LCD引脚说明
引脚 1 2 3
4 5 6 7 8 9 10 11 12 13 14 15、16
符号 VSS VDD V0
RS R/W
E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 BLA、BLK
功能说明 一般接地 接电源(+5V) 液晶显示器对比度调整端 RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存
CGRAM 是控制芯片留给用户,用以存储用户自己设计的字模编码。 ( 8个字节,{0000_X000~0000_X111} )
DDRAM是和屏幕显示区域有对应关系的一组存储器,其功能有点中 转的性质。(80个字节)
为了便于理解,可以如下打一比方: CGROM和CGRAM中存储的字模 信息相当于厨房中的食品,CGROM是厨房中现成的熟食,CGRAM是用 户自行制作的菜肴,这些食品都要通过托盘DDRAM转移一下,才能送到 餐桌上食用;类似的字模编码都要先被读取到对应的DDRAM中,经如上 中转以后,屏幕的相应位置才显示出字符。
器。 R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。 E(或EN)端为使能(enable)端,下降沿使能。 低4位三态、双向数据总线0位(最低位) 低4位三态、双向数据总线1位 低4位三态、双向数据总线2位 低4位三态、双向数据总线3位 高4位三态、双向数据总线4位 高4位三态、双向数据总线5位 高4位三态、双向数据总线6位 高4位三态、双向数据总线7位(最高位,也是busy flag) 背光电源正极、背光电源负极
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1602LCD显示的内容为16*2,即可以显示两行,每行16个 字符,目前市面上字符液晶大多数是基于HD44780和 SPLC780D液晶芯片,控制原理是完全相同的,因此基于 HD44780和SPLC780D写的控制程序可以很方便地应用于市
设定CGRAM
指令功能
指令编码
执行
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 时间/us
设定CGRAM地址 0 0 0 1
CGRAM的地指令数据的高2位已固定是01,只有后面的6位是地址 数据,而这6位中的高3位就表示这八个自定义字符,最后的3位就是字模数据的 八个地址了。例如第一个 自定义字符的字模地址为01000000~01000111八个地址。 我们向这8个字节写入字模数据,让它显示 “℃”。
基于VHDL的1602LCD液晶显示技术
——基于JHD162A液晶屏、SPLC780D液晶显示芯片
1602LCD简介
1
16
EDA Technology SHENZHEN UNIVERSITY
VSS VCC V0 RS R/W E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 BLA BLK
面上大部分的字符型液晶。本实验室所使用的是型号为 JHD162A的液晶,而其内部采用的正是SPLC780D液晶芯片。 上图所示即为16引脚1602LCD的引脚图。
1602LCD显示原理——5x7点阵
1602LCD显示原理——5x10点阵
1602LCD字符代码与图形对应图
1602液晶模块内部的字 符发生存储器已经存储了若 干个不同的点阵字符图形, 如左图所示,这些字符有: 阿拉伯数字、英文字母的大 小写、常用的符号、和日文 假名等,每一个字符都有一 个固定的代码,比如大写的 英文字母“A”的代码是 01000001B(41H),显示时 模块把地址41H中的点阵字符 图形显示出来,我们就能看 到字母“A”。
1602LCD液晶模块控制指令
1602LCD液晶模块控制指令说明(1)
➢ 指令1——清显示,指令码01H,光标复位到地址00H位置。 ➢ 指令2——光标返回,光标返回到地址00H。 ➢ 指令3——置输入模式,I/D:光标移动方向,高电平右移,低
电平左移;S:屏幕上所有文字是否左移或右移,高电平表示 有效,低电平无效。 ➢ 指令4——显示开/关控制,D:控制整体显示的开/关,高电平 为开显示,低电平为关显示;C:控制光标的开与关,高电平 表示有光标,低电平表示无光标;B:控制光标是否闪烁,高 电平闪烁,低电平不闪烁。 ➢ 指令5——光标或字符移位,S/C:高电平时移动显示的文字, 低电平时移动光标。
1602LCD液晶内部显示地址
要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符, 上图是1602LCD的内部显示地址。例如第二行第一个字符的地址是40H,那么 是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行, 因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是 01000000B(40H)+10000000B(80H)=11000000B(C0H)。因此,第一行地 址就必须加80H,而第二行地址就必须加C0H。
1602LCD液晶模块控制指令说明(2)
➢ 指令6——功能设置命令,DL:高电平时为8位总线,低电 平时为4位总线;N:低电平时为单行显示,高电平时双行 显示;F :低电平时显示5x7的点阵字符,高电平时显示 5x10的点阵字符。
➢ 指令7——字符发生器RAM地址设置。 ➢ 指令8——DDRAM地址设置。 ➢ 指令9——读忙信号和光标地址,BF:为忙标志位,高电平