ADS7816驱动程序(1602显示51单片机四线串口传输数据)

合集下载

51单片机驱动1602液晶汇编语言程序

51单片机驱动1602液晶汇编语言程序

RET LCMSET: MOV A,#38H LCALL LCMWR0 MOV A,#08H LCALL LCMWR0 MOV A,#01H LCALL LCMWR0 MOV A,#06H LCALL LCMWR0 MOV A,#0CH LCALL LCMWR0 RET LCMCLR: MOV A,#01H LCALL LCMWR0 RET DELAY: MOV R6,#5 D1: ;2.7MS 延时子程序(作用尚不知) ;清屏 ;程序初始化
TAB0: DB "I AM YUAN MING",00H TAB1: DB "NICE TO MEET YOU",00H LCMLAY: PUSH ACC LOOP: CLR LCMEN CLR LCMRS SETB LCMRW SETB LCMEN MOV A,LCMDATA CLR LCMEN JB ACC.7,LOOP POP ACC LCALL DELAY RET LCMWR0: ;写入指令 ;读忙程序,用于判断 d7 是否为 0
51 单片机驱动 1602 液晶汇编语言程序
LCMRS EQU P2.4 LCMRW EQU P2.5 LCMEN EQU P2.6 LCMDATA EQU P0 ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV SP,#60H LCALL LCMSET LCALL LCMCLR MOV A,#80H LCALL LCMWR0 MOV DPTR,#TAB0 LCALL LCMWR2 MOV A,#0C0H LCALL LCMWR0 MOV DPTR,#TAB1 LCALL LCMWR2 SJMP $
LCALL LCMLAY CLR LCMEN CLR LCMRS CLR LCMRW SETB LCMEN MOV LCMDATA,A

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单片机的1602计算器

51单片机的1602计算器

51单片机的1602计算器一、51 单片机和 1602 液晶显示屏简介51 单片机是指英特尔公司生产的 8051 系列单片机,它具有丰富的资源,包括 I/O 端口、定时器、中断等。

通过编程,可以让 51 单片机完成各种复杂的任务。

1602 液晶显示屏是一种字符型液晶显示模块,它能够显示两行,每行 16 个字符。

1602 液晶显示屏的控制方式相对简单,通过发送特定的指令和数据,就可以实现字符的显示。

二、硬件设计要实现 51 单片机的 1602 计算器,首先需要进行硬件设计。

硬件部分主要包括 51 单片机最小系统、1602 液晶显示屏、按键等。

51 单片机最小系统通常包括单片机芯片、晶振电路和复位电路。

晶振电路为单片机提供时钟信号,复位电路则保证单片机能够正常启动。

1602 液晶显示屏与51 单片机的连接需要用到一些数据线和控制线。

数据线用于传输要显示的数据,控制线用于控制显示屏的工作状态。

按键用于输入数字和运算符,常见的按键有数字键 0 9 、运算符+、、、/以及等于号=等。

三、软件编程软件编程是实现 51 单片机 1602 计算器的关键。

在编程过程中,需要实现以下几个主要功能:1、初始化 1602 液晶显示屏在程序开始时,需要对 1602 液晶显示屏进行初始化,设置显示模式、光标显示等。

2、按键扫描通过不断扫描按键状态,获取用户输入的数字和运算符。

3、数据处理根据用户输入的数字和运算符,进行相应的计算,并将结果存储起来。

4、显示结果将计算结果显示在 1602 液晶显示屏上。

