吕蕾带你学习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:感谢大家的阅读,本文由我司收集整编。
51单片机C语言入门教程
51单片机C语言入门教程单片机是一种集成电路,可以完成各种功能。
C语言是一种高级编程语言,可以用来编写单片机的程序。
本文将介绍51单片机C语言的入门教程。
一、选择合适的开发环境选择合适的开发环境是学习51单片机C语言的第一步。
常用的开发环境有Keil C51、SDCC、IAR Embedded Workbench等。
这些开发环境都提供了开发工具和编译器,方便编写和调试代码。
二、了解51单片机的基本结构三、学习C语言的基本语法学习C语言的基本语法是学习51单片机C语言的基础。
C语言包括数据类型、变量、运算符、控制流语句等等。
学习C语言的基本语法可以参考相关的C语言教程。
四、掌握51单片机的特殊功能寄存器51单片机具有一些特殊功能寄存器,可以实现各种功能。
例如,P0是一个I/O口,可以用来控制外部设备的输入和输出;TMOD和TCON分别是定时器/计数器的模式和控制寄存器,可以实现定时和计数功能。
掌握这些特殊功能寄存器可以为后面的单片机编程做好准备。
五、编写第一个51单片机C语言程序编写第一个51单片机C语言程序可以帮助巩固前面学习的知识。
可以从简单的LED闪烁程序开始,逐步扩展到其他功能。
编写程序的过程中要注意语法的正确性和逻辑的合理性。
六、调试程序调试程序是保证程序正确运行的关键。
可以使用仿真器或者调试器对程序进行调试。
调试程序可以查看程序的运行状态、变量的值等等,帮助定位错误并进行修复。
七、深入学习更高级的C语言特性一旦掌握了基本的51单片机C语言编程,可以深入学习更高级的C语言特性。
例如,函数的使用、数组的应用、结构体和指针等等。
这些高级特性可以使程序更加模块化和灵活。
八、练习和实践练习和实践是巩固51单片机C语言编程知识的最好方法。
可以选择一些小项目或者例程进行练习,将理论知识应用于实际。
总结:通过以上的步骤,我们可以初步学习和掌握51单片机C语言的编程。
当然,这仅仅是入门级别的教程,还有很多更深入的知识需要进一步学习和探索。
51单片机计算器1602显示程序
delay_jsq(5);
if(P2!=0xfb)
{
if(P2!=0xfb)
{
temp=P2&0xf0;
switch(temp)
{
case 0xe0:num=8;
break;
case 0xd0:num=9;
break;
case 0xb0:num=10;
break;
case 0x70:num=11;
case 0x70:num=7;
break;
}
}
while(P2!=0xfd);
if(j!=0)
{
write_lcd1602(0x01,0);
delay(1);
j=0;
}
if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6'
{
if(flag1==0)//没有按过符号键
break;
}
}
}
}
void main()
{
ini_lcd1602();
while(1)
{
keyscan_4_4();
}
}
write_lcd1602(0x06,0);
delay(1);
write_lcd1602(0x01,0);
delay(1);
num_1=0;
i=0;
j=0;
a=0; //第一个参与运算的数
b=0; //第二个参与运算的数
c=0;
flag1=0; //flag1表示是否有符号键按下,
fuhao=0; // fuhao表征按下的是哪个符号
菜鸟学习51单片机之1602液晶
菜鸟学习51单片机----1602液晶其中的硬件连接我就不讲了,现在主要看我么要操作的几个引脚:RS(命令数据选择引脚,高电平是数据,低电平是命令),RW(读写控制引脚,高电平是读,低电平是写),E(使能端,高电平使能,低电平关使能)。
DB0---DB7是8位数据脚。
在提供的仿真图中,RS,RW,E 分别接到单片机的P3.0P3.1P3.2引脚,数据脚DB0--DB7接在P1的8个脚上。
硬件介绍完了,那开始讲解如何去操作它,怎么去控制1602液晶。
先看两个时序图,根据时序图来写出两个函数。
写数据和写命令函数:{uint16i,j;for(i=0;i<xms;i++)for(j=0;j<110;j++);}基本的函数完成后就开始对液晶进行初始化。
但是怎么去初始化呢,现在就要对照着1602的指令来分析。
现在对上面的一个个分析:上面的各项中RS和RW列的都是0表示是写命令所以在初始化中,就是通过写命令对液晶进行基本的设定。
1.清显示:根据表格中的信息,清显示的指令就是0x012.光标返回在初始化中不用3.输入模式I/D位如果是0则表示写入数据后光标左移,如果是1则是写入数据后光标右移。
S如果是0则表示写入数据后屏幕显示不移动,如果是1则表示写入数据后屏幕整体右移一个字。
一般设为0x064.控制显示器开/关、光标显示/关闭以及光标是否闪烁。
参数设定的情况如下:位名设置D0=显示功能关1=显示功能开C0=无光标1=有光标B0=光标不闪烁1=光标闪烁,一般设为,0x0c5.使光标移位或使整个显示屏幕移位。
参数设定的情况如下:S/C R/L设定情况00光标左移1格,且AC值减101光标右移1格,且AC值加110显示器上字符全部左移一格,但光标不动11显示器上字符全部右移一格,但光标不动(这个初始化不涉及光标和移位,所以不设定这个)6.位名设置DL0=数据总线为4位1=数据总线为8位N0=0=显示1行11=1=显示2行2F0=5×7点阵/每字符1=5×10点阵/每字符一般设为0x38根据上面的分析可以定义如下几个宏定义:#define Clear0x01#define Show0x0c#define InputMode0x06#define Function0x38初始化函数如下:/*************初始化*********************/void Lcd1602Init(){Lcd1602Disable();Lcd1602WriteCommand(Function);Lcd1602WriteCommand(Show);Lcd1602WriteCommand(InputMode);Lcd1602WriteCommand(Clear);}液晶的地址:两行分别是写入显示地址一定要第七位是高电平,所以不能直接写上面的地址,而是用上面的地址加上0x80才是对应位置的显示地址。
51单片机超详细教程PPT
51单片机超详细教程PPT目录•51单片机概述•51单片机硬件结构•指令系统与汇编语言编程•C语言编程与实例分析•中断系统与定时器/计数器应用•接口技术与应用扩展•调试技巧与故障排除方法0151单片机概述Part单片机定义与发展定义单片机是一种集成电路芯片,将微处理器、存储器、输入输出接口等集成在一块芯片上,构成完整的计算机系统。
发展历程从早期的4位、8位单片机,到如今的32位、64位高性能单片机,单片机的性能不断提升,应用领域也不断扩展。
51单片机特点及优势特点51单片机采用8051内核,具有高性能、低功耗、易于扩展等优点;同时拥有丰富的外设接口和强大的中断处理能力。
优势51单片机在嵌入式系统领域具有广泛的应用,其稳定的性能和成熟的生态系统使得开发者能够快速开发出高质量的嵌入式应用。
应用领域与市场需求应用领域智能家居、工业自动化、医疗设备、汽车电子、物联网等。
市场需求随着物联网、人工智能等技术的快速发展,对单片机的性能、功耗、安全性等方面提出了更高的要求。
同时,市场对于单片机的定制化、差异化需求也日益增加。
0251单片机硬件结构Part中央处理器CPU运算器进行算术运算和逻辑运算控制器取指、译码、执行指令,控制程序流程寄存器组暂存数据和地址,加速CPU 运算速度STEP 01STEP 02STEP 03存储器组织程序存储器存放变量、中间结果等,一般使用RAM实现数据存储器特殊功能寄存器用于控制单片机的各种功能,如定时器、中断等存放程序代码和常数表格等,一般使用ROM或EPROM实现I/O 端口与外部设备通信的接口,分为并行I/O 和串行I/O 两种要点一要点二特殊功能寄存器用于控制I/O 端口的操作,如设置端口模式、读取端口状态等I/O 端口及特殊功能寄存器时钟电路提供单片机运行所需的时钟信号,一般由晶振和电容组成复位电路使单片机在启动时或异常情况下恢复到初始状态,一般由电阻和电容组成时钟电路与复位电路03指令系统与汇编语言编程Part指令格式及寻址方式指令格式由操作码和操作数组成,操作码指明操作性质,操作数表示操作对象。
51单片机Keil C语言入门教程
2.外接晶体引脚
-7-
51 单片机 C 语言入门教程(磁动力工作室)
图 2-2 外接晶体引脚 XTAL1 19 XTAL2 18 XTAL1 是片内振荡器的反相放大器输入端,XTAL2 则是输出端,使用外部振荡器 时,外部振荡信号应直接加到 XTAL1,而 XTAL2 悬空。内部方式时,时钟发生器对振 荡脉冲二分频,如晶振为 12MHz,时钟频率就为 6MHz。晶振的频率可以在 1MHz-24MHz 内选择。电容取 30PF 左右。 *型号同样为 AT89C51 的芯片,在其后面还有频率编号,有 12,16,20,24MHz 可选。 大家在购买和选用时要注意了。如 AT89C51 24PC 就是最高振荡频率为 24MHz,40P6 封 装的普通商用芯片。 3.复位 RST 9 在振荡器运行时,有两个机器周期(24 个振荡周期)以上的高电平出现在此引腿 时,将使单片机复位,只要这个脚保持高电平,51 芯片便循环复位。复位后 P0-P3 口 均置 1 引脚表现为高电平,程序计数器和特殊功能寄存器 SFR 全部清零。当复位脚由 高电平变为低电平时,芯片为 ROM 的 00H 处开始运行程序。常用的复位电路如图 2- 3 所示。 *复位操作不会对内部 RAM 有所影响。
图 1-1 启动时的屏幕
-1-
51 单片机 C 语言入门教程(磁动力工作室)
接着按下面的步骤建立您的第一个项目: (1)点击 Project 菜单,选择弹出的下拉式菜单中的 New Project,如图 1-2。接着弹 出一个标准 Windows 文件对话窗口,如图 1-3,这个东东想必大家是见了 N 次的了,用法 技巧也不是这里要说的,以后的章节中出现类似情况将不再说明。在“文件名”中输入您的 第一个 C 程序项目名称,这里我们用“test”,这是笔者惯用的名称,大家不必照搬就是了, 只要符合 Windows 文件规则的文件名都行。“保存”后的文件扩展名为 uv2,这是 KEIL uVision2 项目文件扩展名,以后我们可以直接点击此文件以打开先前做的项目。
1小时学会51单片机C语言入门教程
1小时学会51单片机C语言入门教程相信很多爱好电子的朋友,对单片机这个词应该都不会陌生了吧。
不过有些朋友可能只听说他叫单片机,他的全称是什么也许并不太清楚,更不用说他的英文全称和简称了。
单片机是一块在集成电路芯片上集成了一台有一定规模的微型计算机。
简称为:单片微型计算机或单片机 (Single Chip Computer)。
单片机的应用到处可见,应用领域广泛,主要应用在智能仪表、实时控制、通信、家电等方面。
不过这一切都没什么关系,因为我(当然也包括任何人)都是从不知道转变成知道的,再转变成精通的。
现在我只想把我学习单片机的经历,详细地讲叙给大家听听,可能有些大虾会笑话我,想:那么简单的东西还在这里卖弄。
但是你错了,我只是把我个人学习的经历讲述一遍而已,仅仅对那些想学习单片机,但又找不到好方法或者途径的朋友,提供一个帮助,使他们在学习过程中,尽量少走些弯路而已~首先,你必须有学习单片机的热情,不是说今天去图书馆看了一个下午关于单片机的书,而明天玩上半天,后天就不知道那个本书在讲什么东西了。
还是先说说我吧,我从大二的第一个学期期末的时候才开始接触单片机,但在这之前,正如上面所说的:我知道有种芯片叫单片机,但是具体长成什么样子,却一点也不知道~看到这里很多朋友一定会忍不住发笑。
嘿嘿,你可千万别笑,有些大机长成什么样子呢~而我对单片机的痴迷更是常四毕业的人也同样不知道单片人所不能想象的地步,大二的期末考试,我全放弃了复习,每当室友拿着书在埋头复习的时候,我却捧着自己从图书馆借的单片机书在那看,虽然有很多不懂,或但是我还是坚持了下来,当时我就想过,为了单片机值不值得我这样去付出,许这也是在一些三流学校的好处吧,考试挂科后,明年开学交上几十元一门的补考费,应该大部分都能过了。
于是,我横下一条心,坚持看我的单片机书和资料。
当你明白了单片机是这么一回事的时候,显而易见的问题出来了:我要选择那种语言为单片机编写程序呢,这个问题,困扰了我好久。
跟我学51单片机LCD1602液晶显示模块
1、LCD1602的P1.0-P1.4分别连接到51单片机的P0.0-P0.4; 2、LCD1602的P2.0-P2.7分别连接到51单片机的P2.0-P2.7;
3、LCD1602的VSS和VDD分别连接到51单片机的地线和电源; 4、LCD1602的VEE连接到51单片机的+5V;
5、LCD1602的PSB和REST分别直接接地和+5V。
二、LCD1602的应用
1、智能家居系统
智能家居系统是LCD1602的重要应用领域之一。在智能家居系统中,LCD1602 可以作为人机界面,显示各种信息,如温度、湿度、空气质量、电量等。同时, LCD1602还可以显示各种设备的状态,如灯光、空调、电视等,使用户能够更加 方便地控制各种设备。
2、工业控制系统
1、写入指令:通过单片机的I/O 口发送相应的指令码
2、写入数据:通过单片机的I/O 口发送相应的字符编码
显示控制在基础操作的基础上,我们可以进一步实现LCD1602液晶显示模块 的显示控制。下面通过几个实例来介绍如何利用LCD1602液晶显示模块实现文字 显示的控制。
1、静态显示:将一段文本的字符编码逐个写入LCD1602的控制器中,即可实 现文字的静态显示。例如,我们可以使用循环结构,依次将每个字符编码写入 LCD1602的控制器中。
参考内容二
基本内容
液晶显示模块LCD1602是一种常见的显示设备,广泛应用于各种嵌入式系统 和电子产品中。它具有低功耗、体积小、重量轻、高分辨率和长寿命等优点,因 此在许多领域中得到了广泛的应用。
一、LCD1602的概述
LCD1602是一种字符型液晶显示器,它由160个字符显示区域和8个字符显示 位组成。它支持多种字符集,包括英文字符集和数字字符集等。此外,LCD1602 还具有背光功能,可以在暗环境下清晰地显示字符。
手把手教你学51单片机(C语言版)
10.1.2 定时时间精准性调 整
10.1.4 数码管扫描函数算 法改进
12
Part One
11 UART串口通信
11 UART串口通信
11.1 串行通信的 初步认识
11.2 RS-232通 信接口
11.3 USB转串口 通信
11.4 IO口模拟 UART串口通信
11.5 UART串口 通信的基本应用
A
C
E
13.2 1602整屏 移动
13.4 计算器实 例
13.6 练习题
13.1 通信时序 解析
13.3 多.c文件 的初步认识
B
13.5 串口通信机制 和实用的串口例程
D
F
15
Part One
14 I^2C总线与E^2PROM
14 I^2C总线与E^2PROM
14.1 I2C时 序初步 认识
14.2 I2C寻 址模式
18 RS-485通信与Modbus协议
01
18.1 RS485通信
02
18.2 Modbus 通信协议介绍
18.2.1 Modbus协议 特点 18.2.2 RTU协议帧数 据
03
18.3 Modbus 多机通信例程
04
18.4 练习题
20
Part One
19 实践项目开发——多功能电子钟
19 实践项目开发——多功能电子钟
1.6 答读者问
03
Part One
2 点亮你的LED
2 点亮你的LED
2.1 单片机的 内部资源
2.2 单片机最 小系统
2.3 LED小灯
2.6 练习题
2.5 程序下载
51单片机好学1602全过程C语言编程显示很全的哦
51单片机好学1602全过程C语言编程显示很全的哦阿拉教你轻松学51系列(作者:就抽精品)发布: 2010-2-05 16:03 | 作者: tiankai | 来源: 电子园51单片机学习网阿拉教你轻松学51--------液晶篇(1602)写在开始:(借此灌下水^_^ ) 之前,发了一个帖子,大意是看见杀手和水剑写的帖子,心里也痒痒了,想写一写以前学习单片机过程中的一些经历,希望能给大家一点参考。
无奈最近时间很是紧张,因此,一直都没能着手整理。
本打算星期六写的,但是接到一个朋友的电话,说想买CPLD的开发板。
于是,计划被迫打乱,只好先陪他去电子市场买板子。
回来之后,虽然头很晕(坐车的原因),但是不能再拖了,否则留给大家一个只说不做的印象就不好了。
虽然头晕,但是下面的写出来的东西可不晕。
OK,LET’S GO !1602字符液晶在实际的产品中运用的也比较多了,前几天留意了一下,发现宿舍门前的自动售水机就是采用的1602液晶进行显示的。
而且对于单片机的学习而言,掌握1602的用法是每一个学习者必然要经历的过程。
在此,我将使用1602过程中遇到的问题以及感受记录下来,希望能够给初学者带来一点指导,少走一点弯路。
所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。
目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
1602液晶的正面(绿色背光,黑色字体)1602液晶背面(绿色背光,黑色字体)另一种1602液晶模块,显示屏是蓝色背光白色字体字符型LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,引脚定义如下表所示:HD44780内置了DDRAM、CGROM 和CGRAM。
DDRAM就是显示数据RAM,用来寄存待显示的字符代码。
51单片机驱动LCD1602程序设计(C语言)
4.显示开关控制指令
功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下: 位名 D C B 设置 0=显示功能关 0=无光标 0=光标闪烁 1=显示功能开 1=有光标 1=光标不闪烁
5.设定显示屏或光标移动方向指令
功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下: S/C 0 0 1 1 0 1 0 1 R/L 设定情况 光标左移 1 格,且 AC 值减 1 光标右移 1 格,且 AC 值加 1 显示器上字符全部左移一格,但光标不动 显示器上字符全部右移一格,但光标不动
10.数据写入 DDRAM 或 CGRAM 指令一览
功能:<1> 将字符码写入 DDRAM,以使液晶显示屏显示出相对应的字符; <2> 将使用者自己设计的图形存入 CGRAM。
11.从 CGRAM 或 DDRAM 读出数据的指令一览
功能:读取 DDRAM 或 CGRAM 中的内容。
基本操作时序:
读状态
从上图可以看出,“A”字的对应上面高位代码为 0100,对应左边低位代码为 0001,合起来就 是 01000001,也就是 41H。可见它的代码与我们 PC 中的字符代码是基本一致的。因此我们在向 DDRAM 写 C51 字符代码程序时甚至可以直接用 P1='A'这样的方法。 PC 在编译时就把“A”先转为 41H 代码了。 字符代码 0x00~0x0F 为用户自定义的字符图形 RAM(对于 5X8 点阵的字符,可以存放 8 组, 5X10 点阵的字符,存放 4 组),就是 CGRAM 了。后面我会详细说的。 0x20~0x7F 为标准的 ASCII 码, 0xA0~0xFF 为日文字符和希腊文字符, 其余字符码(0x10~ 0x1F 及 0x80~0x9F)没有定义。
1小时学会51单片机C语言入门教程
1小时学会51单片机C语言入门教程相信很多爱好电子的朋友,对单片机这个词应该都不会陌生了吧。
不过有些朋友可能只听说他叫单片机,他的全称是什么也许并不太清楚,更不用说他的英文全称和简称了。
单片机是一块在集成电路芯片上集成了一台有一定规模的微型计算机。
简称为:单片微型计算机或单片机 (Single Chip Computer)。
单片机的应用到处可见,应用领域广泛,主要应用在智能仪表、实时控制、通信、家电等方面。
不过这一切都没什么关系,因为我(当然也包括任何人)都是从不知道转变成知道的,再转变成精通的。
现在我只想把我学习单片机的经历,详细地讲叙给大家听听,可能有些大虾会笑话我,想:那么简单的东西还在这里卖弄。
但是你错了,我只是把我个人学习的经历讲述一遍而已,仅仅对那些想学习单片机,但又找不到好方法或者途径的朋友,提供一个帮助,使他们在学习过程中,尽量少走些弯路而已~首先,你必须有学习单片机的热情,不是说今天去图书馆看了一个下午关于单片机的书,而明天玩上半天,后天就不知道那个本书在讲什么东西了。
还是先说说我吧,我从大二的第一个学期期末的时候才开始接触单片机,但在这之前,正如上面所说的:我知道有种芯片叫单片机,但是具体长成什么样子,却一点也不知道~看到这里很多朋友一定会忍不住发笑。
嘿嘿,你可千万别笑,有些大机长成什么样子呢~而我对单片机的痴迷更是常四毕业的人也同样不知道单片人所不能想象的地步,大二的期末考试,我全放弃了复习,每当室友拿着书在埋头复习的时候,我却捧着自己从图书馆借的单片机书在那看,虽然有很多不懂,或但是我还是坚持了下来,当时我就想过,为了单片机值不值得我这样去付出,许这也是在一些三流学校的好处吧,考试挂科后,明年开学交上几十元一门的补考费,应该大部分都能过了。
于是,我横下一条心,坚持看我的单片机书和资料。
当你明白了单片机是这么一回事的时候,显而易见的问题出来了:我要选择那种语言为单片机编写程序呢,这个问题,困扰了我好久。
51单片机语言c入门教程
电子在线编程网站 51 单片机 C 语言入门教程
接着按下面的步骤建立您的第一个项目:
(1)点击Project菜单,选择弹出的下拉式菜单中的New Project,如图1-2.接着弹出一个标准
第1页
电子在线编程网站 51 单片机 C 语言入门教程
将当今最流行、最经济有效的学习方案完美地集成在了同一个系统中,是一个快捷、高效、
靠它了.6 是有一个小放大镜的按钮,这就是开启\关闭调试模式的按钮,它也存在于菜单
Debug-Start\Stop Debug Session,快捷键为 Ctrl+F5.
(6)进入调试模式,软件窗口样式大致如图 1-8 所示.图中 1 为运行,当程序处于停止状态时
才有效,2为停止,程序处于运行状态时才有效.3是复位,模拟芯片的复位,程序回到最开头处执
和设备的损坏,给使用者带来不必要的麻烦或损失。
现在这些问题都得到了比较好的解决。如在众多单片机中 51 架构的芯片风行很久,学习
资料也相对很多,是初学的较好的选择之一.典型的芯片是 AT89S51,这种芯片的特点是可以
实现在系统编程(In-System-Programming),即 ISP,这样,学习单片机就不需要购买高价
电子在线编程网站 51 单片机 C 语言入门教程
51 单片机 C 语言入门教程
学习单片机前的准备
都是编译按钮,不同是1是用于编译单个
文件.2 是编译当前项目,如果先前编译
过一次之后文件没有做动编辑改动,这
时再点击是不会再次重新编译的.3 是重
新编译,每点击一次均会再次编译链接
一次,不管程序是否有改动.在 3 右边的
51单片机c语音 rrc汇编写法
近年来,随着物联网和嵌入式系统的快速发展,对嵌入式系统的需求也日益增长。
51单片机作为一种经典的嵌入式系统芯片,一直以来都备受工程师和科技爱好者的喜爱。
在嵌入式系统中,51单片机的C语言和汇编语言编程是必不可少的技能。
本文将介绍51单片机C语言和RRC汇编编程的技巧和方法。
1. 51单片机C语言编程51单片机的C语言编程是一种相对简单易学的编程方法。
通过C语言,可以实现对于51单片机的各种功能进行控制和操作。
在进行51单片机C语言编程时,首先需要熟悉51单片机的C语言编程环境和开发工具。
常用的51单片机C语言编程环境有Keil C51、SDCC等。
在选择合适的开发环境后,就可以开始进行51单片机C语言编程。
在编写C语言程序时,需要注意对51单片机的外设进行正确的配置和初始化,以及对硬件资源的合理利用。
另外,对于一些特殊的应用,可能需要对中断、定时器、串口等进行特殊的处理。
2. 51单片机RRC汇编编程在嵌入式系统中,汇编程序通常被用于对特定的硬件进行底层控制和优化。
对于51单片机来说,RRC汇编语言是一种常用的低级语言。
在进行51单片机RRC汇编编程时,需要对51单片机的指令集和寄存器进行深入的了解。
通过RRC汇编语言,可以直接对51单片机的硬件进行操作,实现对于特定硬件资源的高效控制。
在进行RRC汇编编程时,需要注意对内存和寄存器的管理,以及对51单片机的中断和外设的处理。
3. 51单片机C语言和RRC汇编编程的应用通过学习51单片机C语言和RRC汇编编程,可以实现对于各种应用的快速开发和优化。
在工业控制、通信系统、自动化设备等领域,都可以广泛应用51单片机C语言和RRC汇编编程技术。
通过合理的软件设计和编程,可以实现对51单片机硬件资源的高效利用,提高系统的稳定性和可靠性。
另外,通过C语言和RRC汇编的结合使用,可以实现对于嵌入式系统应用的灵活性和高性能要求。
4. 总结通过对51单片机C语言和RRC汇编编程的初步介绍,可以看出这两种编程方法对于嵌入式系统的开发和优化具有重要的意义。
51单片机c语言教程全集
51单片机c语言教程全集第一课建立你的第一个KeilC51项目·无须懂得单片机的具体硬件,也能够编出符合硬件实际的专业水平的程序;·不懂得单片机的指令集,也能够编写完美的单片机程序;·不同函数的数据实行覆盖,有效利用片上有限的RAM空间;·提供auto、tatic、cont等存储类型和专门针对8051单片机的data、idata、pdata、某data、code等存储类型,自动为变量合理地分配地址;·C语言提供复杂的数据类型(数组、结构、联合、枚举、指针等),极大地增强了程序处理能力和灵活性;·中断服务程序的现场保护和恢复,中断向量表的填写,是直接与单片机相关的,都由C编译器代办;·程序具有坚固性:数据被破坏是导致程序运行异常的重要因素。
C语言对数据进行了许多专业性的处理,避免了运行中间非异步的破坏·提供常用的标准函数库,以供用户直接使用;·有严格的句法检查,错误很少,可容易地在高级语言的水平上迅速地被排掉;·可方便地接受多种实用程序的服务:如片上资源的初始化有专门的实用程序自动生成;再如,有实时多任务操作系统可调度多道任务,简化用户编程,提高运行的安全性等等。
·头文件中定义宏、说明复杂数据类型和函数原型,有利于程序的移植和支持单片机的系列化产品的开发;以上简单介绍了KEILC51软件,要使用KEILC51软件,必需先要安装它,这也是学习单片机编程语言所要求的第一步――建立学习环境。
首先当然是运行KEIL软件,接着按下面的步骤建立您的第一个项目:(1)点击Project菜单,选择弹出的下拉式菜单中的NewProject,如图1-2。
接着弹出一个标准Window文件对话窗口,如图1-3。
在“文件名”中输入您的第一个C程序项目名称,这里我们用“tet”。
“保存”后的文件扩展名为uv2,这是KEILuViion2项目文件扩展名,以后能直接点击此文件以打开先前做的项目。
51单片机驱动16×16LED点阵显示动画汉字汇编程序
51单片机驱动16×16LED点阵显示动画汉字汇编程序这里提供一个完整的AT89S51单片机驱动驱动led点阵显示具有动画效果的汉字的汇编程序列子. ORG 0000HST: MOV A,#0FFH ;初始化MOV P1,AMOV P2,AMOV P3,AMOV P0,ACLR AMOV R0,#50H ;显示缓存清0MOV R1,#20H ;控制清0的次数ST0: MOV @R0,AINC R0DJNZ R1,ST0;正文显示CHINESE: MOV DPTR,#TAB1 ;查表指针指向TAB1LCALL HZ;结束动画SCREE:MOV DPTR,#TAB2;查表指针指向TAB2ACALL DDMOV DPTR,#TAB3;查表指针指向TAB3ACALL DDMOV DPTR,#TAB4;查表指针指向TAB4ACALL DDLJMP CHINESE;显示8幅画面子程序,SCREE专用,用字模软件字要倒置(表必须深256字节)DD: MOV B,#00HMOV R0,#08H ;显示8幅画面AJMP CCCC0: MOV A,BADD A,#20H ;指向下一幅画面MOV B,ACC: MOV R7,#08H ;画面停留时间MOV R3,BMOV 37H,R0LCALL ENTERDIS00: LCALL DISPLAYDJNZ R7,DIS00MOV R0,37HDJNZ R0,CC0RET;汉字上移子程序,可显示8个汉字,(表必须深256字节)HZ: MOV R3,#00H ;查表偏移量MOV R5,#81H ;查表128次MOVBACK: MOV R4,#10H ;使显示完一个汉字MOVBACK0: MOV R7,#02H ;一桢画面显示时间MOV R0,#6DH ;低8位R0指向显示缓存倒数第3个字节,以备与最后1个字节交换MOV R1,#6CH ;高8位R1指向显示缓存倒数第4个字节,以备与倒数第2个字节交换MOV R2,#10H ;内存后移的次数DJNZ R5,MOVBACK1RET ;显示完该表,返回MOVBACK1: MOV A,@R0 ;低8位被后移的内存单元数据暂存入A INC R0 ;后移两字节INC R0MOV @R0,A ;放入要移的低8位数据MOV A,R0 ;R0指向下一个要后移的内存单元SUBB A,#04HMOV R0,AMOV A,@R1 ;高8位被后移的内存单元数据暂存入AINC R1 ;后移两字节INC R1MOV @R1,A ;放入要移高8位的数据MOV A,R1 ;R1指向下一个要后移的内存单元SUBB A,#04HMOV R1,A ;R1指向下一个要后移的内存单元DJNZ R2,MOVBACK1 ;显示缓存数据依次后移MOV A,R3 ;从表TAB1读入要移进50H,51H的数据MOVC A,@A+DPTR;先给50H读数据MOV 50H,AMOV A,R3 ;指向下一字节INC AMOV R3,AMOVC A,@A+DPTR;再给51H读数据MOV 51H,AMOV A,R3 ;指向下一字节INC AMOV R3,AMOV 30H,R3 ;保护数据MOV 31H,R4MOV 32H,R5DISMOV: LCALL DISPLAY ;显示当前数据DJNZ R7,DISMOVMOV R3,30HMOV R4,31HMOV R5,32HDJNZ R4,MOVBACK0MOV 30H,R3 ;保护数据MOV 32H,R5MOV R7,#24H ;显示当前数据延时DISMOV0: LCALL DISPLAYDJNZ R7,DISMOV0MOV R3,30HMOV R5,32HLJMP MOVBACK;放进一幅显示数据到显示缓存子程序,要先设好指针DPTR和R3,影响R1,R2,R3 ENTER: MOV R1,#50H ;从50H单元起把表存入MOV R2,#20H ;查表次数MOV A,R3CLLOOP_: MOVC A,@A+DPTR ;查表MOV @R1,A ;将表放进5X,6X单元INC R1 ;R1指向下一个地址空间MOV A,R3 ;查表指针后移INC AMOV R3,A ;将指针修改结果存入R3DJNZ R2,CLLOOP_;没查完转CLLOOP_RET;15MS,显示子程序,一桢32个字节,影响A,R0,R1,R3,R4,R5,R6; ;单片机网提供汉字取模工具,可显示任意汉字DISPLAY: MOV A,#0FFHMOV P0,AMOV P1,AMOV P2,AMOV P3,ASETB CMOV R6,#7FH ;赋扫描字初值,左移后初值为0FEHMOV R5,#00H ;列扫描低8位控制MOV R0,#50H ;行的高8(p1)位要显示的数据起始地址MOV R1,#10H ;扫描次数DISLOOP: MOV A,@R0 ;从内存读数据MOV P2,#0FFH ;装入数据时不显示任何东西MOV P3,#0FFHCPL A ;数据取反以适合显示MOV P1,A ;送入行的高8(p1)位要显示的数据INC R0 ;修改R0指向低8位要显示的数据MOV A,@R0 ;读低8位要显示的数据CPL A ;数据取反以适合显示MOV P0,A ;送入行的低8(p0)位要显示的数据INC R0 ;R0指向下一个高8(p0)位要显示的数据LCALL NEXT ;调用列扫描程序LCALL DELAY1MS ;显示延时DJNZ R1,DISLOOP;一桢显示完返回MOV P3,#0FFH ;全灭RET;列扫描子程序DISLOOP专用NEXT: JNC NEXT1 ;C=0转扫描高8(p3)位行MOV A,R6 ;修改扫描字RL AMOV R6,AINC R5CJNE R5,#09H,NEXT0 ;R6=#0FEH时C=0 AJMP NEXT1BACK: RETNEXT0: MOV P2,R6 ;扫描低8(p2)位行AJMP BACKNEXT1: MOV P2,#0FFHMOV P3,R6 ;扫描高8(p3)位行MOV A,R6 ;修改扫描字RL AMOV R6,AAJMP BACK;延时1MS子程序DELAY1MS: MOV R3,#10D0: MOV R4,#50D1: DJNZ R4,D1DJNZ R3,D0RETTAB1:DB 01FH,0F8H,001H,000H,07FH,0FEH,041H,004H,01DH,070H,001H,000H,01DH,070H,000H,000H DB 01FH,0F0H,011H,010H,01FH,0F0H,011H,010H,01FH,0F2H,001H,002H,001H,002H,000H,0FEH;電DB 000H,000H,03FH,0F0H,000H,020H,000H,040H,000H,080H,001H,000H,001H,000H,001H,004H DB 0FFH,0FEH,001H,000H,001H,000H,001H,000H,001H,000H,001H,000H,005H,000H,002H,000H;子DB 008H,000H,008H,0FCH,07EH,084H,008H,084H,0FFH,094H,041H,088H,022H,080H,014H,0FEH DB 07EH,0A4H,008H,0A4H,008H,098H,0FFH,098H,008H,0A4H,008H,0A6H,008H,0C4H,008H,080H;報DB 000H,000H,000H,010H,03FH,0F8H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,000H,004H,07FH,0FEH,000H,000H,000H,000H,000H,000H;二DB 01FH,0F8H,001H,000H,07FH,0FEH,041H,004H,01DH,070H,001H,000H,01DH,070H,002H,080H DB 004H,060H,01AH,01EH,0E1H,008H,01FH,0E0H,000H,040H,002H,080H,001H,000H,001H,000H;零DB 01FH,0F8H,001H,000H,07FH,0FEH,041H,004H,01DH,070H,001H,000H,01DH,070H,002H,080H DB 004H,060H,01AH,01EH,0E1H,008H,01FH,0E0H,000H,040H,002H,080H,001H,000H,001H,000H;零DB 004H,000H,003H,000H,001H,080H,001H,000H,0FFH,0FEH,000H,000H,000H,000H,004H,080HDB 006H,040H,004H,020H,008H,010H,008H,018H,010H,00CH,020H,00CH,040H,008H,000H,000H;六DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000HDB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H;(空);结束动画;-- 水纹 -- ** 宋体, 12 **; 当前所选字体下一个汉字对应的点阵为: 宽度x高度=128x16, 调整后为: 128x16TAB2:DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,001H,080H DB 001H,080H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000HDB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,001H,080H,003H,0C0HDB 003H,0C0H,001H,080H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000HDB 000H,000H,000H,000H,000H,000H,000H,000H,001H,080H,002H,040H,004H,020H,008H,010HDB 008H,010H,004H,020H,002H,040H,001H,080H,000H,000H,000H,000H,000H,000H,000H,000HDB 000H,000H,001H,0C0H,006H,030H,008H,008H,008H,008H,010H,004H,020H,002H,020H,002HDB 020H,002H,010H,004H,008H,008H,008H,008H,006H,030H,001H,0C0H,000H,000H,000H,000HDB 003H,0C0H,00CH,030H,010H,008H,010H,008H,060H,006H,040H,002H,080H,001H,080H,001HDB 080H,001H,080H,001H,040H,002H,060H,006H,010H,008H,010H,008H,00CH,030H,003H,0C0HDB 000H,000H,038H,01CH,046H,062H,081H,081H,080H,001H,040H,002H,040H,002H,020H,004HDB 020H,004H,040H,002H,040H,002H,080H,001H,081H,081H,046H,062H,038H,01CH,000H,000HDB 0C0H,003H,0A0H,005H,058H,01EH,024H,024H,024H,024H,01EH,078H,005H,0A0H,002H,040HDB 002H,040H,005H,0A0H,01AH,078H,024H,024H,024H,024H,058H,01AH,0A0H,005H,0C0H,003HDB 000H,000H,0C0H,003H,0B0H,00DH,088H,011H,044H,022H,025H,0A4H,012H,048H,00DH,0B0HDB 00DH,0B0H,012H,048H,025H,0A4H,044H,022H,088H,011H,0B0H,00DH,0C0H,003H,000H,000H;--福-- ** 宋体, 12 **; 当前所选字体下一个汉字对应的点阵为: 宽度x高度=16x16, 调整后为: 16x16TAB3:DB 0AAH,055H,055H,0AAH,0AAH,055H,055H,0AAH,0AAH,055H,055H,0AAH,0AAH,055H,055H,0AAH DB 055H,0AAH,0AAH,055H,055H,0AAH,0AAH,055H,055H,0AAH,0AAH,055H,055H,0AAH,0AAH,055HDB 0AAH,055H,055H,0AAH,0AAH,055H,055H,0AAH,0AAH,055H,054H,02AH,0A8H,015H,050H,00AHDB 050H,00AH,0A8H,015H,054H,02AH,0AAH,055H,055H,0AAH,0AAH,055H,055H,0AAH,0AAH,055HDB 0AAH,055H,054H,02AH,0A8H,015H,050H,00AH,0A0H,005H,040H,002H,080H,001H,000H,000HDB 000H,000H,080H,001H,040H,002H,0A0H,005H,050H,00AH,0A8H,015H,054H,02AH,0AAH,055HDB 0A0H,005H,040H,002H,091H,0F9H,000H,000H,074H,0F0H,019H,008H,031H,008H,058H,0F0HDB 014H,000H,011H,0F8H,012H,044H,013H,0FCH,012H,044H,091H,0F9H,040H,002H,0A0H,005HDB 020H,000H,013H,0FEH,010H,000H,0FDH,0FCH,005H,004H,009H,004H,011H,0FCH,030H,000HDB 05BH,0FEH,096H,022H,012H,022H,013H,0FEH,012H,022H,012H,022H,013H,0FEH,012H,002HDB 000H,004H,07FH,0C8H,000H,008H,03FH,0BFH,020H,0A0H,020H,090H,03FH,088H,000H,00CHDB 07FH,0DAH,044H,069H,044H,048H,07FH,0C8H,044H,048H,044H,048H,07FH,0C8H,040H,048HDB 010H,040H,010H,080H,091H,000H,073H,0FFH,014H,080H,018H,040H,040H,0FFH,05EH,092HDB 052H,092H,052H,092H,052H,0FEH,052H,092H,052H,092H,05EH,092H,040H,0FFH,000H,000HDB 012H,002H,013H,0FEH,012H,022H,012H,022H,013H,0FEH,012H,022H,096H,022H,05BH,0FEHDB 030H,000H,011H,0FCH,009H,004H,005H,004H,0FDH,0FCH,010H,000H,013H,0FEH,020H,000HTAB4:DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0F8H,0FFH,0F8H,0FFH,0C0H,0FFH,0C0H DB 0FEH,000H,0FEH,000H,0F0H,000H,0F0H,007H,0B0H,002H,0C8H,002H,048H,006H,030H,002H;STEP1 DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0F8H,0FFH,0F8H,0FFH,0C0H,0FFH,0C0HDB 0FEH,000H,0FEH,000H,0F6H,000H,0F9H,007H,089H,002H,086H,001H,000H,005H,000H,002H;STEP2 DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0F8H,0FFH,0F8H,0FFH,0C0H,0FFH,0C0HDB 0FEH,0C0H,0FFH,020H,0F1H,020H,0F0H,0C7H,080H,001H,080H,007H,000H,001H,000H,007H;STEP3 DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0F8H,0FFH,0F8H,0FFH,0D8H,0FFH,0E4HDB 0FEH,024H,0FEH,018H,0F0H,000H,0F0H,001H,080H,001H,080H,007H,000H,005H,000H,005H;STEP4 DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FBH,0FFH,0FCH,0FFH,0C4H,0FFH,0C3HDB 0FEH,000H,0FEH,000H,0F0H,000H,0F0H,007H,080H,001H,080H,007H,000H,004H,000H,007H;STEP5DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,000H,000H,000H,000H,000H,000HDB 000H,000H,000H,000H,000H,000H,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFHDB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFHDB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFHDB 000H,000H,0F4H,058H,084H,0D4H,085H,052H,0F5H,052H,085H,052H,086H,054H,0F4H,058HDB 000H,000H,022H,05EH,022H,050H,022H,050H,023H,0DEH,022H,050H,022H,050H,0FAH,05EHEND咕哝了很多天终于成功了,发出来供大家交流,没准儿还能对别人有些帮助,总之百利无一害……点阵大小是16*32的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
雪儿教你轻松学51系列(作者:就抽精品)发布: 2010-2-05 16:03 | 作者: 雪儿| 来源: 电子园51单片机学习网阿拉教你轻松学51--------液晶篇(1602)写在开始:(借此灌下水^_^ ) 之前,发了一个帖子,大意是看见杀手和水剑写的帖子,心里也痒痒了,想写一写以前学习单片机过程中的一些经历,希望能给大家一点参考。
无奈最近时间很是紧张,因此,一直都没能着手整理。
本打算星期六写的,但是接到一个朋友的电话,说想买CPLD的开发板。
于是,计划被迫打乱,只好先陪他去电子市场买板子。
回来之后,虽然头很晕(坐车的原因),但是不能再拖了,否则留给大家一个只说不做的印象就不好了。
虽然头晕,但是下面的写出来的东西可不晕。
OK,LET’S GO !1602字符液晶在实际的产品中运用的也比较多了,前几天留意了一下,发现宿舍门前的自动售水机就是采用的1602液晶进行显示的。
而且对于单片机的学习而言,掌握1602的用法是每一个学习者必然要经历的过程。
在此,我将使用1602过程中遇到的问题以及感受记录下来,希望能够给初学者带来一点指导,少走一点弯路。
所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。
目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
1602液晶的正面(绿色背光,黑色字体)1602液晶背面(绿色背光,黑色字体)另一种1602液晶模块,显示屏是蓝色背光白色字体字符型LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,引脚定义如下表所示:HD44780内置了DDRAM、CGROM和CGRAM。
DDRAM就是显示数据RAM,用来寄存待显示的字符代码。
共80个字节,其地址和屏幕的对应关系如下表:也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码就行了。
但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。
那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。
第二行也一样用前16个地址。
对应如下:DDRAM地址与显示位置的对应关系(事实上我们往DDRAM里的00H地址处送一个数据,譬如0x31(数字1的代码)并不能显示1出来。
这是一个令初学者很容易出错的地方,原因就是如果你要想在DDRAM 的00H地址处显示数据,则必须将00H加上80H,即80H,若要在DDRAM的01H处显示数据,则必须将01H加上80H即81H。
依次类推。
大家看一下控制指令的的8条:DDRAM地址的设定,即可以明白是怎么样的一回事了)1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B (41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”上表中的字符代码与我们PC中的字符代码是基本一致的。
因此我们在向DDRAM 写C51字符代码程序时甚至可以直接用P1='A'这样的方法。
PC在编译时就把“A”先转为41H代码了。
字符代码0x00~0x0F为用户自定义的字符图形RAM(对于5X8点阵的字符,可以存放8组,5X10点阵的字符,存放4组),就是CGRAM了。
后面我会详细说的。
0x20~0x7F为标准的ASCII码,0xA0~0xFF为日文字符和希腊文字符,其余字符码(0x10~0x1F及0x80~0x9F)没有定义。
那么如何对DDRAM的内容和地址进行具体操作呢,下面先说说HD44780的指令集及其设置说明,请浏览该指令集,并找出对DDRAM的内容和地址进行操作的指令。
共11条指令:1.清屏指令功能:<1> 清除液晶显示器,即将DDRAM的内容全部填入"空白"的ASCII码20H;<2> 光标归位,即将光标撤回液晶显示屏的左上方;<3> 将地址计数器(AC)的值设为0。
2.光标归位指令功能:<1> 把光标撤回到显示器的左上方;<2> 把地址计数器(AC)的值设置为0;<3> 保持DDRAM的内容不变3.进入模式设置指令功能:设定每次定入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。
参数设定的情况如下所示:位名设置I/D 0=写入新数据后光标左移1=写入新数据后光标右移S 0=写入新数据后显示屏不移动1=写入新数据后显示屏整体右移1个字4.显示开关控制指令功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。
参数设定的情况如下:位名设置D 0=显示功能关 1=显示功能开C 0=无光标1=有光标B 0=光标闪烁 1=光标不闪烁5.设定显示屏或光标移动方向指令功能:使光标移位或使整个显示屏幕移位。
参数设定的情况如下:S/C R/L 设定情况0 0 光标左移1格,且AC值减10 1 光标右移1格,且AC值加11 0 显示器上字符全部左移一格,但光标不动1 1 显示器上字符全部右移一格,但光标不动6.功能设定指令功能:设定数据总线位数、显示的行数及字型。
参数设定的情况如下:位名设置DL 0=数据总线为4位1=数据总线为8位N 0=显示1行1=显示2行F 0=5×7点阵/每字符1=5×10点阵/每字符7.设定CGRAM地址指令功能:设定下一个要存入数据的CGRAM的地址。
8.设定DDRAM地址指令功能:设定下一个要存入数据的CGRAM的地址。
(注意这里我们送地址的时候应该是0x80+Address,这也是前面说到写地址命令的时候要加上0x80的原因)9.读取忙信号或AC地址指令功能:<1> 读取忙碌信号BF的内容,BF=1表示液晶显示器忙,暂时无法接收单片机送来的数据或指令;当BF=0时,液晶显示器可以接收单片机送来的数据或指令;<2> 读取地址计数器(AC)的内容。
10.数据写入DDRAM或CGRAM指令一览功能:<1> 将字符码写入DDRAM,以使液晶显示屏显示出相对应的字符;<2> 将使用者自己设计的图形存入CGRAM。
11.从CGRAM或DDRAM读出数据的指令一览功能:读取DDRAM或CGRAM中的内容。
基本操作时序:读状态输入:RS=L,RW=H,E=H输出:DB0~DB7=状态字写指令输入:RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码输出:无读数据输入:RS=H,RW=H,E=H输出:DB0~DB7=数据写数据输入:RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据输出:无呵呵,看到这么多的控制指令希望你没有头晕。
其实这么多的指令刚开始的时候没有必要全部掌握,随着学习的深入可以再尝试去用更复杂的控制指令。
下面让我们一起驱动1602的液晶吧。
下面是我的液晶的连接图,用的是那种蓝底白字的液晶,其实蓝底白字和那种绿底黑字的液晶唯一的区别就是颜色的问题,至于用哪种液晶,就看各位自己的喜好咯。
这就是我做测试用的最小系统,单片机是STC89C516,晶振为12M。
液晶为蓝底白字的那种1602。
当我们硬件连接错误,或者程序错误时就会出现下图这种情况,就是上排显示16的白色的块(蓝底黑字的液晶则显示的是16个黑块)。
下面我们来驱动1602吧在1602的上排显示“LCD1602 check ok”下排显示“study up”程序中没有用到忙检测,而是用的是延时函数来替代忙检测#include<reg52.h> //包含头文件,这个嘛,就不用多说了~~#define uint unsigned int //预定义一下#define uchar unsigned charsbit rs=P3^5; //1602的数据/指令选择控制线sbit rw=P3^6; //1602的读写控制线sbit en=P3^7; //1602的使能控制线/*P2口接1602的D0~D7,注意不要接错了顺序,我以前可在这上面吃过亏~*/ uchar code table[]="LCD1602 check ok"; //要显示的内容1放入数组tablel uchar code table1[]="study up"; //要显示的内容2放入数组table1 void delay(uint n) //延时函数{uint x,y;for(x=n;x>0;x--)for(y=110;y>0;y--);}void lcd_wcom(uchar com) //1602写命令函数{rs=0; //选择指令寄存器rw=0; //选择写P2=com; //把命令字送入P2delay(5); //延时一小会儿,让1602准备接收数据en=1; //使能线电平变化,命令送入1602的8位数据口en=0;}void lcd_wdat(uchar dat) //1602写数据函数{rs=1; //选择数据寄存器rw=0; //选择写P2=dat; //把要显示的数据送入P2delay(5); //延时一小会儿,让1602准备接收数据en=1; //使能线电平变化,数据送入1602的8位数据口en=0;}void lcd_init() //1602初始化函数{lcd_wcom(0x38); //8位数据,双列,5*7字形lcd_wcom(0x0c); //开启显示屏,关光标,光标不闪烁lcd_wcom(0x06); //显示地址递增,即写一个数据后,显示位置右移一位lcd_wcom(0x01); //清屏}void main() //主函数{uchar n,m=0;lcd_init(); //液晶初始化lcd_wcom(0x80); //显示地址设为80H(即00H,)上排第一位for(m=0;m<16;m++) //将table[]中的数据依次写入1602显示{lcd_wdat(table[m]);delay(200);}lcd_wcom(0x80+0x44); //重新设定显示地址为0xc4,即下排第5位for(n=0;n<8;n++) //将table1[]中的数据依次写入1602显示{lcd_wdat(table1[n]);delay(200);}while(1); //动态停机}程序写好后烧写进单片机,现在让我们看看效果吧这就是显示的效果,你做成功了吗?下面让我们来看看如何显示一个自定义的字符吧我们从CGROM表上可以看到,在表的最左边是一列可以允许用户自定义的CGRAM,从上往下看着是16个,实际只有8个字节可用。