LCD1602地电路图和程序

合集下载

51单片机驱动LCD1602程序设计(C语言)

51单片机驱动LCD1602程序设计(C语言)
51 单片机驱动 LCD1602 程序设计(C 语言)
字符液晶绝大多数是基于 HD44780 液晶芯片的,控制原理是完全相同的,因此 HD44780 写 的控制程序可以很方便地应用于市面上大部分的字符型液晶。字符型 LCD 通常有 14 条引脚线或 16 条引脚线的 LCD,多出来的 2 条线是背光电源线 VCC(15 脚)和地线 GND(16 脚),其控制原理 与 14 脚的 LCD 完全一样,定义如下表所示:
for(i=0;i<count;i++) {
if (0 == y) x |= 0x80; //当要显示第一行时地址码+0x80; else x |= 0xC0; //在第二行显示是地址码+0xC0; Write_com(x); //发送地址码 Write_dat(*p); //发送要显示的字符编码 x++; p++; }
01110
○■■■○
10001
■○○○■
10001
■○○○■
10001
■○○○■
11111
■■■■■
10001
■○○○■
10001
■○○○■
上图左边的数据就是字模数据,右边就是将左边数据用“○”代表 0,用“■”代表 1。看出是个“A”
字了吗?在文本文件中“A”字的代码是 41H,PC 收到 41H 的代码后就去字模文件中将代表 A 字的
字符型 LCD 的引脚定义
HD44780 内置了 DDRAM、CGROM 和 CGRAM。DDRAM 就是显示数据 RAM,用来寄存 待显示的字符代码。共 80 个字节,其地址和屏幕的对应关系如下表:
也就是说想要在 LCD1602 屏幕的第一行第一列显示一个"A"字,就要向 DDRAM 的 00H 地址写 入“A”字的代码就行了。但具体的写入是要按 LCD 模块的指令格式来进行的。在 1602 中我们用前 16 个就行了。第二行也一样用前 16 个地址。对应如下:

LCD1602液晶显示器

LCD1602液晶显示器

实验11:1602液晶显示屏显示(字符型液晶显示器)字符型液晶显示器用于数字、字母、符号并可显示少量自定义符号。

这类液晶显示器通常有16根接口线,下表是这16根线的定义。

字符型液晶接口说明编号符号引脚说明编号符号引脚说明1 Vss 电源地 9 D2 数据线22 Vdd 电源正 10 D3 数据线33 VL 液晶显示偏压信号 11 D4 数据线44 RS 数据/命令选择端 12 D5 数据线55 R/W 读/ 写选择端 13 D6 数据线66 E 使能信号 14 D7 数据线77 D0 数据线0 15 BLA 背光源正极8 D1 数据线1 16 BLK 背光源负极(本学习板配的内部已经接地)下图是字符型液晶显示器与单片机的接线图。

这用了P0口的8根线作为液晶显示器的数据线,用P20、P21、P22做为3根控制线。

字符型液晶显示器与单片机的接线图字符型液晶显示器的使用,字符型液晶显示器一般采用HD44780芯片做为控制器的。

1.字符型液晶显示器的驱动程序这个驱动程序适用于1602型字符液晶显示器,1) 初始化液晶显示器命令(RSTLCD)设置控制器的工作模式,在程序开始时调用。

参数:无。

2) 清屏命令(CLRLCD)清除屏幕显示的所有内容参数:无3) 光标控制命令(SETCUR)用来控制光标是否显示及是否闪烁参数:1个,用于设定显示器的开关、光标的开关及是否闪烁。

4) 写字符命令(WRITECHAR)在指定位置(行和列)显示指定的字符。

参数:共有3个,即行值、列值及待显示字符,分别存放在XPOS、YPOS和A中。

其中行值与列值均从0开始计数,A中可直接写入字符的符号,编译程序自动转化为该字符的ASCII值。

5) 字符串命令(WRITESTRING)在指定位置显示指定的一串字符。

参数:共有3个,即行值、列值和R0指向待显示字符串的内存首地址,字符串须以0结尾。

如果字符串的长度超过了从该列开始可显示的最多字符数,则其后字符被截断,并不在下行显示出来。

lcd1602程序流程图

lcd1602程序流程图

LCD1602程序代码及显示流程图LCD1602显示程序代码DB P0//--P0=DB0~DB7位LCD_RS=P2;//--P2.0=RS位LCD UrW=P2;//--P2.1=RW位LCD_Ue=P2;//-P2.2=E//--/--/----定义函数ා define uchar unsigned charා define uint unsigned int///—定义子例程函数void LCD_Uiinit(void);//-初始化LCD1602函数void LCD_2;write_uchar命令(uchar命令);//-写入命令功能无效LCD到LCD1602_Char数据(uchar DAT);//-将无效的LCD数据写入LCD1602_Uxset_XY(uchar x,uchar y);//设置LCD1602 void LCD_uchar(uchar x,uchar y,uchar DAT)的显示位置x(0-16),y(1-2);//-在LCD1602中,显示包含无效字符的LCD;uchar x,uchar y,uchar*s);在LCD1602上显示一个字符串//void LCD_ucheck_uBusy(void);//检查Busy函数。

我没有使用这个功能,因为通过率很低。

LCD_u2;delay_10us(uint n);//-10微秒延迟子程序void LCD_udelay_50uS(uint n);/-延迟子程序50微秒初始化(无效){LCD_udelay_10us(20);LCD_uwrite_10us(0x38);//-设置8位格式,2行,5x7 LCD_2;delay_10us(5);LCD_uwrite_u命令(0x0c);//-整体显示,关闭光标,不闪烁LCD 不闪烁LCD_延时延时10us(5);LCD_写写写命令(0x06);///-设置输入模式,增量增量不移位LCD_延时延时10us 10us(5);LCD_写写写命令(0x01);///-清除LCD_延时延时50uS在屏幕上的显示屏(40);}//将无效的LCD命令写入lcd602_写写写的命令(uchar dat){LCD_u写写写的命令(uchar dat){LCD_延迟延迟_10us(5;5);LCD液晶显示无Rs=0;//命令LCD液晶显示u 10us(5);LCD_Rs=0;//命令LCD_LCD_ _在LCD_Udb=dat;LCD_uDelay_10us(5);LCD_ue=1;//允许LCD_delay_10us(5);LCD_ue=0;}/-将无效的LCD写入LCD1602_写数据(uchar dat){LCD_u延时_10us(5);LCD_urs=1;//数据液晶显示液晶显示u RW=0;//数据液晶显示显示uu RW=0;//向LCD写入液晶显示的DB=dat;LCD_延迟延时10us 10us(5;5);LCD_E=E=1;//将无效的LCD写入LCD_延迟_延迟_(u (5);LCD液晶显示LCD_u延迟10us(5);LCD_E=0;}/-设置显示位置无效LCD_uxy(uchar (x,uchary y){uchar地址;如果(y==1){address=0x80+x;/-第一行位置}其他{地址=0xc0+x;///第二行位置}液晶显示器延时延时延时10us(5);LCD液晶显示写写命令(地址);}/-显示字符功能功能voidlcd xdisp char(ucharx,uchary y,uchardat的uchar dat)//--液晶显示器显示器的disp char(0,1,0x38 0x38);//-显示8{LCD显示液晶显示器xxxxx0,1,0x38);//-显示8{LCD[液晶显示设设设设设设设设设设设设设设设设设(x,y);液晶显示器延迟_10us(5);LCD_write_u2;Data(DAT);}/-显示字符串函数void LCD_uP_u3;string (uchar x,uchar y,uchar*s){LCD_uxset_xy(x,y);LCD_uuDelay_10us(5);while(*s!='\0'){LCD_2;write_uData(*s);s++;}//∠s++;}/∠s++/>check_Busy()///实践证明,在我的LCD1602上,check Busy命令的通过率很低,LCD正常使用。

LCD1602介绍及应用

LCD1602介绍及应用

LCD1602介绍及应用5.1 液晶概述液晶(Liquid Crystal)是一种高分子材料,因为其特殊的物理、化学、光学特性,20世纪中叶开始被广泛应用在轻薄型的显示技术上。

当不通电时,液晶排列混乱,阻止光线通过;而当通电时液晶导通,排列变的有秩序,使光线容易通过。

让液晶如闸门般地阻隔或让光线穿透。

从技术上简单地说,液晶面板包含了两片相当精致的无钠玻璃素材,中间夹着一层液晶。

当光束通过这层液晶时,液晶本身会排排站立或扭转呈不规则状,因而阻隔或使光束顺利通过。

大多数液晶都属于有机复合物,由长棒状的分子构成。

在自然状态下,这些棒状分子的长轴大致平行。

将液晶倒入一个经精良加工的开槽平面,液晶分子会顺着槽排列,所以假如那些槽非常平行,则各分子也是完全平行的。

液晶显示器的英文名字是Liquid Crystal Display,缩写为LCD。