```cinclude <reg52h> //包含 51 单片机的头文件//定义 1602 液晶显示屏的控制引脚sbit RS = P2^0;sbit RW = P2^1;sbit EN = P2^2;//定义 1602 液晶显示屏的数据引脚sbit D0 = P0^0;sbit D1 = P0^1;sbit D2 = P0^2;sbit D3 = P0^3;sbit D4 = P0^4;sbit D5 = P0^5;sbit D6 = P0^6;sbit D7 = P0^7;//定义按键引脚sbit key0 = P1^0;sbit key1 = P1^1;sbit key2 = P1^2;sbit key3 = P1^3;sbit key4 = P1^4;sbit key5 = P1^5;sbit key6 = P1^6;sbit key7 = P1^7;sbit key8 = P3^0;sbit key9 = P3^1;sbit key_add = P3^2;sbit key_sub = P3^3;sbit key_mul = P3^4;sbit key_div = P3^5;sbit key_eq = P3^6;//定义变量unsigned char num1, num2, op, result;unsigned char flag = 0; //标志位,用于判断输入状态//写指令函数void write_command(unsigned char command){RS = 0;RW = 0;EN = 0;P0 = command;EN = 1;EN = 0;}//写数据函数void write_data(unsigned char data){RS = 1;RW = 0;EN = 0;P0 = data;EN = 1;EN = 0;}//初始化 1602 液晶显示屏函数void init_1602(){write_command(0x38);// 8 位数据,2 行显示,5x7 点阵write_command(0x0c);//显示开,光标关,闪烁关write_command(0x06);//字符右移,地址指针加 1 write_command(0x01);//清屏}//按键扫描函数void key_scan(){if (key0 == 0){delay_ms(10);//消抖if (key0 == 0){if (flag == 0){num1 = num1 10 + 0;write_data('0');}else{num2 = num2 10 + 0;write_data('0');}}while (!key0);//等待按键松开}//其他按键扫描类似}//计算函数void calculate(){switch (op){case '+':result = num1 + num2;break;case '':result = num1 num2;break;case '':result = num1 num2;break;case '/':if (num2!= 0)result = num1 / num2;elsewrite_data('E');//除数为 0 ,显示错误break;}}//主函数void main(){init_1602();while (1){key_scan();if (key_add == 0 || key_sub == 0 || key_mul == 0 ||key_div == 0){delay_ms(10);//消抖if (key_add == 0){op ='+';flag = 1;write_data('+');}//其他运算符处理类似}if (key_eq == 0){delay_ms(10);//消抖if (key_eq == 0){calculate();write_data(result);num1 = 0;num2 = 0;flag = 0;}}}}```上述代码只是一个简单的示例,实际应用中还需要进行更多的优化和完善,比如处理输入错误、添加更多的功能等。

1602 四线制驱动程序

1602 四线制驱动程序

