请解释下列代码的含义:void writecom(unsigned char com)//写命令 { RS=0; RW=0; E=0; P0=com; delay(2); E=1; E=0; } void writedat(unsigned char dat)//写数据 { RS=1; RW=0; E=0; P0=dat; delay(2); E=1; E=0; }
时间: 2023-10-27 16:07:04 浏览: 51
这段代码是嵌入式系统开发中操作LCD1602液晶显示屏的函数代码。其中,writecom()函数用于向液晶屏写入命令,writedat()函数用于向液晶屏写入数据。
具体含义如下:
- RS:寄存器选择。当RS=0时,液晶屏将接收到的数据看作命令;当RS=1时,液晶屏将接收到的数据看作数据。
- RW:读写选择。当RW=0时,液晶屏将接收到的数据进行写操作;当RW=1时,液晶屏将接收到的数据进行读操作。
- E:使能信号。当E=1时,液晶屏将开始读取数据或者写入数据。
- P0:数据口。将要写入的数据或者命令存入P0口中。
- delay(2):延时函数,延时2毫秒,确保液晶屏已经完成读取或者写入操作。
- E=0:清除使能信号,表示读取或者写入操作已完成。
总的来说,这段代码的作用就是向LCD1602液晶屏写入命令或数据。根据RS、RW、E、P0等参数的不同组合,液晶屏将会执行不同的操作。
相关问题
解释每行代码#include "REG51.h" sbit RS = P3^0; sbit RW = P3^1; sbit E = P3^2; unsigned char str1[]=("2021213662"); unsigned char str2[]=("13733129016"); unsigned int i=0,j=0; void delay(unsigned int n) //延时函数 { unsigned int i=0,j=0; for(i=0;i<n;i++) { for(j=0;j<120;j++); } } void writedat(unsigned char dat) //写数据函数 { RS=1; RW=0; E=0; P2=dat; delay(5); E=1; E=0; } void writecom(unsigned char com) { RS=0; RW=0; E=0; P2=com; delay(5); E=1; E=0; } void initlcd() { writecom(0x38); writecom(0x0c); writecom(0x06); writecom(0x01); } void display() { unsigned int i=0,j=0; writecom(0x80); for(i=0;i<10;i++) { writecom(0x1c); writedat(str1[i]); delay(50); } writecom(0x80+0x40); for(j=0;j<11;j++) { writecom(0x1c); writedat(str2[j]); delay(50); } } void main() { initlcd(); while(1) { display(); } }
好的,我来为您解释每行代码的含义和作用:
1. `#include "REG51.h"`:包含了51单片机的头文件,用于调用单片机的寄存器和端口等相关信息。
2. `sbit RS = P3^0;`:定义了RS端口为P3的第0位,用于判断是否是写入数据。
3. `sbit RW = P3^1;`:定义了RW端口为P3的第1位,用于判断是读取还是写入数据。
4. `sbit E = P3^2;`:定义了E端口为P3的第2位,用于控制液晶屏的使能。
5. `unsigned char str1[]=("2021213662");`:定义了一个字符串数组str1,存储了一个学号信息。
6. `unsigned char str2[]=("13733129016");`:定义了一个字符串数组str2,存储了一个手机号信息。
7. `unsigned int i=0,j=0;`:定义了两个变量i和j,分别用于循环遍历两个字符串数组。
8. `void delay(unsigned int n)`:定义了一个延时函数,传入一个参数n,用于控制延时的时间。
9. `for(i=0;i<n;i++) { for(j=0;j<120;j++); }`:延时函数中的延时循环,每执行一次,延时大约为1毫秒。
10. `void writedat(unsigned char dat)`:定义了一个写数据函数,传入一个参数dat,用于将数据写入液晶屏中。
11. `RS=1; RW=0; E=0; P2=dat; delay(5); E=1; E=0;`:写数据函数中的具体执行代码,首先将RS置为1,表示要写入数据;将RW置为0,表示要写入数据;将E置为0,表示不进行使能;将P2端口置为要写入的数据;延时5毫秒,然后E置为1再置为0,表示进行一次使能。
12. `void writecom(unsigned char com)`:定义了一个写命令函数,传入一个参数com,用于向液晶屏发送命令。
13. `RS=0; RW=0; E=0; P2=com; delay(5); E=1; E=0;`:写命令函数中的具体执行代码,首先将RS置为0,表示要写入命令;将RW置为0,表示要写入命令;将E置为0,表示不进行使能;将P2端口置为要写入的命令;延时5毫秒,然后E置为1再置为0,表示进行一次使能。
14. `void initlcd()`:定义了一个初始化液晶屏的函数,用于设置液晶屏的初始状态。
15. `writecom(0x38); writecom(0x0c); writecom(0x06); writecom(0x01);`:初始化函数中的具体执行代码,分别表示设置液晶屏为8位数据总线,显示关闭光标,光标右移,清屏。
16. `void display()`:定义了一个显示函数,用于将两个字符串数组在液晶屏上显示出来。
17. `writecom(0x80);`:将光标移动到液晶屏的第一行第一列的位置。
18. `for(i=0;i<10;i++) { writecom(0x1c); writedat(str1[i]); delay(50); }`:循环遍历第一个字符串数组,将每个字符写入液晶屏中。
19. `writecom(0x80+0x40);`:将光标移动到液晶屏的第二行第一列的位置。
20. `for(j=0;j<11;j++) { writecom(0x1c); writedat(str2[j]); delay(50); }`:循环遍历第二个字符串数组,将每个字符写入液晶屏中。
21. `void main() { initlcd(); while(1) { display(); } }`:主函数中的具体执行代码,先进行液晶屏的初始化,然后进入死循环,不断执行显示函数,实现不断刷新液晶屏的效果。
讲下这段程序的编程流程和目的#include "main.h" //=========================================== sbit RS=P1^0; sbit RW=P1^1; sbit E=P1^2; sbit lcd_bla = P2^7; //=========================================== void Delay140us() //@12.000MHz 1T { unsigned char i, j; _nop_(); _nop_(); i = 2; j = 158; do { while (--j); } while (--i); } //void lcd_delay(uchar z) //{ // uchar t1,y; // for(t1=z;t1>0;t1--) // for(y=110;y>0;y--); //} //void Delay140us() //@12.000MHz 12T //{ // unsigned char i; // // _nop_(); // i = 67; // while (--i); //} // //uchar lcd_busy() //{ // register uchar lcd_start; // RS=0; // RW=1; // E=1; // lcd_delay(1); // lcd_start=P0; // E=0; // return(lcd_start&0x80); //} //============================================ void read(u8 del) //读函数 { P0=del; // while(lcd_busy()); RS=0; RW=0; E=0; Delay140us(); E=1; Delay140us(); } //============================================ void write(u8 del) //写函数 { P0=del; // while(lcd_busy()); RS=1; RW=0; E=0; Delay140us(); E=1; Delay140us(); } //============================================ //============================================ void lcd_init(void) //初始化函数 { lcd_bla = 0; read(0x01); read(0x0c); read(0x06); read(0xd0); read(0x38); lcd_show(1,1,' '); } //============================================ //void lcd_clear(void) //{ //read(0x01); //Delay140us(); //} void lcd_show(u8 hang,u8 lie,int sign) //数字显示 { u8 a; if(hang==1)a=0x80; if(hang==2) a=0xc0; a=a+lie-1; read(a); write(sign+48); } //============================================ void lcd_string(u8 hang,u8 lie,u8 *p) //字符串显示 { u8 a; if(hang==1)a=0x80; if(hang==2) a=0xc0; a=a+lie-1; read(a); while(1) { if(*p == '\0') break; write(*p); p++; } }
这段程序的目的是控制LCD液晶屏幕显示内容,包括数字和字符串。程序首先定义了LCD的接口引脚,然后定义了延时函数 Delay140us(),用于延时一段时间以等待LCD响应。接着定义了读函数 read() 和写函数 write(),分别用于向LCD发送读指令和写指令。然后是初始化函数 lcd_init(),用于初始化LCD屏幕。接下来是数字显示函数 lcd_show() 和字符串显示函数 lcd_string(),分别用于在LCD屏幕上显示数字和字符串。
具体地,数字显示函数 lcd_show() 接收三个参数:行号、列号和要显示的数字。首先通过行号和列号计算出要显示的位置,然后向该位置发送数字。字符串显示函数 lcd_string() 接收三个参数:行号、列号和要显示的字符串。同样通过行号和列号计算出要显示的位置,然后一次一个字符地向该位置发送字符串,直到遇到字符串结束符 '\0'。