它的主要原理是以电流刺激液晶分子产生点、线、面配合背部灯管构成画面。

液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。

除了黑白显示外,液晶显示器还有多灰度有彩色显示等。

如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。

液晶显示器有段型、字符型和图形型。

段型同LED一样,只能用于显示数字;字符型则只能显示ASCII 码字符,如数字、大小写字母、各种符号等。

各种字符型和图形型的液晶型号通常是按照显示支付和行数或液晶点阵的行、列数命名的。

例如,1602的意思是每行显示16个字符,共可显示2行。

类似的命名有1602,0801、0802等。

图形型液晶不仅可以显示ASCII码,也可以显示汉字字符和各种图型。

图形型液晶的命名是按照液晶显示器中每列和每行的点数命名的。

如12864,即指该液晶的点有128列,64行,共有128×64个点。

类似的有12232、19264、192128、320240等。

LCD1602和LCD12864程序-并行与串行

LCD1602和LCD12864程序-并行与串行

LCD1602和LCD12864的函数库,包括并行与串行LCD1602基础函数#ifndef __LCD1602_JCK_C__#define __LCD1602_JCK_C__/************************************************** **** 六哥LCD1602基础函数库 **** ****************************************************///使用请注意定义引脚#include"yscx.c"/***************************************************************** LCD1602判忙函数******************************************************************/ void LCD1602_PM(void){unsigned char temp1;//状态信息(判断是否忙)LCD1602_SJ=0xFF;//记得在包含该头文件前,定义引脚LCD1602_RS=0; //记得在包含该头文件前,定义引脚LCD1602_RW=1; //记得在包含该头文件前,定义引脚LCD1602_E=1; //记得在包含该头文件前,定义引脚do{temp1 = LCD1602_SJ;//记得在包含该头文件前,定义引脚LCD1602_SJ=0xFF;}while(temp1&0x80);LCD1602_E=0;//记得在包含该头文件前,定义引脚YS_us(1); //}/*------------------------------------------------LCD1602写入命令函数------------------------------------------------*/void LCD1602_XZL(unsigned char ml){LCD1602_PM(); //忙则等待LCD1602_RS= 0; //记得在包含该头文件前,定义引脚LCD1602_RW= 0; //记得在包含该头文件前,定义引脚LCD1602_E = 1;//记得在包含该头文件前,定义引脚LCD1602_SJ=ml; //记得在包含该头文件前,定义引脚YS_us(1);//稍作延时给LCD反应的时间LCD1602_E = 0;//记得在包含该头文件前,定义引脚if(ml==0x01|ml==0x02) YS_ms(2);//清屏和地址归位大概需2ms时间处理 YS_us(35);//其他指令大概需35us/*------------------------------------------------LCD1602写入数据函数------------------------------------------------*/void LCD1602_XSJ(unsigned char sj){LCD1602_PM(); //忙则等待LCD1602_RS=1; //记得在包含该头文件前,定义引脚 LCD1602_RW=0; //记得在包含该头文件前,定义引脚 LCD1602_E= 1;//记得在包含该头文件前,定义引脚 LCD1602_SJ=sj; //记得在包含该头文件前,定义引脚 YS_us(1);//稍作延时给LCD反应的时间LCD1602_E= 0;//记得在包含该头文件前,定义引脚 }/*------------------------------------------------LCD1602初始化函数------------------------------------------------*/void LCD1602_CSH(void){LCD1602_XZL(0x38); /*显示模式设置*/LCD1602_XZL(0x08); /*显示光标移动设置*/LCD1602_XZL(0x01); /*显示开及光标设置*/LCD1602_XZL(0X06);LCD1602_XZL(0X0c);}#endifLCD1602显示函数#ifndef __LCD1602_XSK_C__#define __LCD1602_XSK_C__/******************************************************* **************** 六哥LCD1602显示函数库 **************** *********************************************************/#include"yscx.C"#include"LCD1602_JCK_cx.C"//为保证显示数制时的运行效率,制作了0—9,A—F的ascll码表unsigned char codeascll1602[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43, 0x44,0x45,0x46};/*********************************************************************LCD1602数制显示(十或十六)*******************************************************************sj:需要显示的数据ml:显示地址设定xsfs:显示方式,进制和小数点的判断依据,*/void LCD1602_SZXS(signed long sj,unsigned char xsfs,ml)///wei为1输出十六进制,否则输出十进制{unsigned long xc; //显示缓存unsigned char a;bit xsd,fs,bf=0;xsd=0;fs=0;LCD1602_XZL(0x04);//设置光标向左移LCD1602_XZL(ml);if(xsfs>10){a=16; //输出十六进制LCD1602_XSJ(0x48);//显示Hxsfs=0;} //else{a=10; //否则输出十进制if(xsfs!=0) xsd=1;//显示小数点使能if(sj<0){sj=~sj+1;fs=1;} //显示负号使能}xc=sj;if(xc!=0) //显示数据不为0;则显示{while(xsd) //判是否需要显示小数{if(xc!=0) //是否还需要计算{ml=xc%a;if(bf|ml!=0) //小数部分为0不需要显示{LCD1602_XSJ(ascll1602[ml]); //取数的ascll码并显示bf=1; //小数部分不为0标志,小数部分数字有效}xc/=a; //取剩下的数}else if(bf) LCD1602_XSJ(0x30);//判是否需要补0else; //小数部分无效,不需要补0xsfs--;if(xsfs==0) //小数点位数减一{xsd=0; //小数计算部分结束标志if(bf) LCD1602_XSJ(0x2e); //小数部分存在有效数字则显示小数点 }}}////////////整数显示部分////////////////////////////////////////////do{LCD1602_XSJ(ascll1602[xc%a]); //取数的ascll码并显示xc/=a;}while(xc!=0);if(fs) LCD1602_XSJ(0x2d);//判是否需要显示负号LCD1602_XZL(0x06);//还原光标移动方向}/********************************LCD1602LCD1602字符显示程序*********************************/void LCD1602_ZFXS(unsigned char *SJ,t,ml)/*h:行,SJ:字符串指针,t:间隔时间*/ {LCD1602_XZL(ml); //写指令while(*SJ)//是否显示完{LCD1602_XSJ(*SJ);//写数据SJ++; //取下一个字符YS_ms(t); //延时}#endifLCD12864基础函数—并行#ifndef __LCD12864_JCK_C__#define __LCD12864_JCK_C__/************************************************ ** **** 六哥LCD12864基础函数库 **** ****************************************************/ //使用请注意定义引脚#include"yscx.c"/********************测忙碌**********************/ //测忙碌子程序//RS=0,RW=1,E=H,D0-D7=状态字/************************************************/ void LCD12864_PM(void)unsigned char temp1;//状态信息(判断是否忙)LCD12864_RS=0; // 记得在包含该头文件前,定义引脚LCD12864_RW=1; // 记得在包含该头文件前,定义引脚LCD12864_E=1; //记得在包含该头文件前,定义引脚do{temp1 = LCD12864_SJ;//记得在包含该头文件前,定义引脚 LCD12864_SJ=0xFF;}while(temp1&0x80);LCD12864_E=0; //记得在包含该头文件前,定义引脚YS_us(1); //}/********************写命令**********************/ //写命令子程序///************************************************/ void LCD12864_XZL(unsigned char ml)/*写命令*/{LCD12864_PM();LCD12864_RS=0; //记得在包含该头文件前,定义引脚LCD12864_RW=0; //记得在包含该头文件前,定义引脚LCD12864_E=1; //记得在包含该头文件前,定义引脚LCD12864_SJ=ml;//记得在包含该头文件前,定义引脚YS_us(0);//稍作延时给LCD反应的时间LCD12864_E=0; //记得在包含该头文件前,定义引脚if(ml==0x01|ml==0x02) YS_ms(3);//清屏和地址归位大概需3ms时间处理YS_us(50);//其他指令大概需50us}/********************写数据**********************///写数据子程序///************************************************/void LCD12864_XSJ(unsigned char sj){LCD12864_PM();LCD12864_RS=1; //记得在包含该头文件前,定义引脚LCD12864_RW=0; //记得在包含该头文件前,定义引脚LCD12864_E=1; //记得在包含该头文件前,定义引脚LCD12864_SJ=sj;//记得在包含该头文件前,定义引脚YS_us(0);//稍作延时给LCD反应的时间LCD12864_E=0; //记得在包含该头文件前,定义引脚}/********************初始化**********************///复位、通讯方式选择/************************************************/void LCD12864_CSH(void){P26=1; //通讯方式为并口PSB=1,在设计电路时就把PSB端焊好,节省I/O //LCD12864_XZL(0x34); //34H--扩充指令操作LCD12864_XZL(0x30); //功能设置,一次送8位数据,基本指令集LCD12864_XZL(0x0C); //0000,1100 整体显示,游标off,游标位置offLCD12864_XZL(0x01); //0000,0001 清DDRAMLCD12864_XZL(0x02); //0000,0010 DDRAM地址归位LCD12864_XZL(0x80); //1000,0000 设定DDRAM 7位地址000,0000到地址计数器ACLCD12864_XZL(0x06);}#endifLCD12864基础函数—串行#ifndef __LCD12864_JCK_CX_C__#define __LCD12864_JCK_CX_C__/************************************************** **** 六哥LCD12864基础函数库 **** 串行 ****************************************************///使用请注意定义引脚#include"yscx.c"/*******************串行通信*********************分别发送三个字节,11111AB0,DDDD0000,SSSS000,A:即表示并行的RW,1为读,0为写B:即表示并行的RS,1为数据,0为指令D:即表示并行的高四位数据S:即表示并行的低四位数据注:串行要把PSB端为低电平*************************************************/void LCD12864_CXTX(unsigned char fs,sj){unsigned char i;LCD12864_E=0;//时钟SCLKLCD12864_RS=1;///CS片选do ////LCD判忙============={for(i=0;i<8;i++){YS_us(1);//MCU与LCD速率匹配if(i<6) LCD12864_RW=1;//读LCD数据,前6位为1;后两位为0 else LCD12864_RW=0;//命令格式11111100B,0xfcYS_us(1);//MCU与LCD速率匹配LCD12864_E=1;//时钟SCLKYS_us(1);//MCU与LCD速率匹配LCD12864_E=0;//时钟SCLK}YS_us(5);//给LCD反应的时间LCD12864_E=1;//时钟SCLKYS_us(1); //给LCD反应的时间}while(LCD12864_RW);//判忙只需要取最高位,而不管后面7位LCD12864_E=0;//时钟SCLKLCD12864_RS=0;///CS片选YS_us(1);//给LCD反应的时间LCD12864_RS=1;///CS片选for(i=0;i<24;i++)//、、、、送3字节{LCD12864_RW=fs&0x80;//数据SIDfs<<=1;YS_us(1); //MCU与LCD速率匹配LCD12864_E=1; //时钟SCLKYS_us(1); //MCU与LCD速率匹配if(i==7) fs=sj&0xf0; //取数据高四位if(i==15) fs=sj<<4; //取数据低四位LCD12864_E=0; //时钟SCLKYS_us(1); //MCU与LCD速率匹配}LCD12864_RS=0;///CS片选LCD12864_E=1;//恢复高电平不影响其他用途LCD12864_RW=1;//恢复高电平不影响其他用途}/********************写命令**********************/void LCD12864_XZL(unsigned char ml)/*写命令*/{LCD12864_CXTX(0xf8,ml);//命令格式11111000B,0xf8if(ml==0x01|ml==0x02) YS_ms(4);//清屏和地址归位大概需4ms时间处理YS_us(50);//其他指令大概需50us}/********************写数据**********************/void LCD12864_XSJ(unsigned char sj){LCD12864_CXTX(0xfa,sj);//命令格式11111010B,0xfa}/********************初始化**********************///复位、通讯方式选择/************************************************/void LCD12864_CSH(void){P26=0; //通讯方式为串行通信PSB=0,在设计电路时就把PSB端焊好,节省I/O//LCD12864_XZL(0x34);//34H--扩充指令操作LCD12864_XZL(0x30); //功能设置,一次送8位数据,基本指令集LCD12864_XZL(0x0C); //0000,1100 整体显示,游标off,游标位置offLCD12864_XZL(0x01); //0000,0001 清DDRAMLCD12864_XZL(0x80); //1000,0000 设定DDRAM 7位地址000,0000到地址计数器ACLCD12864_XZL(0x06);}#endifLCD12864显示函数#ifndef __LCD12864_XSK_C__#define __LCD12864_XSK_C__/******************************************************* **************** 六哥LCD12864显示函数库 **************** *********************************************************///使用请注意定义引脚#include"LCD12864_JCK_cx.C"//包含基础库//为保证显示数制时的运行效率,制作了0—9,A—F的ascll码表unsigned char codeascll12864[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x4 3,0x44,0x45,0x46};/***************************************************************LCD12864设置显示地址函数***************************************************************************/unsigned char LCD12864_SZDZ(unsigned char x,y)//{switch(y){case 0:x|=0x80;break;case 1:x|=0x90;break;case 2:x|=0x88;break;case 3:x|=0x98;break;default:;}return(x);}/***************************************************************LCD12864数制显示函数******************************************************************************sj:需要显示的数据,取值范围:十进制:-2147483648-2147483647,十六进制:0H-7FFFFFFFHxsfs:显示方式,进制和小数点的判断依据,x:显示列,取值范围0-7y:显示行,取值范围0-3*/void LCD12864_SZXS(signed long sj,unsigned char xsfs,x,y) {unsigned long xc; //显示缓存unsigned char d[13];bit xsd,fs,bf=0;xsd=0;fs=0;LCD12864_XZL(0x04);//设置光标左移LCD12864_XZL(LCD12864_SZDZ(x,y));//写入显示地址y=0;if(xsfs>10){x=16; //输出十六进制d[y]=0x48; //十六进制显示Hy++;} //else{if(sj<0) //十进制正负数判断{sj=~sj+1;fs=1;} //负号显示使能if(xsfs!=0) xsd=1;//小数点显示使能x=10;} //xc=sj;if(xc!=0) //显示数据不为0;则显示{while(xsd) //判是否需要显示小数{if(xc!=0) //是否还需要计算{sj=xc%x;if(bf|sj!=0) //小数部分为0不需要显示{d[y]=ascll12864[xc%x];y++; //取数的ascll码并显示bf=1; //小数部分不为0标志,小数部分数字有效 }xc/=x; //取剩下的数}else if(bf){d[y]=0x30; //判是否需要补0y++;}else; //小数部分无效,不需要补0xsfs--;if(xsfs==0) //小数点位数减一{xsd=0; //小数计算部分结束标志if(bf){d[y]=0x2e; //小数部分存在有效数字则显示小数点y++;}}}}do{d[y]=ascll12864[xc%x]; //取数的ascll码y++;xc/=x;}while(xc!=0);if(fs){d[y]=0x2d; //取负号ascll码y++;}if(y&&0x01) //如果显示的位数为奇数{d[y]=0x20; //显示一个空格y++;}x=y;y=1;///////////////显示数据//////////////do{LCD12864_XSJ(d[y]);//显示一个地址的前一个字符 y--;LCD12864_XSJ(d[y]);//显示一个地址的后一个字符 y+=3; //跳到下一个要显示的两个字符 }while(y<x); //判断是否显示完毕LCD12864_XZL(0x06);//设置光标右移}/***************************************************** **********LCD12864字符显示函数************************ ****************************************************** *zfc:需要显示的字符串指针,字符数不得超过64个x:显示列,取值范围0-7y:显示行,取值范围0-3*/void LCD12864_ZFXS(unsigned char *zfc,x,y){unsigned char k1,k2,k3;k3=x*2;k1=16-k3;k2=32-k3;k3=48-k3;switch(y) //设置显示地址x和换行标志y{case 0:x|=0x80;y=0;break;case 1:x|=0x90;y=16;break;case 2:x|=0x88;y=32;break;case 3:x|=0x98;y=48;break;default:;}LCD12864_XZL(x);//写显示地址while(*zfc){if(y==k1) LCD12864_XZL(0X90);//换行判断else if(y==k2) LCD12864_XZL(0X88);//换行判断 else if(y==k3) LCD12864_XZL(0X98);//换行判断 else;LCD12864_XSJ(*zfc);//写显示数据y++;/////////////判中文字符/////////if(*zfc>0x7f) zfc++;else{zfc++;if(*zfc>0x7f && y&0x01){LCD12864_XSJ(0x20);y++;}}}}#endif延时函数#ifndef __yscx_C__#define __yscx_C__#include<intrins.h>/*晶振频率33Mhz的stc15系列1T单片机适用*//************************************************** x*us延时函数精度极高,几乎可以忽略延时误差***************************************************/ void YS_us(unsigned char t){for( ;t>0;t--){_nop_();//16*nop_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//16*nop_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//16*nop}_nop_();//12*nop_nop_();_nop_();_nop_();_nop_();_nop_();//12*nop_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//12*nop}/*--------------------------------------------------- x*1ms延时函数----------------------------------------------------*/ void YS_ms(unsigned char t){for( ;t>0;t--){YS_us(250);YS_us(250);YS_us(250);YS_us(249);}}#endif(注:文档可能无法思考全面,请浏览后下载,供参考。