/************************************************************************** 1602 四线制驱动程序--基于MSP430F149File Name: LCD1602x4_mps.hAuthor: HuNB***************************************************************************/#include<msp430x14x.h>#define set(x) P6OUT |=x#define clr(x) P6OUT &=~x#define rs BIT2 //RA1#define rw BIT3 //RA2#define e BIT4 //RA3/*--------------------------------------------------------------------------------------------------函数说明--------------------------------------------------------------------------------------------------*/void init(); //申明I/O口初始化函数void delay_nus(unsigned int n); //N nS延时函数void delay_nms(unsigned int n); //N mS延时函数void LCD_init(void); //LCD初始化函数void LCD_en_write(void); //LCD写入使能函数void LCD_write_command(unsigned char command) ; //LCD写入命令函数void LCD_write_data(unsigned char Recdata); //LCD写入数据函数void LCD_set_xy (unsigned char x, unsigned char y); //LCD设置显示位置函数void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata); //LCD显示字符函数int LCD_PutStr(unsigned char *DData,int pos); //LCD显示字符串函数//int LCD_PutNum(unsigned long num,int XS,int pos);//LCD显示数字函数int p=0;//---------------------------------------//---------------------------------------//I/O口初始化函数void init(){//ADCON1=0X07; //设置A口为普通I/O口//TRISA=0X00; //设置A口为输出//TRISD=0X00; //设置D口为输出P4DIR=0xff;P6DIR=0x1c; //设置A口为输出WDTCTL = WDTPW + WDTHOLD; //杀狗}void delay_1us(void) //1us延时函数{_NOP();}void delay_nus(unsigned int n) //N us延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void) //1ms延时函数{unsigned int i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n) //N ms延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1ms();}void LCD_en_write(void) //液晶使能{set(e);delay_nus(1);clr(e);}void LCD_write_command(unsigned char command) //写指令{unsigned char temp;temp=command>>4; //高四位移到低四位delay_nus(16);clr(rs); //RS=0 选择指令地址clr(rw); //RW=0 写操作P4OUT&=0Xf0; //清低四位P4OUT|=temp&0x0f; //写高四位//command&0x0f;LCD_en_write();P4OUT&=0xf0; //清高四位P4OUT|=command&0x0f; //写低四位LCD_en_write();set(rw); //RW=1 结束写操作}void LCD_write_data(unsigned char Recdata) //写数据{ unsigned char temp;temp=Recdata>>4; //高四位移到低四位delay_nus(16);set(rs); //RS=1 选择数据地址clr(rw); //RW=0 写操作P4OUT&=0Xf0; //清高四位P4OUT|=temp&0x0f; //Recdata&0xf0写高四位LCD_en_write();// Recdata=Recdata<<4; //低四位移到高四位P4OUT&=0Xf0; //清高四位P4OUT|=Recdata&0x0f; //写低四位LCD_en_write();set(rw); //RW=1 结束写操作}void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数{unsigned char address;if (y == 0) address = 0x80 + x;else address = 0xc0 + x;LCD_write_command(address);}void LCD_init(void) //液晶初始化{LCD_write_command(0x28);delay_nus(40);LCD_write_command(0x28);delay_nus(40);LCD_write_command(0x28);delay_nus(40);LCD_en_write();delay_nus(40);LCD_write_command(0x28); //4位显示LCD_write_command(0x0c); //显示开LCD_write_command(0x01); //清屏delay_nms(5);}void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata) //列x=0~15,行y=0,1{LCD_set_xy(X, Y); //写地址LCD_write_data(Recdata);}int LCD_PutStr(unsigned char *DData,int pos){unsigned char i;if(pos==-1){LCD_write_command(0x01); //清屏delay_nms(2);pos=0;}while((*DData)!='\0'){switch(*DData){case '\n': //如果是\n,则换行{if(pos<17){for(i=pos;i<16;i++)LCD_write_char(i%16, i/16, ' ');pos=16;}else{for(i=pos;i<32;i++) LCD_write_char(i%16, i/16, ' ');pos=32;}break;}case '\b': //如果是\b,则退格{if(pos>0) pos--;LCD_write_char(pos%16, pos/16, ' ');break;}default:{if((*DData)<0x20){*DData=' ';}LCD_write_char(pos%16, pos/16,*DData);pos++;break;}}DData++;}return(pos);}/*----------------------------以下函数用于输出数字---------------------int LCD_PutNum(unsigned long num,int XS,int pos){ //从右边数,保留几位小数unsigned long tmp=0;unsigned char numbits=0;if(pos==-1){LCD_write_command(0x01);delay_nms(2);pos=0;}if(num==0){LCD_write_char(pos%16, pos/16, '0');pos++;}else{if(num<0){LCD_write_char(pos%16, pos/16, '-');num*=(-1);pos++;}while(num){tmp=tmp*10+(num%10);num=num/10;numbits++;}while(tmp){LCD_write_char(pos%16, pos/16, (tmp%10)+48);tmp=tmp/10;pos++;numbits--;if(numbits==XS) pos=LCD_PutStr(".",pos); //显示小数点 }while(numbits--){LCD_write_char(pos%16, pos/16, '0');pos++;}}return(pos);}**/。

51单片机驱动1602液晶(4线串行)

51单片机驱动1602液晶(4线串行)

