51C语言程序集合 LCD1602
51单片机控制lcd1602实现计算器
//利用51单片机控制LCD1602,实现加减乘除运算#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define DATE_IO P0//P0口并行传输数据(LCD1602的数据端接P0口)sbit RS=P1^0;//LCD1602寄存器选择端sbit E=P1^2; //使能信号端sbit RW=P1^1;//读写控制端sbit deng=P1^3;//结果sbit shuzi11=P3^2;//前面的数字加1(因为我的按键是与P3口相连的)sbit shuzi22=P3^7; //后面的数字加1sbit jia=P3^3;//加号sbit jian=P3^4;//减号sbit cheng=P3^5;//乘号sbit chu=P3^6;//除号uint countqian=0,counthou=0;//数值uchar qian,bai,shi,ge,a=0;uchar code table1[]="0123456789";uchar code table2[]="+-*/";//**********************延时函数***************************************** void delay_us(unsigned int n){if(n==0)return ;while(--n);}void delay_ms(uint i){unsigned char a,b;for (a=1;a<i;a++)for(b=1;b;b++);}void delay(uint z){uint x,y;for(x=110;x>0;x--)for(y=z;y>0;y--);}//***********************************************************************//*********************控制LCD1602的函数*******************************void write_command(uchar come)//写指令函数{RS=0;//选择指令寄存器E=1;//由高电平跳变成低电平时,液晶执行命令DATE_IO=come;delay_us(5);E=0;RS=1;}void write_date(uchar date)//写数据函数{RS=1;//选择数据寄存器E=1;//由高电平跳变成低电平时,液晶执行命令DATE_IO=date;delay_us(5);E=0;RS=0;}//***************************************************************************** ***//**************************液晶初始化函数(基本上就是这个模式)*******************void init()//液晶初始化函数{RW=0;//低电平时进行写操作(高电平时进行读操作)E=0;write_command(0x38);//设置LCD两行显示,一个数据由5*7点阵表示,数据由8跟线传输delay_ms(5);write_command(0x01);//清除屏幕显示delay_ms(5);write_command(0x06);//设定输入方式,增量不移位delay_ms(5);write_command(0x0c);//开整体显示,关光标,不闪烁delay_ms(5);}//***************************************************************************** *****void jiayiqian()//前边数字加1计数函数{if(shuzi11==0)//如果前面加1的按键按下{delay(50);//消除抖动countqian=countqian+1;}if(countqian==999)//记到999归0countqian=0;}void jiayihou()//后边数字加1计数函数{if(shuzi22==0)//如果后面加1的按键按下{delay(50);//消除抖动counthou=counthou+1;}if(counthou==999)//记到999归0counthou=0;}void fuhao()//+,-,*,/运算号{if(jia==0)//如果加号按下{while(!jia);//等待按键的释放write_date(table2[0]);//显示'+'a=1;//加号按下的标志}if(jian==0)//如果减号按下{while(!jian);//等待按键的释放write_date(table2[1]);//显示'-'a=2;//减号按下的标志}if(cheng==0)//如果乘号按下{while(!cheng);//等待按键的释放write_date(table2[2]);//显示'*'a=3; //乘号按下的标志}if(chu==0)////如果除号按下{while(!chu);//等待按键的释放write_date(table2[3]);//显示'/'a=4;//除号按下的标志}}void chaiqian()//将前边各位数字拆开函数{bai=countqian/100;//求百位数字shi=countqian%100/10;//求十位数字ge=countqian%10;//求各位数字}void chaihou()//将后边各位数字拆开函数{bai=counthou/100;//求百位数字shi=counthou%100/10;//求十位数字ge=counthou%10;//求各位数字}void chaijiejia()//将相加结果各位数字拆开函数{qian=(countqian+counthou)/1000;//求千位数字bai=(countqian+counthou)%1000/100;//求百位数字shi=(countqian+counthou)%100/10;//求十位数字ge=(countqian+counthou)%10;//求各位数字}void chaijiejian()//将相减结果各位数字拆开函数{qian=(countqian-counthou)/1000;//求千位数字bai=(countqian-counthou)%1000/100;//求百位数字shi=(countqian-counthou)%100/10;//求十位数字ge=(countqian-counthou)%10;//求各位数字}void chaijiecheng()//将相乘结果各位数字拆开函数{qian=(countqian*counthou)/1000;//求千位数字bai=(countqian*counthou)%1000/100;//求百位数字shi=(countqian*counthou)%100/10;//求十位数字ge=(countqian*counthou)%10;//求各位数字}void chaijiechu()//将相除结果各位数字拆开函数(只取了模值){qian=(countqian/counthou)/1000;//求千位数字bai=(countqian/counthou)%1000/100;//求百位数字shi=(countqian/counthou)%100/10;//求十位数字ge=(countqian/counthou)%10;//求各位数字}void xianshiqian()//显示前边数字{write_command(0x80);//设置显示地址为LCD第一行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移write_date(table1[bai]);//第一位显示百位write_date(table1[shi]); //第二位显示十位write_date(table1[ge]); //第三位显示个位fuhao();//显示运算号delay(50);//改变数值可以修改数字滚动的速度}void xianshihou()//显示后边数字{write_command(0x80+4);//设置显示地址为LCD第一行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移write_date(table1[bai]);//第一位显示百位write_date(table1[shi]); //第二位显示十位write_date(table1[ge]); //第三位显示个位//delay(50);//改变数值可以修改数字滚动的速度}void xianshijie()//显示结果{write_command(0xc0);//设置显示地址为LCD第二行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移write_date(table1[qian]);//第一位显示千位write_date(table1[bai]);//第二位显示百位write_date(table1[shi]); //第三位显示十位write_date(table1[ge]); //第四位显示个位//delay(50);//改变数值可以修改数字滚动的速度}void main()//主函数{init();//调用液晶初始化函数while(1){jiayiqian();//调用前边数字加1计数函数chaiqian();//调用将前边数字各位数字拆开函数xianshiqian();//显示前边数字jiayihou();//调用后边数字加1计数函数chaihou();//调用将后边数字各位数字拆开函数xianshihou();//显示后边数字if(deng==0)//控制显示结果的按键按下{if(a==1)//计算的是加法{chaijiejia();//将结果的各位数字拆分开xianshijie(); //显示结果}if(a==2)//计算的是减法{chaijiejian(); //将结果的各位数字拆分开xianshijie();//显示结果}if(a==3)//计算的是乘法{chaijiecheng();//将结果的各位数字拆分开xianshijie(); //显示结果}if(a==4) //计算的是除法{chaijiechu();//将结果的各位数字拆分开xianshijie(); //显示结果}}}}。
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:感谢大家的阅读,本文由我司收集整编。
LCD1602液晶密码锁C语言程序
case 2:kk++;
if(js<6)
{importcode[js]=2;
js++;
if(js==1)
{TR0=1;}
ecode=1;}
else
{ecode=0;}
break;
case 10: clear_lcd();
js=0;kk=0;
sbit psb=P2^3;
sbit ret=P2^5;
sbit gg=P3^7;
uchar importcode[]={0,0,0,0,0,0};
uchar i;
uchar kk;
uchar js;
uchar j;
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
ET0=1;
EA=1;
}
void main(void)
{
dscsh();
uchar ecode;
uchar bb;
uchar tcount,second;
uchar code key[]={0x77,0x7b,0x7d,0x7e,0xb7,0xbb,0xbd,0xbe,0xd7,0xdb,0xdd,0xde,0xe7,0xeb,0xed,0xee};
{importcode[js]=0;
js++;
if(js==1)
{TR0=1;}
display();}
break;
#include <reg52.h>
#include <intrins.h>
LCD1602-51单片机汇编程序.
1602汇编程序, 51单片机汇编程序,仅需修改引脚定义即可。
晶振大小 12M ,程序测试完全正确。
内部包含写数据、写命令(包括读忙和不读忙、初始化等子函数。
调用时先给 LCD_DAT赋值,给出需要写入的数据或命令,然后调用。
; 端口引脚定义区LCD_RS BIT P2.4 ;1602数据命令选择端口LCD_RW BIT P2.5 ;1602读写选择端口LCD_EN BIT P2.6 ;1602使能端口LCD_DATA EQU P0 ;1602数据端口; 变量声明区ALL_FLAG EQU 20H ; 标志位LCD_FLAG EQU ALL_FLAG.7 ;1602读忙标志位LCD_DAT EQU 30H ;1602数据命令字DELAYED EQU 31H ; 延时字/*****************************************1602读命令函数,高位存至 LCD_LAG中*****************************************/LCD_R_DATA:MOV LCD_DATA,#0FFHLCD_BUSY: CLR LCD_RSSETB L CD_RWNOPSETB L CD_ENNOPMOV Acc,LCD_DATAMOV C,Acc.7MOV LCD_FLAG,CCLR LCD_ENNOPJB LCD_FLAG,LCD_BUSYRET/***************************************** 1602写数据函数,数据存在 LCD_DAT*****************************************/ LCD_W_DATA:LCALL LCD_R_DATASETB L CD_RSCLR LCD_RWNOPMOV LCD_DATA,LCD_DATSETB L CD_ENNOPCLR LCD_ENRET/***************************************** 1602写命令函数,命令存在LCD_DAT,检测忙信号 *****************************************/LCD_W_CMD:LCALL LCD_R_DATACLR LCD_RSCLR LCD_RWNOPMOV LCD_DATA,LCD_DAT SETB L CD_ENNOPCLR LCD_ENRET/***************************************** 1602写命令函数,命令存在LCD_DAT,不检测忙信号 *****************************************/ LCD_CMD:CLR LCD_RSCLR LCD_RWNOPMOV LCD_DATA,LCD_DAT SETB L CD_ENNOPCLR LCD_ENRET/***************************************** 1602初始化函数*****************************************/ LCD_INIT: MOV DELAYED,#30LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD_CMDMOV DELAYED,#10LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD_CMDMOV DELAYED,#10LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD_CMDMOV DELAYED,#10LCALL DELAY_MSMOV LCD_DAT,#038HLCALL LCD_W_CMDMOV LCD_DAT,#08HLCALL LCD_W_CMDMOV LCD_DAT,#01HLCALL LCD_W_CMDMOV LCD_DAT,#06HLCALL LCD_W_CMDMOV LCD_DAT,#0CHLCALL LCD_W_CMDRET/*****************************************延时函数,延时时间为 DELAYED*0.5毫秒 0~100毫秒的延时*****************************************/DELAY_MS:MOV R7,DELAYEDD1: MOV R6,#0F8HD2: DJNZ R6,D2DJNZ R7,D1RET/*****************************************延时函数,延时时间为 DELAYED*2微秒 0~500微秒的延时*****************************************/DELAY_US:MOV R7,ADU1:DJNZ R7,DU1RET。
51单片机常用头文件(LCD1602)
自制51单片机常用头文件(LCD1602)C51 2008-09-24 20:11:05 阅读946 评论0 字号:大中小订阅/*--------------------------------------------------------------------------LCD1602.HThe user function is C51.Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun All rights reserved.--------------------------------------------------------------------------*/#ifndef __LCD1602_H__#define __LCD1602_H__/*连接线图:---------------------------------------------------| LCM-----51 | LCM-----51 | LCM------51 || ----------------------------------------------- || DB0-----P0.0 | DB4-----P0.4 | RS-------P2.0 || DB1-----P0.1 | DB5-----P0.5 | RW-------P2.1 || DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 || DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND |---------------------------------------------------*//****************** LCD1602指令 ***********************************///输入方式设置#define LCD_AC_AUTO_INCREMENT 0x06 // 数据读、写操作后,AC自动增一#define LCD_AC_AUTO_DECREASE 0x04 // 数据读、写操作后,AC自动减一#define LCD_MOVE_ENABLE 0x05 // 数据读、写操作,画面平移#define LCD_MOVE_DISENABLE 0x04 // 数据读、写操作,画面不动#define LCD_GO_HOME 0x02 // AC=0,光标、画面回HOME位//设置显示、光标及闪烁开、关#define LCD_DISPLAY_ON 0x0C // 显示开#define LCD_DISPLAY_OFF 0x08 // 显示关#define LCD_CURSOR_ON 0x0A // 光标显示#define LCD_CURSOR_OFF 0x08 // 光标不显示#define LCD_CURSOR_BLINK_ON 0x09 // 光标闪烁#define LCD_CURSOR_BLINK_OFF 0x08 // 光标不闪烁//光标、画面移动,不影响DDRAM#define LCD_LEFT_MOVE 0x18 // LCD显示左移一位#define LCD_RIGHT_MOVE 0x1C // LCD显示右移一位#define LCD_CURSOR_LEFT_MOVE 0x10 // 光标左移一位#define LCD_CURSOR_RIGHT_MOVE 0x14 // 光标右移一位//工作方式设置#define LCD_DISPLAY_DOUBLE_LINE 0x38 // 两行显示#define LCD_DISPLAY_SINGLE_LINE 0x30 // 单行显示#define LCD_CLEAR_SCREEN 0x01 // 清屏/***********************LCD1602地址相关******************************/#define LINE1_HEAD 0x80 // 第一行DDRAM起始地址#define LINE2_HEAD 0xc0 // 第二行DDRAM起始地址#define LINE1 0 // 第一行#define LINE2 1 // 第二行#define LINE_LENGTH 8 // 每行的最大字符长度/***********************LCD1602接线引脚定义**************************/#define LCM_RS P2_0 // 数据/命令选择信号#define LCM_RW P2_1 // 读/写选择信号#define LCM_E P2_2 // 使能信号#define LCM_Data P0 // 显示数据端口#define Busy 0x80 // 用于检测LCM状态字中的Busy标识#define uchar unsigned char#define uint unsigned int//================================ LCM1602控制部分========================================================= /*****************************************************函数名:void Delay_LCD(void)功能:5ms延时说明:LCD显示延时入口参数:无返回值:无*****************************************************/ void Delay_LCD(void){uint TempCyc = 5552; // 放入延时数据while(TempCyc--){;}/*****************************************************函数名:uchar ReadStatusLCM()功能:读忙状态说明:判断LCM的工作状态;也可以不用此函数,用一段延时程序代替入口参数:无返回值:LCM_Data*****************************************************///读状态uchar ReadStatusLCM(void){LCM_Data = 0xFF; // LCM数据口先置1LCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;while (LCM_Data & Busy) // 检测忙信号.如果忙,则不执行{}return (LCM_Data); // 不忙返回读取数据}/***************************************************** 函数名:void WriteDataLCM()功能:向LCM1602中写入数据说明:将形参WDLCM中的数据写入LCM中入口参数:WDLCM返回值:无*****************************************************/ //写数据void WriteDataLCM(uchar WDLCM){ReadStatusLCM(); // 检测忙LCM_Data = WDLCM; // 写入数据到LCMLCM_RS = 1;LCM_RW = 0;LCM_E = 0; // 若晶振速度太高可以在这后加小的延时 LCM_E = 0; // 延时}/*****************************************************函数名:void WriteCommandLCM()功能:向LCM1602中写入指令说明:向LCM中写入指令;如果BuysC=0时,忽略忙检测,如果BuysC=1时,不忽略忙检测入口参数:WCLCM,BuysC返回值:无*****************************************************///写指令void WriteCommandLCM(uchar WCLCM,BuysC) // BuysC为0时忽略忙检测{if (BuysC){ReadStatusLCM(); // 根据需要检测忙}LCM_Data = WCLCM; // 写入指令LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 1;}/*****************************************************函数名:void LCMInit()功能:初始化LCM1602说明:LCM在工作前先要对显示屏初始化,否则模块无法正常工作入口参数:无返回值:无*****************************************************///LCM初始化void LCMInit(void){LCM_Data = 0;WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0); // 三次显示模式设置,不检测忙信号Delay_LCD();WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0); // 0x38指令表示:8位数据显示模式,俩行多显示Delay_LCD();WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0);Delay_LCD();WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,1); // 显示模式设置,开始要求每次检测忙信号WriteCommandLCM(LCD_DISPLAY_OFF,1); // 关闭显示WriteCommandLCM(LCD_CLEAR_SCREEN,1); // 显示清屏WriteCommandLCM(LCD_AC_AUTO_INCREMENT,1); // 显示光标移动设置WriteCommandLCM(LCD_DISPLAY_ON,1); // 显示开及光标设置}/*****************************************************函数名:void DisplayOneChar()功能:按指定坐标中写入数据说明:X-横坐标,Y-纵坐标,DData为ASCII值入口参数:X,Y,DData返回值:无*****************************************************///按指定位置显示一个字符void DisplayOneChar(uchar X, uchar Y, uchar DData){Y &= 0x01;X &= 0x0F; // 限制X不能大于15,Y不能大于1 if (Y){X |= LINE2_HEAD; // 当要显示第二行时地址码:0xc0}X |= LINE1_HEAD; // 第一行的地址码:0x80WriteCommandLCM(X, 0); // 这里不检测忙信号,发送地址码WriteDataLCM(DData);}/*在LCD1602中使用此函数,在DIPS082中使用下面的函数/*****************************************************函数名:void DisplayListChar(uchar x,uchar y,uchar *DData) 功能:向指定坐标中写入字符串(在LCD1602中使用此函数) 说明:X-横坐标,Y-纵坐标入口参数:X,Y,*DData返回值:无*****************************************************//按指定位置显示字符串void DisplayListChar(uchar x,uchar y,uchar *DData){if (y == LINE1) // 判断是否写入第1行{if (x < LINE_LENGTH) // 写入位数{WriteCommandLCM(LINE1_HEAD+x,0); // 写入第1行地址for (; x<LINE_LENGTH&&*DData!='\0'; x++){WriteDataLCM(*(DData++)); // 写入数据}if(*DData != '\0') // 判断数据是否写完{x = 0; // 没写完写入第2行y = LINE2;}}}if (y == LINE2) // 判断是否写入第2行{WriteCommandLCM(LINE2_HEAD+x,0); // 写入第2行地址for (; x<LINE_LENGTH&&*DData!='\0'; x++) // 判断数据是否写完{WriteDataLCM(*(DData++)); // 写入数据}}}*//*****************************************************函数名:void DisplayListChar(uchar X, uchar Y, uchar code *DData)功能:向指定坐标中写入字符串(在DIPS082中使用此的函数) 说明:X-横坐标,Y-纵坐标入口参数:X,Y,*DData返回值:无*****************************************************///按指定位置显示一串字符 ***原来的遇到空格0x20就不显示***void DisplayListChar(uchar X, uchar Y, uchar code *DData) {uchar ListLength,j;ListLength = strlen(DData); // strlen:读取字符串的长度Y &= 0x1;X &= 0xF; // 限制X不能大于15,Y不能大于1if (X <= 0x0F) // X坐标应小于0xF{for(j=0; j<ListLength; j++){DisplayOneChar(X, Y, DData[j]); // 显示单个字符X++; // 横坐标加1,纵坐标不变}}}/***************************************************** 函数名:void Mychar()功能:自定义字符--CGRAM说明:LCM1602字符库中没有温度符号,自定义温度符号入口参数:无返回值:无/*****************************************************/ void Mychar(void){//---------自定义字符代码--00H------闹铃符号------------- WriteCommandLCM(0x40,1); //第1行WriteDataLCM(0x01);//WriteCommandLCM(0x41,1); //第2行WriteDataLCM(0x1b);//WriteCommandLCM(0x42,1); //第3行WriteDataLCM(0x1d);//WriteCommandLCM(0x43,1); //第4行WriteDataLCM(0x19);//WriteCommandLCM(0x44,1); //第5行WriteDataLCM(0x1d);//WriteCommandLCM(0x45,1); //第6行WriteDataLCM(0x1b);//WriteCommandLCM(0x46,1); //第7行WriteDataLCM(0x01);//WriteCommandLCM(0x47,1); //第8行WriteDataLCM(0x00);////---------自定义字符代码--01H-------温度符号------------ WriteCommandLCM(0x48,1); //第1行WriteDataLCM(0x02);//WriteCommandLCM(0x49,1); //第2行WriteDataLCM(0x05);//WriteCommandLCM(0x4a,1); //第3行 1------**--WriteDataLCM(0x05);// 2----**--**WriteCommandLCM(0x4b,1); //第4行 3----**--**WriteDataLCM(0x02);// 4------**--WriteCommandLCM(0x4c,1); //第5行 5----------WriteDataLCM(0x00);// 6----------WriteCommandLCM(0x4d,1); //第6行 7----------WriteDataLCM(0x00);// 8----------WriteCommandLCM(0x4e,1); //第7行WriteDataLCM(0x00);//WriteCommandLCM(0x4f,1); //第8行WriteDataLCM(0x00);////---------自定义字符代码--02H-------当前时间------------WriteCommandLCM(0x50,1); //第1行WriteDataLCM(0x1f);//WriteCommandLCM(0x51,1); //第2行WriteDataLCM(0x11);//WriteCommandLCM(0x52,1); //第3行WriteDataLCM(0x15);//WriteCommandLCM(0x53,1); //第4行WriteDataLCM(0x11);//WriteCommandLCM(0x54,1); //第5行WriteDataLCM(0x1b);//WriteCommandLCM(0x55,1); //第6行WriteDataLCM(0x0a);//WriteCommandLCM(0x56,1); //第7行WriteDataLCM(0x1f);//WriteCommandLCM(0x57,1); //第8行WriteDataLCM(0x00);////----------------------------------------------- }#endif。
我的51单片机之 液晶1602 的C语言和汇编编程
//三次显示模式设置,不检测忙信号
//显示模式设置,开始要求每次检测忙信号 //关闭显示 //显示清屏 // 显示光标移动设置 // 显示开及光标设置
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
#include<reg51.h>
#include<intrins.h>
#define DBPort P1 //液晶数据口
sbit RW=P0^1; //寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器
sbit RS=P0^0; //读写信号线,高电平时进行读操作,低电平时进行写操作。
sbit E=P0^2;
void main(void) {
Delay400Ms(); Init(); //LCM 初始化 DisplayListChar(0, 1, uctech); DisplayListChar(0, 0, net); while(1); }
//第二行第一列开始 //第一行第一列开始
//写数据 void WriteData(unsigned char WD) {
ReadStatus(); //检测忙 DBPort = WD; RS = 1; RW = 0; E = 0; //可加小延时 delay(); E = 1; }
//写指令 void WriteCommand(unsigned char WC,BuysC) {
if (BuysC) ReadStatus(); DBPort = WC; RS = 0; RW = 0; E = 0; E = 1; }
LCD1602液晶秒表C51程序
LCD1602液晶秒表C51程序此程序是基于51hei单片机开发板上面写的,如需要移植到自己的电路上,修改相应的端口即可,开发板完整的电路图下载: 点这里(注意:只需要看1602部分即可,其他部分可以忽略)/*************************************************** *********************** @file main.c* @author xr* @date 2014年5月8日22:11:33 -- 2014年5月9日12:03:49* @version V1.2.3* @brief LCD1602液晶跑表单片机STC89C52RC MCU 晶振 11.0592MHZ************************************************* ***********************/#include ;/* 系统时钟 */#define SYS_XTAL (11059200UL/12)/* 定时器T0重载值 */unsigned char thr0, tlr0;unsigned char thr1, tlr1;/* 跑表计数 */unsigned char timer[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; //分别表示跑表的各个位上的数字bit flag10ms = 0;extern bit stopflag;//跑表走停标志位extern void InitalLCD1602();extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char * str);extern void KeyDriver();extern void KeyScan();void DisplayTimer();void ConfigTimer0(unsigned int xms);void ConfigTimer1(unsigned int xms);/* 主函数main() */void main(void){ConfigTimer0(10); //定时10msConfigTimer1(1);InitalLCD1602();LcdShowStr(0, 0, "stopwatch");LcdShowStr(2, 1, "0000000.00s"); //液晶初始化显示LcdShowStr(10, 0, "stop!");while (1){KeyDriver();DisplayTimer();if ((flag10ms == 1) && (stopflag == 1)){flag10ms = 0;timer[0]++;if (timer[0] >; 9){timer[0] = 0;timer[1]++;if (timer[1] >; 9){timer[1] = 0;timer[2]++;if (timer[2] >; 9) {timer[2] = 0;timer[3]++;if (timer[3] >; 9) {timer[3] = 0;timer[4]++;if (timer[4] >; 9) {timer[4] = 0;timer[5]++;if (timer[5] >; 9) {timer[5] = 0;timer[6]++;if (timer[6] >; 9) {timer[6] = 0;timer[7]++;if (timer[7] >; 9){timer[7] = 0;timer[8]++;if (timer[8] >; 9){timer[8] = 0;}}}}}}}}}}}}/* 将跑表时间显示到液晶上 */ void DisplayTimer(){unsigned char str[20];/* 分解timer */str[0] = timer[8] + '0';str[1] = timer[7] + '0';str[2] = timer[6] + '0';str[3] = timer[5] + '0';str[4] = timer[4] + '0';str[5] = timer[3] + '0';str[6] = timer[2] + '0';str[7] = '.';str[8] = timer[1] + '0';str[9] = timer[0] + '0';str[10] = '\0';LcdShowStr(2, 1, str);}/* 定时器T0配置 */void ConfigTimer0(unsigned int xms) {unsigned long tmp;tmp = (SYS_XTAL * xms) / 1000;tmp = 65536-tmp + 18;thr0 = (unsigned char)(tmp >;>; 8) ; tlr0 = (unsigned char)tmp;TMOD &= 0xF0; //清零T0控制位TMOD |= 0x01; //定时器方式1TH0 = thr0;TL0 = tlr0;TR0 = 1; //开启timer0ET0 = 1; //开启T0中断EA = 1; //开启总中断}/* 配置定时器T1 */void ConfigTimer1(unsigned int xms) {unsigned long tmp;tmp = (SYS_XTAL * xms) / 1000;tmp = 65536 - tmp + 18;thr1 = (unsigned char)(tmp >;>; 8); tlr1 = (unsigned char)tmp;TMOD &= 0x0F;TMOD |= 0x10;TH1 = thr1;TL1 = tlr1;TR1 = 1;ET1 = 1;EA = 1;}/* 定时器T0中断服务 */void Timer0_ISP() interrupt 1{TH0 = thr0;TL0 = tlr0;flag10ms = 1; //定时10ms}/* 定时器T1中断服务 */void Timer1_ISP() interrupt 3{TH1 = thr1;TL1 = tlr1; //定时1msKeyScan();}/*************************************************** *********************** @file Lcd1602.c* @author xr* @date 2014年5月7日13:33:17* @version V1.2.3* @brief LCD1602液晶底层驱动************************************************* ***********************/#include ;//LCD1602_IOsbit LCD1602_RS = P1^0;sbit LCD1602_RW = P1^1;sbit LCD1602_EN = P1^5;#define LCD1602_DB P0/* 液晶忙碌等待 */void LCD1602Wait(){unsigned char sta;LCD1602_DB = 0xFF;//总线拉高,检测液晶状态字LCD1602_RS = 0;LCD1602_RW = 1;do{LCD1602_EN = 1;sta = LCD1602_DB;LCD1602_EN = 0;//避免液晶输出数据} while (sta & 0x80);//状态字最高位STA7 == 0空闲,1忙碌}/* 液晶写命令 */void LCD1602WriteCmd(unsigned char cmd){LCD1602Wait();LCD1602_RS = 0;LCD1602_RW = 0;LCD1602_EN = 0;LCD1602_DB = cmd;LCD1602_EN = 1;LCD1602_EN = 0;}/* 液晶写数据 */void LCD1602WriteData(unsigned char dat){LCD1602Wait();LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_EN = 0;LCD1602_DB = dat;LCD1602_EN = 1;LCD1602_EN = 0;}/* 液晶初始化 */void InitalLCD1602(){LCD1602WriteCmd(0x38);LCD1602WriteCmd(0x0C);LCD1602WriteCmd(0x06);LCD1602WriteCmd(0x01);//清屏}/* 写数据到液晶上,字符串str,坐标(x, y),地址addr */void LcdShowStr(unsigned char x, unsigned char y, unsigned char * str){unsigned char addr;if (y == 0){addr = 0x00 + x;}else{addr = 0x40 + x;}LCD1602WriteCmd(addr | 0x80);while (*str != '\0'){LCD1602WriteData(*str++);}}/*************************************************** *********************** @file keyboard.c* @author xr* @date 2014年5月8日22:11:33 -- 2014年5月9日12:03:49* @version V1.2.3* @brief 按键驱动单片机STC89C52RC MCU 晶振11.0592MHZ************************************************* ***********************/#include ;/* 按键输出输入端口定义 */sbit KEY_IN1 = P2^4;sbit KEY_IN2 = P2^5;sbit KEY_IN3 = P2^6;sbit KEY_IN4 = P2^7;sbit KEY_OUT1 = P2^3;sbit KEY_OUT2 = P2^2;sbit KEY_OUT3 = P2^1;sbit KEY_OUT4 = P2^0;extern unsigned char timer[9]; //分别表示跑表的各个位上的数字/* 按键当前状态 */unsigned char volatile keySta[4][4] = {{1, 1, 1, 1},{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}};/* 按键对应标准PC键盘编码 */const unsigned char code keyCodeMap[4][4] = {{'1', '2', '3', 0x26}, /* 数字键 1, 2, 3 和向上键 */{'4', '5', '6', 0x25}, /* 数字键 4, 5, 6 和向左键 */{'7', '8', '9', 0x28}, /* 数字键 7, 8, 9 和向下键 */{'0', 0x1B, 0x0D, 0x27} /* 数字键 0 和向右键*/};bit stopflag = 0;//跑表走停标志位 0 停止,1运行void KeyAction(unsigned char keycode);void LcdShowStr(unsigned char x, unsigned char y, unsigned char * str);/* 按键驱动函数 */void KeyDriver(){/* 上一次按键的备份值 */static unsigned char keybackup[4][4] = {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}};for (i = 0; i < 4; i++){for (j = 0; j < 4; j++){if (keySta[i][j] != keybackup[i][j]) //当前按键状态和上一次的按键状态不同{ //按键有动作if (keybackup[i][j] != 0) //上一次按键是弹起 {KeyAction(keyCodeMap[i][j]); //当前按键是想、按下}keybackup[i][j] = keySta[i][j]; //备份当前按键值}}}}/* 按键扫描函数 */void KeyScan(){static unsigned char keyout = 0;//按键行索引static unsigned char keybuf[4][4] = {{0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF},{0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF}};/* 按键消抖 */keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KEY_IN1;keybuf[keyout][1] = (keybuf[keyout][1] << 1) | KEY_IN2;keybuf[keyout][2] = (keybuf[keyout][2] << 1) | KEY_IN3;keybuf[keyout][3] = (keybuf[keyout][3] << 1) | KEY_IN4;/* 更新按键的值 */for (i = 0; i < 4; i++){if ((keybuf[keyout][i] & 0x1F) == 0x1F){//五次检测按键的值都是1keySta[keyout][i] = 1;}else if ((keybuf[keyout][i] & 0x1F) == 0x00) {//五次检测的按键值都是0keySta[keyout][i] = 0;}}/* 按键行索引++ */keyout++;keyout &= 0x03;//到4归零/* 根据按键索引选择行按键进行扫描 */switch (keyout){case 0: KEY_OUT1 = 0; KEY_OUT4 = 1;//选择第一行按键case 1: KEY_OUT2 = 0; KEY_OUT1 = 1;case 2: KEY_OUT3 = 0; KEY_OUT2 = 1;case 3: KEY_OUT4 = 0; KEY_OUT3 = 1;default: break;}}/* 按键动作函数 */void KeyAction(unsigned char keycode){unsigned char i = 0;if (keycode == 0x1B) //ESC{/* 跑表复位 */stopflag = 0;for (i = 0; i < 9; i++){timer[i] = 0;}LcdShowStr(2, 1, "0000000.00s"); LcdShowStr(10, 0, "reset!");}else if (keycode == 0x0D) //回车键跑表走停{if (stopflag == 0){stopflag = 1;LcdShowStr(10, 0, "start!");}else{stopflag = 0;LcdShowStr(10, 0, "stop! "); //多写入一个空格}}}。
51单片机实现LCD1602显示定时计数器(自己整理的)
每隔一分钟,蜂鸣器响一次,按键按一下,计数器清0。
从新开始、#include<>#include<>#define uchar unsigned char#define uint unsigned intsbit RS=P2^0;sbit RW=P2^1;sbit EN=P2^2;uchar code dis2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};uchar code p[]="-";//code 可以不加,加了之后就是固定了这个数组不能对其进行操作、、这个一定要注意。
uchar j,k,kk,miao,miao1,fen,fen1,shi,shi1;void delay_ms(int x)//延时程序,延时1ms{uint i;while(x--)for(i=0;i<120;i++);}uchar busy()//对LCD1602进行判断是否为忙{uchar status;RS=0;RW=1;EN=1;delay_ms(1);status=P1;EN=0;return status;}void write_cmd(uchar cmd)//写命令程序,首先对其进行判忙{while((busy()&0x80)==0x80);//对返回进行判断,如果为忙就进行等待RS=0;RW=0;EN=0;P1=cmd;EN=1;delay_ms(1);EN=0;}void write_data(uchar dat){while((busy()&0x80)==0x80);RS=1;RW=0;EN=0;P1=dat;EN=1;delay_ms(1);EN=0;}void canshu(){write_cmd(0x38);delay_ms(1);write_cmd(0x01);delay_ms(1);write_cmd(0x06);delay_ms(1);write_cmd(0x0c);delay_ms(1);}/*void xianshi(uchar x,uchar y,uchar *str){uint i=0;if(y==0)write_cmd(0x80|x);if(y==1)write_cmd(0xc0|x);for(i=0;i<16;i++){write_data(str[i]);if(p=='\0')break;}} */void aaa() interrupt 1{TH0=(65535-50000)/256;TL0=(65535-50000)%256;if(++kk==18){miao++;if(miao==10){if(miao1++==5){if(fen++==10){if(fen1++==5){if(shi++==10){if(shi1++==1){shi1=0;shi=0;}shi=0;}fen1=0;}fen=0;}miao1=0;}miao=0;}kk=0;}}void main(){canshu();//xianshi(0,0,p);//xianshi(0,1,p+16);EA=1;ET0=1;TMOD=0x01;TH0=(65535-50000)/256;//如果不准可对其进行修改,比如4000可能更准确TL0=(65535-50000)%256;TR0=1;while(1){write_cmd(0x80|1);write_data(dis2[shi]);write_cmd(0x80|2);write_data(dis2[shi1]);write_cmd(0x80|3);write_data(p[0]);write_cmd(0x80|4);write_data(dis2[fen1]);write_cmd(0x80|5);write_data(dis2[fen]);write_cmd(0x80|6);write_data(p[0]);write_cmd(0x80|7);write_data(dis2[miao]);write_cmd(0x80|8);write_data(dis2[miao1]);}}。
基于51单片机的lcd1602显示程序模块
这个是我自己编写的基于51单片机控制lcd602显示的库函数,请下载我的头文件,在网上本人还分享了很多热门模块的库函数,都是现成的,欢迎下载!!!!/************************************************************************1,先初始化1602:lcd_init();2,调整显示位置:lcd_pos(hang,lie);3,送显示:lcd_wdat(uchar dat);显示字符lcd_show(uchar dis[]);显示字符串4,清屏为:lcd_wcmd(0x01); //清除lcd内容delay12_ms(2);注:显示的时候必须传送对应的ASK码显示字符串的时候如果超过本行显示范围不会自动跳到第二行占用了P0和P25,P26,P27同时包含delay.c文件必须************************************************************************/#include"myconfig.h"#include"delay.h"#define LCD_RS P26 //1602的命令和数据选择端#define LCD_RW P25 //1602的读写控制端#define LCD_EP P27 //1602是能信号#define LCD_DATE P0 //1602的数据传输或命令端口/****************(外部不操作)测忙程序************************/uchar lcd_bz(){uchar result;LCD_RS =0;LCD_RW =1;LCD_EP =1;_nop_();_nop_();_nop_();_nop_();result =(P0 &0x80);LCD_EP =0;return result;//返回结果,1为忙,0位空闲}/****************(外部不操作)写命令函数************************/void lcd_wcmd(int cmd){while(lcd_bz());LCD_RS =0;LCD_RW =0;LCD_EP =0;_nop_();_nop_();LCD_DATE = cmd;_nop_();_nop_();_nop_();_nop_();LCD_EP =1;_nop_();_nop_();_nop_();_nop_();LCD_EP =0;}/****************设置显示位置************************/void lcd_pos(uchar hang, uchar lie){if(hang ==1)lcd_wcmd(0x80+ lie -1);elselcd_wcmd(0xc0+ lie -1);}/****************1602显示字符************************/void lcd_wdat(uchar dat){while(lcd_bz());LCD_RS =1;LCD_RW =0;LCD_EP =0;LCD_DATE = dat;_nop_();_nop_();_nop_();_nop_();LCD_EP =1;_nop_();_nop_();_nop_();_nop_();LCD_EP =0;}/****************1602显示字符串************************/void lcd_show(uchar dis[]){int i =0;while(dis[i]!='\0'){lcd_wdat(dis[i]);i++;}}/****************1602初始化程序(模式已经确定)************************/ void lcd_init(void){lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据delay12_ms(1);lcd_wcmd(0x0e);//显示开,关光标delay12_ms(1);lcd_wcmd(0x01);//清除lcd内容delay12_ms(1);lcd_wcmd(0x02);//光标回homedelay12_ms(1);}/************************************************************************ 1,先初始化1602:lcd_init();2,调整显示位置:lcd_pos(hang,lie);3,送显示:lcd_wdat(uchar dat);显示字符lcd_show(uchar dis[]);显示字符串4,清屏为:lcd_wcmd(0x01); //清除lcd内容delay12_ms(2);注:显示的时候必须传送对应的ASK码显示字符串的时候如果超过本行显示范围不会自动跳到第二行占用了P0和P25,P26,P27同时包含delay.c文件必须************************************************************************/ #ifndef__DISP_1602_H#define__DISP_1602_H#include"myconfig.h"/****************(外部不操作)测忙************************/uchar lcd_bz();/****************(外部不操作)写命令函数************************/void lcd_wcmd(int cmd);/****************设置显示位置************************/void lcd_pos(uchar hang, uchar lie);/****************1602显示字符************************/void lcd_wdat(uchar dat);/****************1602显示字符串************************/void lcd_show(uchar dis[]);/****************1602初始化程序(模式已经确定)************************/ void lcd_init(void);#endif。
跟我学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单片机的lcd1602液晶显示的计算器
基于51单片机的lcd 1602液晶显示的计算器/**************************************************************** 阿斌独家制作:计算器,1602液晶显示可计算10以下数加减乘除可连续运算,最大显示结果数值65536*****************************************************************/ 键盘设置:液晶初始显示:运算显示:主程序:#include<reg52.h>#include <intrins.h> #define uint unsigned int #define uchar unsigned char sbit lcden=P2^2;sbit lcdrw=P2^1;sbit lcdrs=P2^0;uchar num,temp,jia=0,jian=0,cheng=0,chu=0,qing=0;uint key,key1,shu;uchar fuhao,flag1,flag=0; uchar table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x0}; void delay(uint z) {uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--); }bit lcd_bz(){bit result;lcdrs=0;lcdrw=1;lcden=1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P0&0x80);lcden=0;return result; }void write_com(uchar com){while(lcd_bz());lcdrs=0;lcden=0;lcdrw=0;P0=com;delay(5);lcden=1;delay(5);lcden=0; }void write_date(uchar date) {while(lcd_bz());lcdrs=1;lcden=0;lcdrw=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void lcd_init() {lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01); }void keyscan() {P3=0xfe;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xee:key=1;num=0;break; case 0xde:key=2;num=0;break; case 0xbe:key=3;num=0;break; case 0x7e:num=1;break; //加号}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xed:key=4;num=0;break; case 0xdd:key=5;num=0;break; case 0xbd:key=6;num=0;break; case 0x7d:num=2;break; //减号}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xeb:key=7;num=0;break; case 0xdb:key=8;num=0;break; case 0xbb:key=9;num=0;break; case 0x7b:num=3;break; //乘号}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xf7;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xe7:key=0;num=0;break; case 0xd7:num=6;break; //清除case 0xb7:num=5;break; //等于号case 0x77:num=4;break; //除号}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}}void display0(uint shu) { uint ge;ge=shu;write_date(0x30+ge); } void display1(uint shu) { uint shi,ge;shi=shu/10;ge=shu%10;write_date(0x30+shi); write_date(0x30+ge); } void display2(uint shu) { uint bai,shi,ge;bai=shu/100;shi=shu%100/10;ge=shu%10;write_date(0x30+bai); write_date(0x30+shi); write_date(0x30+ge); } void display3(uint shu) {uint qian,bai,shi,ge;qian=shu/1000;bai=shu%1000/100;shi=shu%100/10;ge=shu%10;write_date(0x30+qian);write_date(0x30+bai);write_date(0x30+shi);write_date(0x30+ge); }void display4(uint shu) {uint wan,qian,bai,shi,ge;wan=shu/10000;qian=shu%10000/1000;bai=shu%1000/100;shi=shu%100/10;ge=shu%10;write_date(0x30+wan);write_date(0x30+qian);write_date(0x30+bai);write_date(0x30+shi);write_date(0x30+ge); }void display_key1(uint result) {if(flag1==1){write_com(0x01);flag1=0;}shu=result;write_com(0x80);if(result<10)display0(result);if(result>=10&&result<100) display1(result);if(result>=100&&result<1000) display2(result);if(result>=1000&&result<10000) display3(result);if(result>=10000)display4(result);}void dis_key(result){if(result<10)display0(result);if(result>=10&&result<100) display1(result);if(result>=100&&result<1000)display2(result);if(result>=1000&&result<10000) display3(result);if(result>=10000)display4(result);}void display_key(uint result) { if(shu<10){write_com(0x80+2);dis_key(result);}if(shu>=10&&shu<100){write_com(0x80+3);dis_key(result);}if(shu>=100&&shu<1000){write_com(0x80+4);dis_key(result);}if(shu>=1000&&shu<10000){write_com(0x80+5);dis_key(result);}if(shu>=10000){write_com(0x80+6);dis_key(result);}}void display_fuhao(){switch(fuhao){case 1: write_date(0x2b);break; case 2: write_date(0x2d);break; case 3: write_date(0x2a);break; case 4: write_date(0x2f);break; }fuhao=0;}void fuhao_pan(){if(flag1==1){flag1=0;write_com(0x01);write_com(0x80+1); display_fuhao();}if(shu<10)write_com(0x80+1);if(shu>=10&&shu<100) write_com(0x80+2);if(shu>=100&&shu<1000) write_com(0x80+3);if(shu>=1000&&shu<10000) write_com(0x80+4);if(shu>=10000)write_com(0x80+5); display_fuhao();flag=1;}void fuhao_deng(){write_com(0x80+0x40); write_date(0x3d);flag1=1;flag=0;}void display_result(uint result) {write_com(0x80+0x40+1);if(result<10)display0(result);if(result>=10&&result<100) display1(result);if(result>=100&&result<1000) display2(result);if(result>=1000&&result<10000) display3(result);if(result>=10000)display4(result); }void jia1(){jia=1;jian=cheng=chu=qing=0;key1=key;fuhao=1;fuhao_pan();}void jian1(){jian=1;jia=cheng=chu=qing=0; key1=key;fuhao=2;fuhao_pan(); }void cheng1() {cheng=1;jia=jian=chu=qing=0; key1=key;fuhao=3;fuhao_pan(); }void chu1() {chu=1;jia=jian=cheng=qing=0; key1=key;fuhao=4;fuhao_pan();}void qing1() {qing=1;jia=jian=cheng=chu=0; key1=key=0; }void deng1() {if(jia)key=key1+key;if(jian)key=key1-key;if(cheng)key=key1*key;if(chu)key=key1/key;fuhao_deng();display_result(key);jia=jian=cheng=chu=qing=0;}void deal(){switch(num){case 0:{switch(flag){case 0: display_key1(key);break; case 1: display_key(key);break; }} break;case 1: jia1();break;case 2: jian1();break; case 3: cheng1();break; case 4: chu1();break; case 5: deng1();break; case 6: qing1();break; }}void main(){lcd_init();while(1){keyscan();deal();}}。
51单片机经典C程序(1602)
unsigned char temp; Mcu_init(); while(1) { AT24C02_write(0x00,count[1]); temp=AT24C02_read(0x00); LCD_write_string(0x00,LINE1,"AT24C02 TEST"); LCD_write_char(0x0e,LINE1,(temp/10)|0x30); LCD_write_char(0x0f,LINE1,(temp%10)|0x30); LCD_write_string(0x00,LINE2,"TIMER0 JISHU"); LCD_write_char(0x0e,1,(count[1]/10)|0x30); LCD_write_char(0x0f,1,(count[1]%10)|0x30); AT24C02_write(0x00,count[1]); }
00阅读全文编辑at24c02语言驱动程序lcd160Байду номын сангаас显示zl0801发表于20058259
AT24C02 C语言驱动程序—LCD1602 显示
程序匠人 发表于 2006-4-5 22:31:00 阅读全文 | 回复(1) | 引用通告 AT24C02 C语言驱动程序—LCD1602 显示 -|zl0801 发表于 2005-8-25 9:21:00 //AT24C02 EEPROM drive program //for 51 mcu with lcd1602 as display //designed by zhaoliang //2005-6-14 21:02 #i nclude " reg51.h " #i nclude " intrins.h " /********************************************************************/ //lcd part #define LINE1 0 #define LINE2 1 #define LINE1_HEAD 0x80 #define LINE2_HEAD 0xC0 #define LCD_DELAY_TIME 40 #define DATA_MODE 0x38 #define OPEN_SCREEN 0x0C #define DISPLAY_ADDRESS 0x80 #define CLEARSCREEN LCD_en_command(0x01) //common part #define HIGH 1 #define LOW 0 #define TRUE 1 #define ZERO 0 //at24c02 part #define WRITE24C02 0xA0 #define READ24C02 0xA1 //I2C part #define ACK 0 #define NO_ACK 1 #define MSB 0x80 /********************************************************************/ //change this part at different board
51单片机控制LCD液晶1602源代码
void Lcd1602_Clear_All(void);
void Lcd1602_Demo1(void);
void Lcd1602_Demo2(void);
void Delay_ms(unsigned char second);
if(++row==3)
return;
else
{
switch(row)//这种结构保持以后升级到多行显示液晶
_nop_();
LCD_EN=HIGH ;
_nop_();
LCD_EN=LOW;
LCD_DATA_PORT=0xFF; //prevent port is 0.
}
//===========================
case 2:Lcd1602_Write_Command(0x80+0x40);break; //将数据地址指针定位到第二行
default: break;
}
}
//==================================================
{
while(1)
{
Lcd1602_Demo1();
// Lcd1602_Demo2();
}
}
void Lcd1602_Ini(void)
{
Delay_ms(20);
Lcd1602_Write_Command_Nocheck(0x38);//设定LCD为16*2显示,5*7点阵,8位数据接口
{
Lcd1602_Write_String(row,column," ");
LCD1602学习笔记(附带c语言例程)
LCD1602学习笔记一、LCD1602实体结构1.LCD1602液晶显示模块主要由LCD显示屏、控制器、列驱动器和偏压产生电路构成。
2.控制器主要由指令寄存器IR、数据寄存器DR、忙标志BF、地址计数器AC、显示数据缓冲区DDRAM、字符发生器CGROM、用户自定义字符发生器CGRAM以及时序发生电路组成。
3.忙标志位BF,当RS=0、RW=1、E=1,即进行读指令寄存器的操作时,BF输出到DB7。
每次操作之前最好先检测BF,只有在BF=0之后,MCU才可以访问模块。
4.地址计数器AC:AC是DDRAM或CGRAM的地址指针,(即哪个地址要显示字符)随着IR中指令码的写入,指令码中携带的地址信息自动送入AC中。
AC的内容为DB0~DB6。
5.DDRAM存储显示字符的字符码。
6.CGROM:字模存储器。
7.LCD为16字*2行。
基地址为0x80,第一行地址为0x00~0x0f,第二行地址为0x40 ~0x4f。
(例,第一行的第二个地址为0x80|0x01。
)8.显示过程:控制器通过数据总线DB0~DB7接收MCU发送来的指令和数据,存入指令寄存器IR和数据寄存器DR,模块自动从CGROM中找到欲显示字符的字符码,送入DDRAM,在LCD显示屏上与DDRAM存储单元对应的规定位置显示出该字符。
二、引脚及功能1.RS=0,选择指令寄存器;RS=1,选择数据寄存器。
2.RW=0,向LCD写入指令或数据;RW=1,从LCD读出信息。
3.E为使能信号,E=1,读信息;E=1——0(下降沿)写信息。
4.VL为液晶显示对比度调节接口。
5.BLA为背光源正极,BLK为背光源负极。
(有的LCD没有这两个引脚就不用接。
)接法如下,三、读写操作1.读时序如下图。
2.读时序程序代码uchar read_com(){uchar t=0;RS=0;RW=1;E=1;//在E为高电平期间,读出数据。
t=P0;E=0;return t;}3.写时序如下图4.写时序程序代码void write_com(uchar t) { P0=t;RS=0;//写入指令寄存器RW=0;E=1;E=0;}void write_data(uchar t) { P0=t;RS=1;//写入数据寄存器RW=0;E=1;E=0;}四、字符串流动显示程序及流程图void write_s(uchar t[]){uchar i=0,a=0;while(t[a]!='\0')//判断是否到字符串最后一位{i=a;write_com(0x80);//写首地址delay(2);while((i<=15+a)&&(t[i]!='\0'))//屏幕最多显示15+a个字符,加a是因为右移了a位;字符串最后一位是\0;若遇到以上两种情况,则跳出循环。
基于51单片机的液晶LCD1602显示程序源代码(带LCD1602液晶接口电路))
液晶LCD1602显示字符和数字程序源代码/***********************液晶LCD1602测试程序源代码*************************单片机型号:STC15W4K56S4,内部晶振:22.1184M。
功能:液晶LCD1602显示功能测试。
操作说明:液晶LCD1602显示字符和倒计时。
**************************************************************************/#include "stc15.h" //包含头文件stc15.h#include <intrins.h> //包含头文件intrins.h#define Busy 0x80 //LCD忙sbit LCD_D0 = P0^0; //LCD_D0对应P0.0sbit LCD_D1 = P0^1; //LCD_D1对应P0.1sbit LCD_D2 = P0^2; //LCD_D2对应P0.2sbit LCD_D3 = P0^3; //LCD_D3对应P0.3sbit LCD_D4 = P0^4; //LCD_D4对应P0.4sbit LCD_D5 = P0^5; //LCD_D5对应P0.5sbit LCD_D6 = P0^6; //LCD_D6对应P0.6sbit LCD_D7 = P0^7; //LCD_D7对应P0.7sbit LCD_RS = P1^0; //LCD_RS对应P1.0sbit LCD_RW = P1^1; //LCD_RW对应P1.1sbit LCD_EN = P3^4; //LCD_EN对应P3.4void delay(unsigned int t); //delay延时函数void delay_us(unsigned int t); //delay_us延时函数void delay_ms(unsigned int t); //delay_ms延时函数void Delay5Ms(void); //5Ms延时函数void GPIO_1602_Configuration(void); //LCD1602液晶IO口初始化void WriteDataLCD(unsigned char WDLCD); //LCD写数据函数void WriteCommandLCD(unsigned char WCLCD,BuysC); //LCD写命令函数unsigned char ReadDataLCD(void); //LCD读数据函数unsigned char ReadStatusLCD(void); //LCD读状态函数void LCDInit(void); //LCD初始化void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);//LCD显示一个字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);//LCD显示一个字符串unsigned char code welcome[] = {"Hello My Friends"};//液晶LCD1602显示Hello My Friendsunsigned char code countdown[] = {"CountDown: S"};//液晶LCD1602显示CountDown: Svoid delay(unsigned int t) //delay延时函数{while(t--);}void delay_us(unsigned int t) //delay_us延时函数{unsigned char i;while(t--){i=3;while(i--)delay(1);}}void delay_ms(unsigned int t) //delay_ms延时函数{while(t--){delay_us(t);}}void Delay5Ms(void) //5ms延时函数{unsigned int TempCyc = 3552;while(TempCyc--);}void GPIO_1602_Configuration(void) //LCD1602液晶IO口初始化{P0M1 = P3M1&0x00;P0M0 = P3M0&0x00;P1M1 = P3M1&0xfc;P1M0 = P3M0&0xfc;P3M1 = P4M1&0xef;P3M0 = P4M0&0xef;}unsigned char ReadStatusLCD(void) //测试LCD忙碌状态{LCD_D7 = 1; //LCD的D7置1LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 1; //LCD管脚RW设置成高电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 1; //LCD管脚E设置成高电平while(LCD_D7); //检测忙信号return(Busy); //表示当前忙}void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if(BuysC) ReadStatusLCD(); //根据需要检测忙LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 0; //LCD管脚RW设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时P0 = WCLCD; //将数据送入P0口,即写入指令或地址_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void WriteDataLCD(unsigned char WDLCD) //LCD写数据函数{ReadStatusLCD(); //读取LCD状态LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 1; //LCD管脚RS设置成高电平LCD_RW = 0; //LCD管脚RW设置成低电平P0 = WDLCD;//将数据送入P0口,即将数据写入液晶模块_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void LCDInit(void) //LCD初始化{WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); //显示光标移动设置WriteCommandLCD(0x0C,1); //显示开及光标设置}void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCD(X,0); //这里不检测忙信号,发送地址码WriteDataLCD(DData); //发送数据}void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData){unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>=0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}void main(void){GPIO_1602_Configuration(); //LCD1602液晶IO口初始化delay_ms(10); //延时LCDInit(); //LCD1602初始化delay_ms(10); //延时DisplayListChar(0,0,welcome); //LCD1602显示Hello My Friends delay_ms(10); //延时DisplayListChar(0,1,countdown); //LCD1602显示CountDown: S delay_ms(10); //延时DisplayOneChar(14,1,0x39); //LCD1602显示9delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x38); //LCD1602显示8delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x37); //LCD1602显示7delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x36); //LCD1602显示6delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x35); //LCD1602显示5delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x34); //LCD1602显示4delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x33); //LCD1602显示3delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x32); //LCD1602显示2delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x31); //LCD1602显示1delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x30); //LCD1602显示0delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时while(1){;}}程序源代码是编译通过并在电路板上测试过参考液晶LCD1602接口电路图该程序的实际运行效果。
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)没有定义。
c51单片机lcd1602程序调试
c51单片机lcd1602程序调试c51单片机 lcd1602 程序调试#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define lcdio P1sbit lcdrs=P0^0; //数据,指令选择端口sbit lcdea=P0^1; //使能端,此时第五管脚rw选择端直接接地,因为只写入不用读取uchar num;uchar code table[]="i like mcu!" ; //要写入的数据uchar code table1[]="i am hao123" ;void lcddelay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--) ;}void lcdwrite_com(uchar com) //写指令{lcdio=com; //指令写入lcdrs=0; //写命令lcdea=1; //开启使能端lcdea=0; //关闭使能lcddelay(5) ;}void lcdwrite_data(uchar da) //写数据{lcdio=da; //写入数据lcdrs=1; //数据写入lcdea=1;lcdea=0;lcddelay(5);}void lcdshuru(uchar add,uchar date) //时间改变函数{uchar date1,date2;lcdwrite_com(0x80+add);date1=date/10;date2=date;lcdwrite_data(0x30+date1);lcdwrite_data(0x30+date2);}void lcdinit(){lcddelay(5);lcdwrite_com(0x38); // 显示模式设置,设置为16*2显示 8位格式两行lcdwrite_com(0x0f); // 整天显示关光标不闪烁lcdwrite_com(0x06); // 设定输入方式增量不移位lcdwrite_com(0x01); // 清除屏幕显示lcdwrite_com(0x0c); //光标不闪烁lcdwrite_com(0x80);}void main(){lcdinit();// lcdshuru(8,56) ;for(num=0;num<11;num++){lcdwrite_data(table[num]);lcddelay(50);}lcdwrite_com(0x80+0x40);for(num=0;num<11;num++){lcdwrite_data(table1[num]);}// lcdwrite_data('1'); while(1);}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LCDIO=dat;
LCD1602_RS=HIGH;
LCD1602_RW=LOW;
LCD1602_EN=LOW;
LCD_delay();
LCD1602_EN=HIGH;
}
void LCD_set_xy( uchar x, uchar y )
{
uchar address;
#define HIGH 1
#define LOW 0
#define TRUE 1
#define FALSE 0
#define ZERO 0
#define MSB 0x80
#define LSB 0x01
//液晶
void LCD_delay(void);//lcd delay function
LCD_en_command(DATA_MODE);//set 8 bit data transmission mode
LCD_en_command(OPEN_SCREEN);//open display (enable lcd display)
LCD_en_command(DISPLAY_ADDRESS);//set lcd first display address
if (y == LINE1)
address = LINE1_HEAD + x;
else
address = LINE2_HEAD + x;
LCD_en_command(address);
}
/*显示一个字符,参数x,y为坐标,参数dat为要显示的字符*/
void LCD_write_char( unsigned x,uchar y,uchar dat)
{
LCD_set_xy( x, y );
LCD_en_dat(dat);
}
/*显示字符串,参数X,Y为坐标,参数*s为要显示的字符串*/
void LCD_write_string(uchar X,uchar Y,uchar *s)
{
LCD_set_xy( X, Y ); //set address
LCD_write_char(x+2,y,asc);
}
void clear()
{
LCD_en_command(0x01);
delay1ms(2);
}
/********************************************************************/
;
}
void LCD_en_command(uchar command)
{
LCDIO=command;
LCD1602_RS=LOW;
LCD1602_RW=LOW;
LCD1602_EN=LOW;
LCD_delay();
LCD1602_EN=HIGH;
}
void LCD_en_dat(uchar dat)
while (*s) // write character
{
LCDIO=*s;
LCD_en_dat(*s);
s ++;
}
}
/*显示一个数字*/
void LCD_write_num(uchar x,uchar y,uint num)
{
uchar wei[3],asc;
void LCD_en_command(uchar command);//write command function
void LCD_en_dat(uchar temp);//write data function
void LCD_set_xy( uchar x, uchar y );//set display address function
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
/*LCD 相关*/
#define LINE1 0
#define LINE2 1
#define LINE1_HEAD 0x80
/***************************************************************************************************/
void LCD_delay(void)
{
uchar i;
for(i=LCD_DELAY_TIME;i>ZERO;i--)//be sure lcd reset
#define LINE2_HEAD 0xC0
#define LCD_DELAY_TIME 40
#define DATA_MODE 0x38
#define OPEN_SCREEN 0x0C
#define DISPLAY_ADDRESS 0x80
#define CLEARSCREEN clear()
void LCD_write_char( unsigned x,uchar y,uchar dat);//write lcd a character function
void LCD_write_string(uchar X,uchar Y,uchar *s);//write lcd string function
void LCD_init(void);//lcd initize function
void LCD_write_num(uchar x,uchar y,uint num);
void clear();
/*初始化LCD*/
void init_LCD(void)
{
CLEARSCREEN;//clear screen
CLEARSCREEN;//clear screen
}
/**************************************************************************************************/
/********************LCD1602相关函数****************************************************************/
wei[0]=num%10;
wei[2]=num/100;
wei[1]=num/10-wei[2]*10;
asc=wei[2]+48;
LCD_write_char(x,y,asc);
asc=wei[1]+48;
LCD_write_char(x+1,y,asc);
asc=wei[0]+48;