51单片机lcd1602全过程C语言编程显示大全

51单片机lcd1602全过程C语言编程显示大全
所谓 1602 是指显示的内容为 16*2,即可以显示两行,每行 16 个字符。目前市面 上字符液晶绝大多数是基于 HD44780 液晶芯片的,控制原理是完全相同的,因此基于 HD44780 写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
背光,黑色字体)
1602 液晶的正面(绿色
光,黑色字体)
“study up”程序中没有用到忙检测,而是用的是延时函数来替代忙检测
#include<reg52.h> //包含头文件,这个嘛,就不用多说了~~
#define uint unsigned int //预定义一下
#define uchar unsigned char sbit rs=P3^5; //1602 的数据/指令选择控制线
3.进入模式设置指令
功能:设定每次定入 1 位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。 参数设定的情况如下数据后光标左移 1=写入新数据后光标右移 0=写入新数据后显示屏不移动 1=写入新数据后显示屏整体右移 1 个字
4.显示开关控制指令
功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下:
位名
设置
D
0=显示功能关
1=显示功能开
C
0=无光标
1=有光标
B
0=光标闪烁
1=光标不闪烁
5.设定显示屏或光标移动方向指令
功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下:
S/C
R/L
设定情况
0
0
光标左移 1 格,且 AC 值减 1
0
1
光标右移 1 格,且 AC 值加 1
1
0
显示器上字符全部左移一格,但光标不动