51单片机驱动1602液晶(4线串行) 2015-06-26 12:04:01 来源:51hei关键字:51单片机1602液晶4线串行/*单片机I/O 口使单片机资源的重要组成部分,也是用来扩展外围设备的必选资源,尽可能以更少的I/O口实现更多的功能是单片机工程师追求的目标,现在的一些串行器件也为这一目标的实现添加了更多的可能性,比如I2C总线,MAXIM力推的1-WIRE等等,都可以以很少的I/O口实现更多的功能,当然这是以降低一定的速度为代价的。

废话少说,进入正题。

显示器件多见的是LED数码管,LCD液晶屏等。

一般的数码管成本低廉,在显示内容要求不多的时候适用;LCD液晶屏以更多的显示空间得到了许多人的爱好,不过成本上要高的多(市场价在20元左右),本文以LCD1602为例说明如何驱动液晶屏。

LCD1602外接的控制接口有RS,R/W,E;数据接口为DB7--DB0。

总共有11跟线与单片机的I/O口连接,若使用标准的51单片机,至少占用了一个端口再加上另一个端口的部分I/O口。

这再很多应用场合是不大可取的。

所以很有必要减少连接数。

从其数据手册上介绍的4线连接方式可以达到只使用7个I/O口即可满足要求,其中为3个控制口RS,R/W,E和数据口的DB7--DB4;写入数据或指令的顺序是先写高半个字节,再写低半个字节。

其中P0口的高四位接到LCD1602的DB7-DB4,P3.0-P3.1分别接RS,R/W,E;下面给出驱动源程序*/#include <reg52.h>#include "intrins.h"#define uint unsigned int#define uchar unsigned char#define TRUE 1#define FALSE 0#define nop _nop_()#define PtData P0 //定义连接口线,#define PtContr P3sbit RS="PtContr"^0;sbit RW="PtContr"^1;sbit E="PtContr"^2;void InitialLcd();void WriteLcdInstr(uchar);void WriteLcdData(uchar);void CheckLcdBusy();uchar HexToDdram(uchar);void Delay(unsigned int);main(){Delay(1000);InitialLcd();WriteLcdInstr(0x80); WriteLcdData('e');WriteLcdData('l');WriteLcdData('k');WriteLcdData('e');WriteLcdData('l');WriteLcdData('i');WriteLcdData('k');WriteLcdData('e');WriteLcdInstr(0xc0); WriteLcdData('L');WriteLcdData('C');WriteLcdData('D');WriteLcdData('1');WriteLcdData('6');WriteLcdData('0');WriteLcdData('2');while(1){WriteLcdInstr(0x0f);Delay(30000);WriteLcdInstr(0x08);Delay(40000);}}//----------------LCD1602函数---------------------////---初始化void InitialLcd(){Delay(600);//延时应大于15ms,不同的晶振使需要修改,本程序再6M下调试通过RS=0;RW=0;nop;E=0;nop;E=1;nop;PtData=0x20;//nop;E=0;Delay(200);//延时应大于4.1msE=1;nop;PtData=0x20;//nop;E=0;Delay(5);//延时应大于100usE=1;nop;PtData=0x20;//nop;E=0;//设置4位操作;WriteLcdInstr(0x01);//清屏WriteLcdInstr(0x28);//设置4位操作,1行显示,5x8WriteLcdInstr(0x02);//光标归位WriteLcdInstr(0x06);//AC自动加1,画面不动WriteLcdInstr(0x0f);//0x0f:光标闪烁开;}//---写指令void WriteLcdInstr(uchar Temp){CheckLcdBusy();RS=0;RW=0;E=0;nop;PtData=Temp;nop;E=0;nop;E=1;nop;PtData=(Temp<<4);nop;E=0;nop;}//---写数据void WriteLcdData(uchar Temp) {CheckLcdBusy();RS=1;RW=0;E=0;nop;E=1;nop;PtData=Temp;nop;E=0;nop;E=1;nop;PtData=(Temp<<4);nop;E=0;nop;}//---查忙void CheckLcdBusy(){uchar Temp,t;PtData=0xff;RW=1;RS=0;nop;E=0;nop;do{nop;E=1;nop;Temp=PtData;nop;nop;nop;E=0;nop;nop;t=PtData;nop;nop;nop;E=0;nop;nop;Temp&=0x80;}while(Temp==0x80);}//---delayvoid Delay(unsigned int N) {unsigned int i;for(i=0;i<N;i++){i=i;}}。

