12-指针基础与1602液晶的初步认识

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

5
12.2 指向数组元素的指针和运算法则
unsigned char number[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; unsigned char *p; unsigned char *q; p = &number[0]; q = &number[9];
1、比较运算,如p==q 为真的话,表示这两个指针指向的是同一个元素; 2、指针和整数之间的加减运算,如p+1 就指向了 number[1]; 3、两个指针变量在一定条件下的减法运算,如 q - p 的结果就是 9。
第十二章
指针基础与1602液晶的初步认识
1
12.1 指针的应用
优点:C语言的灵魂,是C语言的重要特征。利用指针可以直接快速的处理
内存中的各种数据结构的数据,特别是数组、字符串和内存的动态分配。 它为函数间各类数据的传递提供了简捷便利的方法。指针使C语言简洁、紧
凑、高效。
缺点:指针使用上的灵活性容易导致指针滥用而可能使程序失控。
6
7 8
E
D0 D1
使能信号
Data I/O Data I/O
14
15 16
D7
BLA BLK
Data I/O
背光正极 背光负极 12
12.4.2 1602wenku.baidu.com晶读写时序
1602 液晶内部带 80 个字节的显示 RAM,用来存储发送的数据,如图:
第一行地址0x00 到0x0F与液晶上第一行 16 个字符显示位置相对应的,第 二行 0x40 到 0x4F 是与第二行 16 个字符显示位置相对应的。每行都多出 来一部分,是为了显示移动字幕设置的。 1602 字符液晶是显示字符的,给 0x00 地址写一个‘a’(十进制 97),液 晶的最左上方的那个小块就会显示一个字母 a。
1602液晶简单实例
void LcdWaitReady() /* 等待液晶准备好 */ { unsigned char sta; LCD1602_DB = 0xFF; LCD1602_RS = 0; LCD1602_RW = 1; do { LCD1602_E = 1; sta = LCD1602_DB; //读取状态字 LCD1602_E = 0; } while (sta & 0x80); } void LcdSetCursor(unsigned char x, unsigned char y) { unsigned char addr; if (y == 0) //根据输入的屏幕坐标计算显示RAM的地址 addr = 0x00 + x; //第一行字符地址从0x00起 else addr = 0x40 + x; //第二行字符地址从0x40起 LcdWriteCmd(addr | 0x80); //设置RAM地址 }
d
d d d c c b a
在 C 语言中,地址就等同于指针,变量的地址就是变量的指针,保存指针 的变量称之为指针变量,简称为指针。
3
指针变量的声明和初始化
只要说指针,就是指指针变量。p = &a通常的说法是指针指向了a这个变量。*和&互 为逆运算,a = *p; 方法1: unsigned char a; unsigned char *p = &a; 方法2:
14
1602液晶读写时序
总线接口统一声明:
1、读状态 RS=L,R/W=H,E=H。(读取液晶的状态字 ,通过判断状态字的最高位来了解当 前液晶是否处于“忙”状态,也可以得知当前数据的指针值)
15
1602液晶读写时序
1、读状态 RS=L,R/W=H,E=H。 当前三句准备好数据之后,E从低电平到 高电平变化,然后 E 再从高到低电平出 现一个下降沿, 1602 液晶内部一旦检测 到这个下降沿就马上读取D0~D7的数据, 如此单片机就完成了写1602指令。
7
根据上位机发的命令值分别把不同数组的数据回发给上位机实例
bit cmdArrived = 0; unsigned char cmdIndex = 0; unsigned char *ptrTxd; unsigned char cntTxd = 0; unsigned char array3[4] = {1,2,3,4}; void main() { EA = 1; //开总中断 ConfigUART(9600); //配置波特率为9600 while (1) { if (cmdArrived) { cmdArrived = 0; switch (cmdIndex) { case 1: ptrTxd = array3; cntTxd = sizeof(array3); TI = 1; 软触发串口发送 break; default: break; } } } }
8
12.3 字符数组和字符指针
在程序运行过程中,其值不能被改变的量称之为常量。 整型常量: 1、2、3、100 浮点型常量:3.14、0.56、-4.8
字符型常量:'a'、'b'、'1'
字符串常量:"a"、"abc"、"1234"、"1234abcd"
直接常量
const unsigned int BAUD = 9600; unsigned char code LedChar[] = {... ...};
11
1602液晶的认识
编号 1 2 3 4 5 符号 VSS VDD VL RS R/W 引脚说明 电源地 电源正极 偏压信号 数据/命 令(H/L) 读/写(H/L) 编号 9 10 11 12 13 符号 D2 D3 D4 D5 D6 引脚说明 Data I/O Data I/O Data I/O Data I/O Data I/O
13
1602 液晶状态字
1602液晶内部有一个状态字字节,通过读取这个状态字的内容,就可以知 道液晶的一些内部情况。
最高位表示了当前液晶是不是“忙”,如果这个位是 1 表示液晶正“忙” ,禁止读写数据或者命令;如果是 0,则可以进行读写。
低 7 位就表示了当前数据地址指针的值,它指向哪里,写的数据就会送到 相应的那个地址里。
符号常量
#define BAUD 9600
9
字符数组和字符指针
普通字符:'a' , 'A'
字符形式 \n \t 含义 换行 横向跳格(相当于Tab) 竖向跳格
unsigned char x = 'a';
转义字符:特殊字符,无形的,像 回车符、换行符,如右所示;
\v
\b
\r
退格
光标移到行首
\\
2
12.1 指针的概念与指针变量的声明
unsigned char a = 1; unsigned char b = 2; unsinged int c = 3; unsigned long d = 4; 变量取地址: &a, &b, &c, &d
内存地址 …… 存储的数据 ……
0x07
0x06 0x05 0x04 0x03 0x02 0x01 0x00
特别注意:数组名字代表了数组元素的首地址。 p = &number[0]; 等价于 p = number; p[i] 等价于 *(p+i) 二维数组:p = &number[0][0] number[1] 等价于 &number[1][0]
6
12.2.2 指向数组元素指针实例
sizeof( )关键字:用来获取括号内的对象所占用的内存字节数,写作函数形 式,但是sizeof( )整体在程序代码中相当于一个常量。
17
1602液晶的指令介绍
3、清屏指令 固定的,写入 0x01 表示显示清屏,其中包含了数据指针清零,所有的显示 清零。写入0x02 则仅仅是数据指针清零,显示不清零。 4、RAM 地址设置指令 该指令码的格式为最高位为 1,低 7 位为 RAM 的地址,通常在读写数据之 前都要先设置好地址,然后再进行数据的读写操作。
unsigned char a;
unsigned char *p; p = &a;
4
指针变量重点区分
1、普通变量 VS 指针变量 unsigned char a; a = 1; a为普通变量; unsigned char *p; p = &a; 说明p指向的变量是unsigned char 类型,p为 指针变量。 2、定义指针变量*p VS 取值运算*p unsigned char *p; 仅仅是说明p是个指针变量,*不具备任何运算功能。 unsigned char a = 1; unsigned char b = 2; unsigned char *p; p = &a; b = *p; 计算完毕,b的值是1。
2、读数据
RS=H,R/W=H,E=H。 3、写指令
RS=L,R/W=L, D0~D7=指令码,E=高脉冲 4、写数据
RS=H,R/W=L, D0~D7=数据,
E=高脉冲
1602液晶所使用的接口时序是摩托罗拉公司所创立的6800时序
16
12.4.3 1602液晶的指令介绍
1、显示模式设置 写指令 0x38,设置:16x2显示,5x7点阵,8位数据接口。
void ConfigUART(unsigned int baud) { SCON = 0x50; //配置串口为模式1 TMOD &= 0x0F; //清零T1的控制位 TMOD |= 0x20; //配置T1为模式2 TH1 = 256 - (11059200/12/32)/baud; TL1 = TH1; //初值等于重载值 ET1 = 0; //禁止T1中断 ES = 1; //使能串口中断 TR1 = 1; //启动T1 } void InterruptUART() interrupt 4 { if (RI) //接收到字节 { RI = 0; //清零接收中断标志位 cmdIndex = SBUF; cmdArrived = 1; //设置命令到达标志 } if (TI) //字节发送完毕 { TI = 0; //清零发送中断标志位 if (cntTxd > 0) { SBUF = *ptrTxd; cntTxd--; ptrTxd++; //发送指针递增 } } }
反斜杠字符‘\’
单引号字符 双引号字符
字符串常量: " a " , "1234",
"welcome to www.kingst.org".
\’ \”
\f
\0
走纸换页
空值
10
12.4 1602液晶的认识
显示容量 芯片工作电压 工作电流 模块最佳工作电压 字符尺寸
16 x 2个字符 4.5~5.5V 2.0mA(5.0V) 5.0V 2.95 x 4.35mm (宽乘高)
2、显示开/关以及光标设置指令 第一条指令:0b00001DCB,高 5 位固定 D=1 表示开显示,D=0 表示关显示;C=1 显示光标,C=0 不显示光标;B=1 光 标闪烁,B=0 光标不闪烁。 第二条指令:0b000001NS,高 6 位固定 N=1读或写一个字符后,指针和光标都自动加 1,N=0 指针和光标都自动减 1; S=1 表示写一个字符后,整屏显示左移(N=1)或右移(N=0),以达到光标不移动 而屏幕移动的效果,S=0 表示写一个字符后,整屏显示不移动。
18
12.4.4
#define LCD1602_DB P0 sbit LCD1602_RS = P1^0; sbit LCD1602_RW = P1^1; sbit LCD1602_E = P1^5; void LcdWriteDat(unsigned char dat) { LcdWaitReady(); LCD1602_RS = 1; LCD1602_RW = 0; LCD1602_DB = dat; LCD1602_E = 1; LCD1602_E = 0; } void LcdWriteCmd(unsigned char cmd) { LcdWaitReady(); LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_DB = cmd; LCD1602_E = 1; LCD1602_E = 0; }
sizeof( )括号中可以是变量名,也可以是变量类型名,其结果是等效的。
int i; sizeof( i ); sizeof( int );
数组的 sizeof 值等于数组所占用的内存字节数,不是数组元素的个数;
int a[10]; int num = sizeof( a ) / sizeof( int );
相关文档
最新文档