lcd1602程序流程图

lcd1602程序流程图

LCD1602程序代码和显示流程图LCD1602显示程序代码_ DB P0 //---P0 = DB0〜DB7位LCD_ RS = P2; //--p2.0 = RS 位LCD_ RW = P2; //--p2.1 = RW 位LCD_ E = P2; //-p2.2 = E / /---/--/--定义函数ා 定义uchar unsigned char ා 定义uint unsigned int // //-定义子程序函数void LCD_ Init (void ); //-初始化LCD1602函数void LCD_ write_ Command (uchar command ); //-写指令功能无效LCD 到LCD1602_ write_数据(uchar DAT ); //-将无效的LCD 数据写入LCD1602_ set_ XY (uchar x ,uchar y ); //设置LCD1602的显示位置x (0-16),y(1-2)void LCD_ disp_ Char(uchar x,uchar y,uchar DAT); //-在LCD1602_ disp_ String (uchar x,uchar y,uchar * s)上显示字符无效的LCD;//-在LCD1602上显示字符串// void LCD_ check_ Busy(void); //检查忙功能。

我没有使用此功能,因为通过率非常低。

LCD_ delay_ 10us(uint n); //-一个10微秒的延迟子程序void LCD_ delay_ 50uS(uint n); /-延迟子程序50微秒_ init(无效){LCD_ delay_ 10us(20); LCD_ write_命令(0x38); //-设置8位格式,2行,5x7 LCD_ delay_ 10us(5);LCD_ write_命令(0x0c); //-整体显示,关闭光标,不闪烁LCD_ delay_ 10us(5);LCD_ write_命令(0x06); //-设置输入模式,增量不移位LCD_ delay_ 10us(5);LCD_ write_命令(0x01); // /-清除屏幕上的LCD_ delay_ 50uS(40);} //将无效的LCD指令写入LCD1602_ write_命令(uchar dat){LCD_ delay_ 10us (5);LCD_ Rs = 0; //命令LCD_RW = 0;//写入LCD_ DB = dat; LCD_ delay_ 10us(5); LCD_ E = 1; //允许LCD_delay_10us(5);LCD_ E = 0;} /-将数据无效LCD写入LCD1602_ write_ data(uchar dat){LCD_ delay_ 10us(5);LCD_ Rs = 1; //数据LCD_RW = 0;//写入LCD_ DB = dat; LCD_ delay_ 10us(5); LCD_ E = 1; //允许LCD_delay_10us(5);LCD_ E = 0;} /-设置显示位置无效LCD_ set_ XY(uchar x,uchar y){uchar地址;如果(y = = 1){地址= 0x80 + X; /-第一行位置} else {地址= 0xc0 + X; //第二行位置} LCD_ delay_ 10us(5); LCD_ write_命令(地址);} /-显示字符函数void LCD_ disp_ char(uchar x,uchar y,uchar dat)//--LCD_ disp_ Char(0,1,0x38); /-显示8 {LCD_ set_ xy(x,y); LCD_ delay_ 10us(5); LCD_ write_ Data(DAT);} /-显示字符串函数void LCD_ disp_ string(uchar x,uchar y,uchar * s){LCD_ set_ xy(x,y); LCD_ delay_ 10us(5); while(* s!='\ 0'){LCD_ write_ Data(* s); s + +;} / /≡S + +;} /≡S + _ check_ Busy()// /实践证明,在我的LCD1602上,检查忙指令的通过率非常低,并且{/ /液晶正常使用。

LCD1602数据手册LCD16...

LCD1602数据手册LCD16...

LCD1602数据手册1602采用标准的16脚接口,其中:第1脚:VSS为地电源第2脚:VDD接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。

当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:D0~D7为8位双向数据线。

第15~16脚:空脚1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”1602液晶模块内部的控制器共有11条控制指令,如表2所示,它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。

(说明:1为高电平、0为低电平)指令1:清显示,指令码01H,光标复位到地址00H位置指令2:光标复位,光标返回到地址00H指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。

高电平表示有效,低电平则无效指令4:显示开关控制。

D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符指令7:字符发生器RAM地址设置指令8:DDRAM地址设置指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。

IIC接口 I2C接口 LCD1602 程序

IIC接口 I2C接口 LCD1602 程序

PIC16F1824驱动IIC/I2C接口LCD1602液晶模块前一段时间,做一个显示电路,7段码显示内容太少,LCD1602占用的IO又太多,最后找到一种IIC/I2C接口LCD1602转接板。

T宝上买的LCD1602转接板,有资料,不过是针对Arduino的。

决定自己写程序。

首先得知道从器件地址。

T宝卖家给的地址是0x27(针对Arduino),而单片机使用的时候需要先左移一位,0x4E;测试的时候一直没反应,用示波器看,单片机发送的地址没问题,但转接板没有应答,ACK 一直是高电平,推测还是地址错误;后来搜索发现,PCF8574与PCF8574A的地址是不一样的,而T宝卖的是PCF8574A,给的资料还是PCF8574。