1602四线制驱动程序,51单片机验证通过

1602四线制驱动程序,51单片机验证通过

delay_xms(1);//delay 1ms LCD_E=1; delay_xms(1);//delay 1ms LCD_E=0; */ //for 4bits data // uint8_t temp; LCD_RS=com;//com=1,write data //com=0,write construction //write high 4bits data LCD_DB7=x&0x80; LCD_DB6=x&0x40; LCD_DB5=x&0x20; LCD_DB4=x&0x10; // LCD_PORT= x&0xf0; delay_xms(1); //delay 1ms LCD_E=1; delay_xms(1); //delay 1ms LCD_E=0; //write low 4bits data LCD_DB7=x&0x08; LCD_DB6=x&0x04; LCD_DB5=x&0x02; LCD_DB4=x&0x01; // LCD_PORT= (x&0x0f)<<4; delay_xms(1); //delay 1ms LCD_E=1; delay_xms(1); //delay 1ms LCD_E=0; } //write address void write_address(uint8_t x,uint8_t y) { /* // for 1602 //write address
/*************************************************** 说明:1602和0802是我们常用的显示接口,由于有时候我们要节约io口 资源,需要用到4线制的接法,这样就可以由原来的11个io口(8个数据 端口+3个控制端口)减小到6个io口(4个数据端口+2个控制端口,RW 接地只写不读)。有时候我们也要显示一个字符串或一个整形或浮点型 数字,我也相关的函数整理一下供有需要的人参考。关于整数或浮点数 转换成字符串,也可以用库里面的函数。#include <stdio.h> sprintf 函 数。 **************************************************/ /*************************************************** 调试时注意事项说明:我们常用延时的方法一定要给硬件足够的反应时 间,因为如果延时太短的话,屏幕可能没显示。具体延时时间的大小可 参考例程并适当修改延时时间观察效果以确定一个合适的延时时间。 **************************************************/ /************************************************ *以下是1602头文件 *************************************************/ /** ****************************************************** * @file lcd1602.h * @brief This file contains all lcd1602 functions declaration. **/ #ifndef __LCD1602_H #define __LCD1602_H #include <reg51.h> #define uint8_t unsigned char #define uint16_t unsigned int //LCD1602/0802 define #define LCD_PORT P0 sbit LCD_DB4= P0^4; sbit LCD_DB5= P0^5; sbit LCD_DB6= P0^6; sbit LCD_DB7= P0^7; sbit LCD_RS= P1^0; sbit LCD_E= P1^1; //#define LCD_RW 0 //Only Write

51单片机串口通信仿真实现1616点阵显示程序

51单片机串口通信仿真实现1616点阵显示程序

51单片机串口通信仿真实现1616点阵显示程序首先要了解串口通信的基本工作原理,连接图如下:虚拟终端连接:单片机+虚拟终端(作为串口输入设备)+串口连接图如下:设置如下:单片机虚拟终端选项作用如下:如果输入的是ASCII码,那么就不要勾选 Hex Display Mode如果输入的是16进制,那么就不要勾选 Hex Display ModeClear Screen 是清屏Echo Typed Characters 是你在虚拟终端窗口输入字符时,输入的字符显示在虚拟终端窗口上。