最后确认,从器件PCF8574A地址应该是0x7E;后来发送地址0x7E后,有应答ACK,又搜了写LCD1602的显示程序,稍微改了改,显示成功了;主要的程序如下:MCU:PIC16F1824IIC/I2C接口LCD1602转接板:PCF8574ATmain.c中包含:I2CInit();LCD1602Init();Dip_Single_char(1,5,'A');//********************************************************************// 文件名称: I2C.h// 创建日期: 2016-10-11// 最新更改: 2016-10-11// 描述: I2C初始化//********************************************************************//#define _XTAL_FREQ 2000000 // 延时函数delay_us/ms使用此值#define Slave_Add 0x7E // 从器件地址,PCF8574A,0x7E// PCF8574,0x27,左移1位,0x4E,#define I2C_BPS 0x18 // I2C波特率Fclock = Fosc/((I2C_BPS+1)*4) // 2MHz,20k,0x18#define Idle !(SSP1STATbits.R_nW|(0x1F & SSP1CON2)) // 空闲void I2CInit ( );void I2CStart ( );void I2CStop ( );void ReStart ( );void I2CSendByte(unsigned char I2CSnBy);void WriteCommand(unsigned char Command);void WriteData (unsigned char Data);void LCD1602Init(void);void Dip_Single_char(unsigned char col,unsigned char row,unsigned char sign); void DisDec(unsigned char col_D,unsigned char row_D,unsigned int Temp_k );/*********************************************************************** The End*********************************************************************///********************************************************************// 文件名称: I2C.c// 创建日期: 2016-10-11// 最新更改: 2016-10-11// 描述: I2C初始化//********************************************************************//#include "xc.h"#include "I2C.h"/*********************************************************************** Function name: I2CInit** Descriptions: 注意:必须将SDA、SCL引脚配置为输入引脚,<<DS P293>>** input parameters: 无** output parameters: 无** Returned value: 无**********************************************************************/void I2CInit (void){SSP1STATbits.SMP = 1; // 禁止标准速度模式下的压摆率控制SSP1STATbits.CKE = 0; // 禁止SMBus特定输入SSP1CON1bits.SSPEN = 1; // 使能I2C,并将SDA 和SCL引脚配SSP1CON1bits.SSPM = 0x8; // I2C主模式SSP1ADD = I2C_BPS; // Fclock = Fosc / ((SSP1ADD + 1)*4)}/*********************************************************************** Function name: I2CStart ( )** Descriptions: I2C开始** input parameters: 无** output parameters: 无** Returned value: 无**********************************************************************/void I2CStart ( ){while (!Idle);SSP1CON2bits.SEN = 1; // 在SDA和SCL引脚上发出启动条件,硬件自动清零 while(SSP1CON2bits.SEN); // 启动条件发送完成while(!Idle);}/*********************************************************************** Function name: I2CStop ( )** Descriptions: I2C停止** input parameters: 无** output parameters: 无** Returned value: 无**********************************************************************/void I2CStop(){while (!Idle);SSP1CON2bits.PEN = 1; // 在SDA和SCL引脚上发出停止条件,硬件自动清零 while(SSP1CON2bits.PEN); // 停止条件发送完成while(!Idle);}/*********************************************************************** Function name: ReStart()** Descriptions: I2C ,ReStart** input parameters: 无** output parameters: 无** Returned value: 无**********************************************************************/void ReStart(){while (!Idle);SSP1CON2bits.RSEN = 1; // 在SDA和SCL引脚上发出重复启动条件,硬件自动清零while(SSP1CON2bits.RSEN); // 重复启动条件发送完成while(!Idle);}/*********************************************************************** Function name: I2CSendByte()** Descriptions: SSP1BUF中写入字节** input parameters: I2CSnBy,要发送的数据** output parameters: 无** Returned value: 无**********************************************************************/void I2CSendByte(unsigned char I2CSnBy) {while (!Idle);SSP1BUF = I2CSnBy; // SSP1BUF中写入字节while(!Idle);}/*********************************************************************** Function name:** Descriptions:** input parameters:** output parameters: 无** Returned value: 无**********************************************************************/void WriteCommand(unsigned char Command){I2CStart(); // I2C开始I2CSendByte(Slave_Add); // 从器件地址unsigned char Temp_C;Temp_C = Command & 0xF0;Temp_C |= 0x0C; // P3=1 EN=1 RW=0 RS=0I2CSendByte(Temp_C);Temp_C &= 0xF8; // P3=1 EN=0 RW=0 RS=0I2CSendByte(Temp_C);Temp_C = (Command & 0x0F)<< 4;Temp_C |= 0x0C; // P3=1 EN=1 RW=0 RS=0I2CSendByte(Temp_C);Temp_C &= 0xF8; // P3=1 EN=0 RW=0 RS=0I2CSendByte(Temp_C);I2CStop(); // I2C停止}/********************************************************************* ** Function name:** Descriptions:** input parameters:** output parameters: 无** Returned value: 无**********************************************************************/void WriteData (unsigned char Data){I2CStart(); // I2C开始I2CSendByte(Slave_Add); // 从器件地址unsigned char Temp_D;Temp_D = Data & 0xF0;Temp_D |= 0x0D; // P3=1 EN=1 RW=0 RS=1I2CSendByte(Temp_D);Temp_D &= 0xF9; // P3=1 EN=0 RW=0 RS=1I2CSendByte(Temp_D);Temp_D = (Data & 0x0F)<< 4;Temp_D |= 0x0D; // P3=1 EN=1 RW=0 RS=1I2CSendByte(Temp_D);Temp_D &= 0xF9; // P3=1 EN=0 RW=0 RS=1I2CSendByte(Temp_D);I2CStop(); // I2C停止}/*********************************************************************** Function name: LCD1602Init(void),LCD1602初始化** Descriptions: 写一次,偶尔不能正常显示,重复2次** input parameters:** output parameters: 无** Returned value: 无**********************************************************************/void LCD1602Init(void){__delay_ms(10);WriteCommand(0x33); __delay_ms(5);WriteCommand(0x32); __delay_ms(5);WriteCommand(0x28); __delay_ms(5);WriteCommand(0x0C); __delay_ms(5);WriteCommand(0x06); __delay_ms(5);WriteCommand(0x01); __delay_ms(5); // 清屏__delay_ms(10);WriteCommand(0x33); __delay_ms(5);WriteCommand(0x32); __delay_ms(5);WriteCommand(0x28); __delay_ms(5);WriteCommand(0x0C); __delay_ms(5);WriteCommand(0x06); __delay_ms(5);WriteCommand(0x01); __delay_ms(5); // 清屏}/********************************************************************** Function name: L1602_char(uchar col,uchar row,char sign)** Descriptions: 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如,Dip_Single_char(1,5,'A');** input parameters: 行,列,需要输入1602的数据** output parameters: 无** Returned value: 无*********************************************************************/void Dip_Single_char(unsigned char col,unsigned char row,unsigned char sign){ unsigned char a;if(col == 1) a = 0x80;if(col == 2) a = 0xc0;a = a + row - 1;WriteCommand(a);WriteData(sign);}/********************************************************************** Function name: Dip_Single_char** Descriptions: 显示int型数据,5位** input parameters: 行,列,数据** output parameters: 无** Returned value: 无*********************************************************************/void DisDec(unsigned char col_D,unsigned char row_D,unsigned int Temp_k ){if(Temp_k>=65535) Temp_k=65535;unsigned int Temp_Ts;unsigned char Table[5]; // 数字与1602显示码转换Table[0] = Temp_k/10000+48; // 万位Temp_Ts = Temp_k%10000; // 取余,0-9999Table[1] = Temp_Ts/1000+48; // 千位Temp_Ts = Temp_Ts%1000; // 取余,0-999Table[2] = Temp_Ts/100+48; // 百位Temp_Ts = Temp_Ts%100; // 取余,0-99Table[3] = Temp_Ts/10+48; // 十位Table[4] = Temp_Ts%10+48; // 个位unsigned char q;for(q=0;q<5;q++){ // 显示Dip_Single_char(col_D,q+row_D,Table[q]);}}/*********************************************************************** The End*********************************************************************/。

LCD1602地电路图和程序

LCD1602地电路图和程序

''MS基于1602字符型液晶显示器的显示系统姓名:杨越班级:电子11-1学号:110400104一、实习目的(1)了解飞思卡尔单片机的基本原理,掌握其基本的工作流程。

(2)了解LCD1602的基本原理及用法。

(3)能够熟练使用CodeWarrior软件编写C语言程序,使用BDM仿真器下载程序。

(4)能够熟练焊接电路板。

二、实验设备与器件CodeWarrior软件,BDM仿真器,万用电路板,飞思卡尔单片机,LCD1602液晶显示器,三、实验内容内容:利用飞思卡尔单片机制作基于1602字符液晶显示器的显示系统要求:用四个按键控制,按下第一个按键显示1,按下第二个按键显示2,以此类推。

(1)LCD1602液晶显示器的原理:1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号);以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。

以下具体阐述这三个管脚:RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。

R/W为读写选择,高电平进行读操作,低电平进行写操作。

E端为使能端,后面和时序联系在一起。

除此外,D0~D7分别为8位双向数据线。

操作时序:注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0.读取状态字时,注意D7位,D7=1,禁止读写操作;D7=0,允许读写操作;所以对控制器每次进行读写操作前,必须进行读写检测。

(即后面的读忙子程序)指令集:LCD_1602 初始化指令小结:0x38 设置16*2显示,5*7点阵,8位数据接口0x01 清屏0x0F 开显示,显示光标,光标闪烁0x08 只开显示0x0e 开显示,显示光标,光标不闪烁0x0c 开显示,不显示光标0x06 地址加1,当写入数据的时候光标右移0x02 地址计数器AC=0;(此时地址为0x80)光标归原点,但是DDRAM中断内容不变0x18 光标和显示一起向左移动(2)飞思卡尔单片机的功能及特点:MC9S12XS128是 16 位单片机,由 16 位中央处理单元(CPU12X)、128KB 程序、Flash(P-lash)、8KB RAM、8KB 数据Flash(D-lash)组成片内存储器。

LCD1602液晶显示完全资料

LCD1602液晶显示完全资料

LCD1602液晶显示完全资料0x18 光标和显示一起向左移动4.显示地址:LCD1602内部RAM显示缓冲区地址的映射图,00~0F、40~4F分别对应LCD1602的上下两行的每一个字符,只要往对应的RAM地址写入要显示字符的ASCII代码,就可以显示出来。

5.读写时序:时序图1602手册中有,这里不引用了。

时序图很重要,编程就是根据时序图设置寄存器,让LCD工作。

二、LCD1602程序编写流程:LCD1602在了解完以上信息后便可以编写,这里我们把程序分为以下几步:1.定义LCD1602管脚,包括RS,R/W,E。

这里定义是指这些管脚分别接在单片机哪些I/O口上。

现举例如下:sbit EN=P3^4;sbit RS=P3^5;sbit RW=P3^6;2.显示初始化,在这一步进行初始化及设置显示模式等操作,包括以下步骤:设置显示方式延时清理显示缓存设置显示模式通常推荐的初始化过程如下:延时15ms写指令38H延时5ms写指令38H延时5ms写指令38H延时5ms注:以上写38H指令可以看情况省略1~2步(以上都不检测忙信号)(以下都要检测忙信号)写指令38H写指令08H 关闭显示写指令01H 显示清屏写指令06H 光标移动设置写指令0cH 显示开及光标设置3.设置显示地址(写显示字符的位置)。

4.写显示字符的数据。

三、LCD1602各子程序模块及主程序编写:现在按照上面编写程序的流程,给出各子程序模块及主程序的例子。