具体C程序如下(如有疑问联系本人,新浪微博地址:/1858560312):#include#include#define uint unsigned int#define uchar unsigned charunsigned char a,flag;char code YD[]={0x01,0x00,0x01,0x00,0x7F,0xFC,0x03,0x80,0x05,0x40,0x09,0x30,0x31,0x0E,0xDF,0xE4,0x00,0x80,0x01,0x00,0x7F,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,0x20,0x40,0x30,0x40,0x24,0x4C,0x42,0x70,0xFF,0x44,0x42,0x46,0x00,0x7C,0x7E,0x00,0x42,0x40,0x7E,0x4C,0x42,0x70,0x7E,0x40,0x42,0x44,0x42,0x46,0x4A,0x3C,0x44,0x00,0x00,0x00,0x0F,0xF0,0x08,0x10,0x0F,0xF0,0x08,0x10,0x0F,0xF0,0x00,0x00,0xFF,0xFE,0x01,0x00,0x09,0x00,0x09,0xF8,0x09,0x00,0x15,0x00,0x23,0x00,0x40,0xFE,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x80,0x02,0x40, 0x04,0x20,0x09,0x18,0x11,0x0E,0x61,0x04, 0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00, 0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00, 0x01,0x00,0xFF,0xFE,0x01,0x00,0x02,0x80, 0x02,0x80,0x02,0x40,0x04,0x40,0x04,0x20, 0x08,0x10,0x10,0x18,0x20,0x0E,0x40,0x04,/0x08,0x20,0x08,0x20,0x08,0x20,0x4B,0xFE, 0x4A,0x22,0x4A,0x22,0x4A,0x22,0x4A,0x22, 0x4A,0x22,0x4A,0x22,0x4A,0x22,0x12,0x2E, 0x12,0x24,0x20,0x20,0x40,0x20,0x80,0x20,0x00,0x00,0x7F,0xFC,0x00,0x10,0x1F,0x90, 0x10,0x90,0x1F,0x90,0x10,0x90,0x00,0x04, 0xFF,0xFE,0x00,0x10,0x1F,0x90,0x10,0x90, 0x1F,0x90,0x10,0x90,0x00,0x50,0x00,0x20 };void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){int i;TMOD=0x20;//设置定时器1为工作方式2 TH1=0xfd;TH2=0xfd;//设置波特率为9600TR1=1;//启动定时器1SM0=0;SM1=1;//选择串口工作方式1REN=1;//允许接收数据EA=1;//打开总中断ES=1;//打开串口中断while(1){if(flag==1){flag=0;while(1){if(a==0x31)//键盘码十六进制{for(i=0;i<16;i++){P1=i;P0=~YD[2*i];P2=~YD[2*i+1];delay(2);}}if(a==0x32){for(i=1;i<17;i++) {P1=i;P0=~YD[32+2*i];P2=~YD[32+2*i+1]; delay(2);}}if(a==0x33){for(i=1;i<17;i++) {P1=i;P0=~YD[64+2*i];P2=~YD[64+2*i+1]; delay(2);}}if(a==0x34){for(i=1;i<17;i++){P1=i;P0=~YD[96+2*i];P2=~YD[96+2*i+1]; delay(2);}}if(a==0x35){for(i=1;i<17;i++) {P1=i;P0=~YD[128+2*i];P2=~YD[128+2*i+1]; delay(2);}}if(a==0x36){for(i=1;i<17;i++) {P1=i;P0=~YD[160+2*i];P2=~YD[160+2*i+1]; delay(2);}}if(a==0x37){for(i=1;i<17;i++){P1=i;P0=~YD[192+2*i];P2=~YD[192+2*i+1];delay(2);}}}//第二个while结尾}//if结尾}//第一个while结尾}//主函数结尾void ser() interrupt 4{RI=0;//接受中断标志位,清0为取消中断申请a=SBUF;//接收数据flag=1;//中断标志位}。

1602显示屏C语言驱动程序及相关上传资料.