1.头文件,宏定义,定义管脚等:#include<reg52.h>#include <string.h>#define uchar unsigned char#define uint unsigned intsbit EN=P3^4;sbit RS=P3^5;sbit RW=P3^6;uchar code table0[]={"QQ:545699636"}; //此条语句为显示字符串时定义的字符串数组2.LCD1602基本初始化子程序:void LCD1602(){EN=0;RS=1;RW=1;P0=0xff; //这里P0为与LCD D0~D7相连的I/O口}3.读忙子程序:void read_busy(){P0=0xff;RS=0;RW=1;EN=1;while(P0&0x80); //P0和10000000相与,D7位若不为0,停在此处EN=0; //若为0跳出进入下一步;这条语句的作用就是检测D7位} //若忙在此等待,不忙跳出读忙子程序执行读写指令4.写指令写数据子程序:void write(uchar i,bit j){read_busy();P0=i; //其中i=0,写指令;i=1,写数据;RS=j;RW=0;EN=1;EN=0;}5.延时子程序:void delay(uint c) //功能为提供初始化等其他子程序中的延时1xc MS{uint a,b;for(a=0;a<c;a++)for(b=0;b<120;b++);}6.LCD1602初始化子程序:void init() //完全按照要求初始化流程来,中间省略了一步写指令38H{delay(15);write(0x38,0);delay(5);write(0x38,0);write(0x08,0);write(0x01,0);write(0x06,0);write(0x0c,0);}7.显示单个字符子程序:void display_lcd_byte(uchar y,uchar x,uchar z) //Y=0,1(起始行)X=0~15(起始列)Z=想写字符的ASCII码{if(y) //是否显示在第二行(若在第一行Y=0,不进入IF语句,若在第二行,进入IF语句{x+=0x40; //第二行起始地址加上列数为字符显示地址}x+=0x80; //设置数据指针位置write(x,0);write(z,1); //写入数据}8.显示字符串子程序:void display_lcd_text(uchar y,uchar x,uchartable[]) //Y,X同上字符显示,table[]字符串数组{uchar z=0;uchar t;t=strlen(table)+x; // 求得字符串长度加上起始列位置 while(x<t) //功能为LCD显示到字符串最后一个字符,防止字符串{ //没有16个字符,从而不够位产生乱码; display_lcd_byte(y,x,table[z]); //逐位显示数组内字符x++;z++;}}9.主程序:主程序里除了放入初始化程序外就是加入自己编写的显示子程序,根据你所要的不用功能可以编写各种类型的显示子程序,这里不做详细介绍,以下举例为显示一个字符和显示字符串的显示子程序。

基于单片机的lcd1602电子时钟设计

基于单片机的lcd1602电子时钟设计

基于单片机的LCD1602电子时钟设计一、设计任务和目的1.1、设计任务(1):用单片机设计基于LCD1602的电子时钟,显示时间和日期;(2):误差精度控制在1s/天;(3):具有时间和日期的校准功能;(4):能区分某年是闰年或平年,并对应显示2月份的天数;(5):根据月份的不同显示不同的最大日数;(6):搭建仿真电路图,模拟单片机要实现的功能;(7):焊接单片机开发板;(8):编写程序,下载并调试,实现要求的功能。

1.2、设计目的(1):熟练掌握KEIL软件的使用方法;(2):熟练掌握PROTEUS软件的使用方法;(3):掌握单片机I/O接口的工作原理;(4):掌握LCD显示器的工作原理及编程方法;(5):掌握独立式键盘的工作原理及编程使用方法;(6):掌握单片机的下载使用方法。

二、设计思路和方案论证2.1、设计思路电路总体上分为控制和显示部分。

以单片机最小系统作为核心控制电路,控制LCD显示,具体显示内容及方式由软件来完成;由于有时钟和日期的调节功能需要校准电路和基本的复位电路,复位电路采用按键复位,调节键、加1键、减1键三个按键完成,共需四个按键;计时功能由固定频率的晶振完成(采用11.0592MHz);显示部分主要采用LCD1602作为显示。

2.2、方案论证(1):时钟芯片的选择和论证方案一:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、月、年以及闰年补偿的年进行计数,精度也较高,工作电压2.5V~5.5V范围内,功耗也较低,但价格比较贵。

方案二:直接采用单片机定时计数器提供秒信号,使用程序实现秒、分、时、日、月、年计数。

采用此方案实现虽然有一定的时间误差,但可减少芯片的使用,节约成本,易于实现,符合现实选用,所以采用此种作为时钟信号发生器。

(2):显示模块选择方案和论证:方案一:采用点阵式图形LCD12864液晶显示屏,液晶显示屏的显示功能强大,可显示文字,图形,显示多样,清晰可见,但是价格昂贵,需要的接口线多,所以在此设计中不采用点阵式图形LCD12864液晶显示屏。

1602最详细资料

1602最详细资料

一、关于LCD1602:在编写LCD1602程序前,我们必须了解其手册上一些非常重要的信息,如果这些信息不能理解透彻,编程可能会遇到或多或少的问题,在此先大致归纳几点。

1.管脚:1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号);以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。

以下具体阐述这三个管脚:RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。

R/W为读写选择,高电平进行读操作,低电平进行写操作。

E端为使能端,后面和时序联系在一起。

除此外,D0~D7分别为8位双向数据线。

2.操作时序:信号真值表RS R/W EN 操作说明0 0 1→0 写入指令D0~D70 1 1 读出的D0~D7状态字1 0 1→0 写入D0~D7数据1 1 1 读出D0~D7数据注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0.读取状态字时,注意D7位,D7=1,禁止读写操作;D7=0,允许读写操作;所以对控制器每次进行读写操作前,必须进行读写检测。

(即后面的读忙子程序)3.指令集:LCD_1602 初始化指令小结:0x38 设置16*2显示,5*7点阵,8位数据接口0x01 清屏0x0f 开显示,显示光标,光标闪烁0x08 关闭显示0x0e 开显示,显示光标,光标不闪烁0x0c 开显示,不显示光标0x06 地址加1,当写入数据的时候光标右移0x02 地址计数器AC=0;(此时地址为0x80)光标归原点,但是DDRAM中断内容不变0x18 光标和显示一起向左移动4.显示地址:LCD1602内部RAM显示缓冲区地址的映射图,00~0F、40~4F分别对应LCD1602的上下两行的每一个字符,只要往对应的RAM地址写入要显示字符的ASCII代码,就可以显示出来。

5.读写时序:时序图1602手册中有,这里不引用了。

lcd1602程序流程图

lcd1602程序流程图

lcd1602程序流程图lcd1602程序流程图1、引脚3(对⽐调整电压)接正电源时对⽐度最低,接地时对⽐度最⾼,通常通过⼀个10k的电位器相连后接地,上电后需要对电位器进⾏调整以显⽰出相应的字符(就像调节电视的对⽐度使图像清晰,这⾥是使字符清晰)2、D0~D7为8为数据总线,⽤于与单⽚机之间的数据传送了解了引脚功能后,我们再来看其内置芯⽚关于HD44780HD44780内部含有DDRAM,CGROM,CGRAM下⾯我来简单介绍⼀下这三个存储器DDRAM是⽤于寄存待显⽰字符代码的,其内部带有80字节的RAM 缓冲区,与LCD屏幕的位置⼀⼀对应。

通常我们只使⽤前16个地址(两⾏32个),这样⼀来,我们便可以将这32个地址当作是我们的坐标,⽐如要在DDRAM的02H 地址(对应的是屏幕第⼀⾏第三个)显⽰字符“A”,我们就可以分两步⾛,⾸先⽤程序先找到“坐标点”,也就是将地址转到02H(具体如何不做详细说明),然后在这个位置写⼊“A”,写⼊地址和数据都是通过D0~D7实现的,详细的程序在⽂章的后⾯举例说明。

CGROM与CGRAM是LCD内部固化的字模存储器,这相当于芯⽚内部划出的⼀块区域,CGROM⾥⾯存放着我们⽇常所使⽤的⼀些字符(192个),⽽CGRAM则允许⽤户⾃定义⼀些字符(8个)。

具体对应关系如下,0x00~0x0F就是⽤户⾃定义的CGRAM区。

再回到之前的问题,在DDRAM的02H地址显⽰字符“A”,⾸先通过程序找到地址02H,然后在该地址写⼊41H,从图中也可看出该位置对应的字符就是“A”。

我们再来理⼀理这个过程,有关字符显⽰,⾸先便是找到DDRAM 中我们所要显⽰位置对应的地址,接着便是在这个地址写⼊⼀个地址(单⽚机中的间接寻址),LCD根据这个地址在CGROM中找到对应的字符,然后在02H这个位置显⽰出来,这个过程也到此结束。

由于CGROM中的字符代码与PC中的字符代码基本⼀致,通常我们也直接在02H地址直接写⼊“A”,简化了程序设计。

lcd1602指令解读及基本程序

lcd1602指令解读及基本程序
{
writecmd(0x38); //功能设定8位数据传输双行显示设置工作方式:0x28=4位总线字符两行显示,0x38=8位总线字符两行显示
writecmd(0x0c); //显示器开关
writecmd(0x01); //清屏
writecmd(0x06); //echaracter(1,0,0x80,yue);
displyonecharacter(1,0,0xc0,ri);
/*
HD44780内置了DDRAM、CGROM和CGRAM。
CGROM和CGRAM就是内置192个常用字符产生器,用户自定义的字符产生器RAM
DDRAM就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下表:
显示位置: 1 2 3 4 5 6 7 8 ..... 40
}
void location(unsigned char x,unsigned char y) //坐标函数
{
unsigned char temp;
temp=x&0x0f; //只要x数据的后四位
if(y)
{
temp=temp|0x40;
} //第一行为0第二行为1如果y=1则地址加0x40
temp|=0x80; //DDRAM地址的命令DB7为一
写指令输入:RS=0,RW=0,E=下降沿脉冲,DB0~DB7=指令码输出:无
写数据输入:RS=1,RW=0,E=下降沿脉冲,DB0~DB7=数据输出:无
读状态输入:RS=0,RW=1,E=1输出:DB0~DB7=状态字
读数据输入:RS=1,RW=1,E=1输出:DB0~DB7=数据/
*/
/*
lcd_1602指令:

LCD1602数据手册

LCD1602数据手册

数据总线
10
DB3
三态
数据总线
11
DB4
三态
数据总线
12
DB5
三态
数据总线
13
DB6
三态
数据总线
14
DB7
三态
数据总线(MSB)
15
LEDA
输入
背光+5V
第四章 HY字符型液晶显示模块指令集
一、指令集
1、1、清屏
RS R/W
DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0
0 0 0 0 0 0 0 1
运行时间(250Khz):1.64ms;
功能:清DDRAM和AC值。
实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)
以下是在液晶模块的第二行第一个字符的位置显示字母“A”的程序: ORG 0000H
RS EQU P3.7;确定具体硬件的连接方式
RW EQU P3.6 ;确定具体硬件的连接方式
第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共
同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,
当RS为高电平RW为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
指令8:DDRAM地址设置
指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或

lcd1602液晶显示数字钟

lcd1602液晶显示数字钟

{
time[1]=0;//超过,分清零
time[0]++;//小时加1
if(time[0]>23)//是否超过23
{
time[0]=0; //小时清零
•}

}
时间计算
• void main(void)
•{

uchar i;


while(1)

{
• 计时
for(i=0;i<250;i++)//循环调用显示程序250次,实现1秒
display_code[]={0x3f,0x60,0x5b,0x4 f,0x66,0x5d,0x7d,0x07,0x7f,0x6f,0x 40}; • uchar time[4]={0,0,0,0}; //时间初 值全为0
• void delay(void);//延时0.5毫秒 •{
定时1秒
• uchar i;
• for(i=250;i>0;i--);
•}
• void display()
/*程序用于P0口接数码管的断码,P2接数码管的位码*/
•{

uchar i,k;

k=0x80;
//k初始化,指向第一位数码管

for(i=0;i<8;i++) //循环8次,i值为0~7

{

P2=0;
//关闭显示

P0=display_code[time[i]/10]; //输出十位数的断码


{

display();//调用动态显示,动态显示一次约4毫秒

}

LCD1602液晶显示器设计

LCD1602液晶显示器设计

LCD1602液晶显示器设计概述:1.设计原理2.系统框架设计一个LCD1602液晶显示器,应该考虑到硬件电路和软件程序两个方面。

硬件电路主要包括液晶显示模块、信号控制芯片、电源模块等;软件程序主要包括驱动程序和显示程序两个方面。

3.硬件电路设计信号控制芯片:选择与液晶显示模块兼容的芯片,例如MCU控制芯片。

电源模块:设计合适的电源模块,能够提供稳定的电源供给。

4.软件程序设计驱动程序:设计液晶显示器所需的驱动程序,负责将外部数据转换成适合液晶显示的信号输出。

显示程序:编写显示程序,负责将要显示的内容通过驱动程序输出到液晶显示器上,实现文字、图形等的显示效果。

5.驱动原理液晶驱动原理是通过对液晶进行电压控制来实现显示,需要根据液晶的特性设计适合的驱动方案。

常见的驱动方式有静态驱动和动态驱动两种。

静态驱动方式将所有液晶单元的电压保持在一个特定的状态,优点是控制简单,缺点是对硬件要求较高、视点角度受限;动态驱动方式利用扫描原理,通过改变液晶单元的电压来实现不同显示效果,优点是控制复杂度低、硬件要求较低,缺点是造成显示的抖动现象。

6.显示原理液晶显示器的显示单位为像素,每个像素由多个液晶单元组成。

液晶单元的状态可根据电压变化分为亮态和暗态,通过控制液晶单元的电压,设计显示程序来实现需要显示的文字、图形等。

7.总结设计一个LCD1602液晶显示器需要从硬件电路和软件程序两个方面进行考虑。

硬件电路需要选择合适的液晶显示模块、信号控制芯片和电源模块;软件程序需要设计驱动程序和显示程序,实现文字、图像等的显示效果。

驱动原理和显示原理是设计过程中需要了解和考虑的关键内容。

以上为LCD1602液晶显示器设计的概要,详细内容可根据实际需求进行进一步的研究和设计。

加个模块,实现IIC方式驱动LCD1602

加个模块,实现IIC方式驱动LCD1602

加个模块,实现IIC驱动LCD1602 PCF8574模块使实现IIC驱动LCD1602成为现实。

下图是PCF8574模块与1602的连接电路图:实物接法如下:想要使用PCF8574模块来实现IIC驱动LCD1602,首先非常必要弄清楚IIC的时序、PCF8574设备地址、四线控制LCD1602方法。

下面是两个重要的h文件。

通过修改这两个h文件中的部分代码(接线有所不同)即可移植到你的程序中去。

PCF8574.h程序:sbit scl=P1^6;sbit sda=P1^7;void delay()//{ ;; }void init()//IIC初始化{sda=1;delay();scl=1;delay();}void start() //IIC开始信号{sda=1;delay();sda=0;delay();}void stop() //IIC停止{sda=0;delay();scl=1;delay();sda=1;delay();}void respons() //IIC应答{uchar i;scl=1;delay();while((sda==1)&&(i<250))i++;}void write_byte(uchar date)//IIC写入数据{uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;scl=0;delay();sda=CY;delay();scl=1;delay();}scl=0;delay();sda=1;uchar read_byte()//IIC读取字节{uchar i,k;scl=0;delay();sda=1;delay();for(i=0;i<8;i++){scl=1;delay();k=(k<<1)|sda;scl=0;delay();}return k;}start();write_byte(0x7e); //8574设备地址(写)respons();write_byte(date1);respons();stop();}uchar read_add()//向IO读取数据{uchar date1;start();write_byte(0x71); //8574设备地址(读)respons();date1=read_byte();respons();stop();return date1;}PCF8574+LCD1602_4.h程序:uchar a,b;for(a=x;a>0;a--)for(b=200;b>0;b--);}void write_com(uchar com) //写命令函数{ uchar com1,com2;com1=com|0x0f;write_add(com1&0xfc);delay1(2);write_add(com1&0xf8);com2=com<<4;com2=com2|0x0f;write_add(com2&0xfc);delay1(2);write_add(com2&0xf8);}void write_date(uchar date) //写数据函数{date1=date|0x0f;write_add(date1&0xfd);delay1(2);write_add(date1&0xf9);date2=date<<4;date2=date2|0x0f;write_add(date2&0xfd);delay1(2);write_add(date2&0xf9);}void init_lcd() //初始化函数{write_com(0x33); //显示模式设置delayms(6);write_com(0x32); //显示模式设置delayms(6);write_com(0x28); //4位总线,双行显示,显示5×7的点阵字符delayms(6);write_com(0x01); //清屏write_com(0x06); //字符进入模式:屏幕不动,字符后移delayms(6);write_com(0x0c); //显示开,关光标//write_LCD_Command(0x0f); //显示开,开光标,光标闪烁delayms(6);}//显示字符串:第x行第y列显示什么内容void ShowString(unsigned char x,unsigned char y,unsigned char *str){//设置起始位置if(x == 1){write_com(0x80 | y-1);// |相当于加法}if(x == 2){write_com(0xc0 | y-1);}//输出字符串while(*str!='\0') {write_date(*str);str++;}}。

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

实用标准文档文案大全MS基于1602字符型液晶显示器的显示系统姓名:杨越班级:电子11-1学号:110400104一、实习目的(1)了解飞思卡尔单片机的基本原理,掌握其基本的工作流程。

(2)了解LCD1602的基本原理及用法。

(3)能够熟练使用CodeWarrior软件编写C语言程序,使用BDM仿真器下载程序。

(4)能够熟练焊接电路板。

二、实验设备与器件CodeWarrior软件,BDM仿真器,万用电路板,飞思卡尔单片机,LCD1602液晶显示器,三、实验内容内容:利用飞思卡尔单片机制作基于1602字符液晶显示器的显示系统要求:用四个按键控制,按下第一个按键显示1,按下第二个按键显示2,以此类推。

(1)LCD1602液晶显示器的原理:1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号);以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。

以下具体阐述这三个管脚:RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。

R/W为读写选择,高电平进行读操作,低电平进行写操作。

E端为使能端,后面和时序联系在一起。

除此外,D0~D7分别为8位双向数据线。

操作时序:注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0.读取状态字时,注意D7位,D7=1,禁止读写操作;D7=0,允许读写操作;所以对控制器每次进行读写操作前,必须进行读写检测。

(即后面的读忙子程序)指令集:LCD_1602 初始化指令小结:0x38设置16*2显示,5*7点阵,8位数据接口0x01清屏0x0F开显示,显示光标,光标闪烁0x08只开显示0x0e开显示,显示光标,光标不闪烁0x0c开显示,不显示光标0x06地址加1,当写入数据的时候光标右移0x02地址计数器AC=0;(此时地址为0x80)光标归原点,但是DDRAM中断内容不变0x18光标和显示一起向左移动(2)飞思卡尔单片机的功能及特点:MC9S12XS128是 16 位单片机,由 16 位中央处理单元(CPU12X)、128KB 程序、Flash(P-lash)、8KB RAM、8KB 数据Flash(D-lash)组成片内存储器。

主要功能模块包括:内部存储器,内部 PLL 锁相环模块,2 个异步串口通讯 SCI ,1个串行外设接口 SPI MSCAN 模块,1 个8 通道输入/输出比较定时器模块 TIM ,周期中断定时器模块 PIT ,16 通道A/D 转换模块 ADC ,1 个 8 通道脉冲宽度调制模块 PWM ,输入/输出数字 I/O 口。

本次设计中主要用到PORTA,PORTB端口:PORTA:PORTA 为通用 I/O 口, 共 8 个,作为通用数字 I/O 口使用,未集成特殊功能.主要配置寄存器有:数据寄存器 PORTA、数据方向寄存 DDRA、上拉电阻控制寄存器PUCR 和驱动控制寄存器 RDR。

a.数据寄存器 PORTA通过写 1/0 使单片机对应引脚输出高低电平,或通过读取数据寄存器获得对应引脚的高低电平值。

例:PORTA_PB0=1b.数据方向寄存器 DDRADDRA 寄存器配置引脚为输出口还是输入口,“0”,输入口;“1”,输出口。

MCU 复位后,DDRA 值为 0x00, 引脚默认为输入口。

例:DDRA=0xFF //配置PORTA 口为输出PORTB:PORTB 为通用数字 I/O 口, 共 8 个。

其使用与 PORTA 基本一样。

主要配置寄存器有:数据寄存器 PORTB、数据方向寄存 DDRB。

上拉电阻控制寄存器PUCR 和驱动控制寄存器 RDR 与 PORTA 、PORTB、PORTE、PORTK 共用。

a.数据寄存器 PORTBb.数据方向寄存器 DDRB四、原理图:器件说明:LCD1602 (16管脚),2个排阻,4个10k电阻,一个1K电阻,飞思卡尔芯片(64管脚)管脚连接:VSS GND DB6 PB6VCC VCC DB7 PB7VEE GND A VCCRS PA0 K GNDRW PA1 K1 PA4E PA2 K2 PA5DB0 PB0 K4 PA6DB1 PB1 K4 PA7DB2 PB2unsigned char d=0;void PLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1){ //锁相环时钟=2*16*(2+1)/(1+1)=48MHzREFDV=1; //总线时钟=48/2=24MHzSYNR=2;while(!(CRGFLG&0x08));CLKSEL=0x80; //选定锁相环时钟}# define LCD_DB PORTB# define LCD_RS PORTA_PA0# define LCD_RW PORTA_PA1# define LCD_E PORTA_PA2void LCD_init(void);//初始化函数void LCD_write_command(uchar command);//写指令函数void LCD_write_data(uchar dat);//写数据函数void LCD_disp_char(uchar x,uchar y,uchar dat);//在某个屏幕位置上显示一个字符,X (0-16),y(1-2)//void LCD_check_busy(void);//检查忙函数。

我没用到此函数,因为通过率极低。

void delay_n25us(uint n);//延时函数//********************************//*******初始化函数***************void LCD_init(void){LCD_write_command(0x38);//设置8位格式,2行,5x7LCD_write_command(0x0c);//整体显示,关光标,不闪烁LCD_write_command(0x06);//设定输入方式,增量不移位LCD_write_command(0x01);//清除屏幕显示delay_n25us(10);//实践证明,我的LCD1602上,用for循环200次就能可靠完成清屏指令。

//LCD_write_command(0x06);//LCD_write_command(0x0c);}//********************************//********写指令函数************void LCD_write_command(uchar dat){LCD_DB=dat;delay_n25us(1);LCD_RS=0;delay_n25us(1);//指令LCD_RW=0;delay_n25us(1);//写入LCD_E=1;delay_n25us(1);//允许LCD_E=0;delay_n25us(1);//实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。

}//*******************************//********写数据函数*************void LCD_write_data(uchar dat){LCD_DB=dat;delay_n25us(1);LCD_RS=1;delay_n25us(1);//数据LCD_RW=0;delay_n25us(1);//写入LCD_E=1;delay_n25us(1);//允许LCD_E=0;delay_n25us(1);delay_n25us(1);}//********************************//*******显示一个字符函数*********void LCD_disp_char(uchar x,uchar y,uchar dat){uchar address;if(y==1)address=0x80+x;elseaddress=0xc0+x;LCD_write_command(address);LCD_write_data(dat);}//********************************/*******检查忙函数*************void LCD_check_busy() //实践证明,在我的LCD1602上,检查忙指令通过率极低,以{ //至于不能正常使用LCD。

因此我没有再用检查忙函数。

而使do //用了延时的方法,延时还是非常好用的。

我试了一下,用{ LCD_E=0; //for循环作延时,普通指令只要1次循就可完成。

清屏指令LCD_RS=0; //要用200次循环便能完成。

LCD_RW=1;LCD_DB=0xff;LCD_E=1;}while(LCD_DB^7==1);}******************************///********延时函数***************void delay_n25us(uint n){ uint i=0;uchar j=0;for(i=n;i>0;i--)for(j=0;j<2;j++); //在这个延时循环函数中我只做了2次循环,} //实践证明我的LCD1602上普通的指令只需1次循环就能可靠完成。