1602显示屏C语言驱动程序及相关上传资料.
1602液晶屏通用连接图
C语言编写的程序再说明的下面
1602显示屏的使用方面的知识。
一般市场上的1602液晶使用的驱动器为HD44780U或HD44780S,市场上大部分液晶用的是后者。HD44780S的供电电压为5V±10%,而HD44780U的供电电压为2.7V~5.5V。也就是说,绝大部分1602液晶只能工作在5V电压下,其供电电压必须为5V。经过试验发现,1602液晶的供电虽然必须为5V,但其控制总线和数据总线可以用3.3V电平(因为对于TTL电平,一般大于2.5V以上都算高电平,不过最可靠的是大于3.6V),只不过在3.3V电平下,数据的通信速度会大大降低,这一点需要在写驱动时注意。需要时,可以将MCU的IO配置为漏极开路方式,用上拉电阻拉到5V电平;实在不能配置为漏极开路方式时,请查阅MCU的电气参数,在允许的条件下,直接使用电阻弱上拉也可以。
1602液晶驱动程序及相关资料
简介:本文的内容包括1602的电路连接图,C语言编写的驱动程序,及说明书资料。初学者按图连接并烧好程序就可以直接点亮显示屏。是初学者不可多得的参考资料,可大大节约初学者的学习时间。需要说明的是本例用到的单片机是AT89S52或AT89S51型单片机。如果别的型号的单片机需要足以更新头文件。
characterN[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //日
//=====================================================================================
4、1602液晶的初始化
通用1602液晶的初始化需要注意一个问题,即一定要在最开始写入功能设定指令,该指令用以控制LCD的数据通信位数,及显示行数和字型。并且强烈建议将此指令写两次,因为LCD启动后并不知道您使用的是4位数据通信方式还是8位方式,所以它总是先执行高4位的指令,也就是说第一次写入该指令时,低四位的数据可能被忽略(这是我根据使用其它液晶的猜测)。总之为了可靠,最好写两遍该指令。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<reg52.h>#include <intrins.h>#include"1602.h"#define uchar unsigned char#define uint unsigned intsbit led=P1^0;sbit DCLK=P2^1;sbit Dout=P2^2;sbit CE= P2^3;void delay(uint z) //延时Z MS子函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}uchar code display[]={'0','1','2','3','4','5','6','7','8','9'}; void init() //AD初始化{DCLK=1;Dout=1;CE=1;}unsigned int readADS() //读取AD值,SPI {unsigned int back_up=0;unsigned char i=0;bit data1=0;Dout=1;DCLK=0;_nop_();_nop_();_nop_();_nop_();CE=1;_nop_();_nop_();_nop_();_nop_();//sampleDCLK=1;_nop_();_nop_();_nop_();_nop_();DCLK=0;_nop_();_nop_();_nop_();_nop_();DCLK=1;_nop_();_nop_();_nop_();_nop_();DCLK=0;_nop_();_nop_();_nop_();_nop_();DCLK=1;_nop_();_nop_();_nop_();_nop_();for(i=0;i<12;i++){DCLK=0;_nop_();_nop_();data1=Dout; //read dataif(data1){back_up|=(0x0800>>i);}DCLK=1;_nop_();_nop_();}CE=1; //close transferreturn back_up;}void main(){unsigned long int temp=0;unsigned long int ad=0;unsigned char wa=0,qi=0,ba=0,sh=0,ge=0;LCD_init();LCD_cls();init();ad=readADS();LCD_write_string(0,0,"ADS7816 TEST:");while(1){delay(100);led=0;delay(100);led=1;delay(100);ad=readADS();wa=ad/10000;qi=ad%10000/1000;ba=ad%10000%1000/100;sh=ad%10000%1000%100/10;ge=ad%10000%1000%100%10/1;LCD_write_char(0,1,display[wa]); //显示二进制对于十进制LCD_write_char(1,1,display[qi]);LCD_write_char(2,1,display[ba]);LCD_write_char(3,1,display[sh]);LCD_write_char(4,1,display[ge]);temp=ad*1221;LCD_write_char(6,1,display[temp/1000000]);LCD_write_char(7,1,'.');LCD_write_char(8,1,display[temp%1000000/100000]);LCD_write_char(9,1,display[temp%1000000%100000/10000]);LCD_write_char(10,1,display[temp%1000000%100000%10000/1000]);LCD_write_char(11,1,display[temp%1000000%100000%10000%1000/100]);LCD_write_char(12,1,display[temp%1000000%100000%10000%1000%100/10]);LCD_write_char(13,1,display[temp%1000000%100000%10000%1000%100%10/1]);LCD_write_char(14,1,' ');LCD_write_char(15,1,'V');}}2子函数1602sbit LCD_DB4= P0^4;sbit LCD_DB5= P0^5;sbit LCD_DB6= P0^6;sbit LCD_DB7= P0^7; // 四线数据传输sbit LCD1602_RS=P2^0;sbit LCD1602_RW=P3^7;//实际上没有读LCM,RW脚可以直接接地sbit LCD1602_EN=P3^6;void LCD_write_char( unsigned x,unsigned char y,unsigned char dat); //在指定位置显示字符void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);//在指定位置显示字符串void LCD_cls(void);//清屏void LCD_en_command(unsigned char command);void LCD_en_dat(unsigned char temp);void LCD_set_xy( unsigned char x, unsigned char y );void LCD_init(void);void SET_LCD(unsigned char IO_temp);void delayms(unsigned char ms);void lcddelay(void);unsigned char LCDIO;void LCD_cls(void){LCD_en_command(0x01); //清屏指令delayms(2);}void LCD_en_command(unsigned char command) //指令使能{LCD1602_RS=0; //命令选择开启LCD1602_RW=0; //写入模式LCD1602_EN=0; //使能初始LCDIO=(command & 0xf0);//写入高四位数据命令开启SET_LCD(LCDIO);LCD1602_EN=1;lcddelay();LCD1602_EN=0; //关闭使能LCDIO=(command & 0x0f)<<4; //写入低四位数据命令开启,送至高四位写入SET_LCD(LCDIO);LCD1602_EN=1;lcddelay();LCD1602_EN=0;}void SET_LCD(unsigned char IO_temp) //四位I/O口定义{LCD_DB7=IO_temp&0x80;LCD_DB6=IO_temp&0x40;LCD_DB5=IO_temp&0x20;LCD_DB4=IO_temp&0x10;}void LCD_en_dat(unsigned char dat) //数据写入驱动{LCD1602_RS=1;LCD1602_RW=0;LCD1602_EN=0;LCDIO=(dat & 0xf0);SET_LCD(LCDIO);LCD1602_EN=1;lcddelay();LCD1602_EN=0;LCDIO=(dat & 0x0f)<<4;SET_LCD(LCDIO);LCD1602_EN=1;lcddelay();LCD1602_EN=0;}void LCD_set_xy( unsigned char x, unsigned char y ) //行选择{unsigned char address;if (y ==0)address = 0x80 + x;elseaddress = 0xC0 + x;LCD_en_command(address);}void LCD_write_char( unsigned char x,unsigned char y,unsigned char dat) //字符写入{LCD_set_xy( x, y );LCD_en_dat(dat);}void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //字符串写入{LCD_set_xy( X, Y ); //set addresswhile (*s) // write character{LCDIO=*s;SET_LCD(LCDIO);LCD_en_dat(*s);s ++;}}void LCD_init(void) //1602初始化{LCD_en_command(0x33);delayms(20);LCD_en_command(0x32);delayms(20);LCD_en_command(0x08);delayms(5);LCD_en_command(0x01);delayms(5);LCD_en_command(0x06);delayms(5);LCD_en_command(0x0c);delayms(5);}void delayms(unsigned char ms){unsigned char i;while(ms--){for(i = 0; i < 115; i++);}}void lcddelay(void) {unsigned char i;for(i = 0; i < 2; i++); }。

相关文档
最新文档