//*******************************void check_key(void) //判断按键是否可以控制单片机(如果键入正常,则单片机上的LED 会亮{if(!PORTAB_PA4){PORTE_PE5 = 0;a=1;}else if(!PORTAB_PA5){PORTE_PE5 = 0;a=2;}else if(!PORTAB_PA6){PORTE_PE5 = 0;a=3;}else if(!PORTAB_PA7){PORTE_PE5 = 0;a=4;}elsePORTE_PE5 = 1;}//*********主函数*****************void port_init() {DDRB=0XFF;DDRA=0XFF;PORTB=0XFF;}void main(void) {//PLL_Init();port_init();LCD_init();DDRE_DDRE5 = 1;PORTE_PE5 = 1; //不亮/*DDRA_DDRA0 = 1;DDRA_DDRA1 = 1;DDRA_DDRA2 = 1;DDRA_DDRA3 = 1;*/DDRA_DDRA4 = 0; //SET PORTA I/O INPUTDDRA_DDRA5 = 0;DDRA_DDRA6 = 0;DDRA_DDRA7 = 0;PORTAB_PA4 = 1;PORTAB_PA5 = 1;PORTAB_PA6 = 1;PORTAB_PA7 = 1;//LCD_disp_char(4,2,'1');for(;;) {_FEED_COP(); /* feeds the dog */check_key(); //检查按键while(1){/*if (a==1){delay(10);*/ //延时去抖if(a==1){LCD_disp_char(0,2,'1'); //在LCD第二行第一位输出1 } /*else if (a==2){delay(10);*/ //延时去抖else if(a==2) {LCD_disp_char(1,2,'2'); //在LCD第二行第二位输出2} /*else if (a==3){delay(10);*/ //延时去抖else if(a==3) {LCD_disp_char(2,2,'3'); //在LCD第二行第3位输出3 }/*else if (a==4)//延时去抖{delay(10);*/else if(a==4) {LCD_disp_char(3,2,'4'); //在LCD第二行第4位输出4}// else { LCD_disp_char(12,1,'0');// }// LCD_disp_char(2,1,'2');} /* loop forever *//* please make sure that you never leave main */}七、调试过程(1)使用Altium画出电路图:在电路图设计过程中,注明所用器件名称,规格,注意管脚的连接,尽可能让电路原理图规范,正确,方便看图焊接的工作。

相关文档
最新文档