51单片机经典C程序(1602)
基于51单片机的1602液晶显示温度和时间的C程序
//液晶显示温度#include "AT89X52.H"#define Ddata P0sbit RS=P2^7; //命令数据控制端sbit RW=P2^6; //读写选择端sbit LCDE=P2^5; //液晶使能端sbit DQ=P2^0; //ds18b20与单片机连接口#define uchar unsigned char#define uint unsigned intunsigned char hour=0,min=0,sec=0; //定义初值unsigned int count=0;unsigned char line1[16]={" temp: "}; //16个字符unsigned char line2[16]={" time: 00:00:00"}; //16个字符unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组uchar data disdata[5];uint tvalue; //温度值uchar tflag; //温度正负标志void time();/*************************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<110;j++);}void delay5ms()//延时5毫秒(不够精确的){unsigned int i;for (i=0;i<1000;i++);}void delay50us(){register int i;for (i=0;i<20;i++);}void delay(){unsigned char m,n;for(m=255;m>0;m--)for(n=255;n>0;n--);}void wr_com(unsigned char comm) //********写控制字符程序E=1 RS=0RW=0 **********//{LCDE=0; //使能端RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
基于51单片机的1602液晶时钟设计的C程序(闰年补偿,月份调整)
#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]=" 2012-02-29 MON";uchar code table1[]=" 23:59:55";uchar num,count,shi,fen,miao,nian,yue,ri,xingqi,s1num,flag; sbit lcden=P2^5;sbit lcdrs=P1^0;sbit lcdrw=P1^1;sbit s1=P3^0;sbit s2=P3^1;sbit s3=P3^2;sbit s4=P3^3;sbit feng=P2^3;/***************延迟函数***************/void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/**********写命令***************/void write_com(uchar com){lcdrs=0;lcdrw=0;P0=com;lcden=1;delay(5);lcden=0;}/**************写数据****************/void write_data(uchar date){lcdrs=1;lcdrw=0;P0=date;lcden=1;delay(5);lcden=0;}/*************时分秒调节函数********************/void write_sfm(uchar add,uchar date){uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_data(0x30+shi);write_data(0x30+ge);}/****************年月日调节函数***************/void write_nyr(uchar ad,uchar dat){uchar shi,ge;shi=dat/10;ge=dat%10;write_com(0x80+0x00+ad);write_data(0x30+shi);write_data(0x30+ge);}/**************************星期显示函数*****************/void display_week(){switch (xingqi){case 1: write_data('M');write_data('O');write_data('N');write_com(0x80+0x00+14);break;case 2: write_data('T');write_data('U');write_data('E');write_com(0x80+0x00+14);break;case 3: write_data('W');write_data('E');write_data('D');write_com(0x80+0x00+14);break;case 4: write_data('T');write_data('H');write_data('U');write_com(0x80+0x00+14);break;case 5: write_data('F');write_data('R');write_data('I');write_com(0x80+0x00+14);break;case 6: write_data('S');write_data('A');write_data('T');write_com(0x80+0x00+14);break;case 7: write_data('S');write_data('U');write_data('N');write_com(0x80+0x00+14);break;}}void keycan(){/****************光标左移***************/if(s1==0){delay(5);if(s1==0){s1num++;while(!s1);if(s1num==1){TR0=0;write_com(0x80+0x40+11);write_data('<');write_com(0x80+0x40+10);//光标重新回到闪烁点,写光标地址同样加一write_com(0x0f); //光标闪烁}if(s1num==2){write_com(0x80+0x40+11);write_data(' ');write_com(0x80+0x40+8);write_data('<');write_com(0x80+0x40+7);}if(s1num==3){write_com(0x80+0x40+8);write_data(':');write_com(0x80+0x40+5);write_data('<');write_com(0x80+0x40+4);}if(s1num==4){write_com(0x80+0x40+5);write_data(':');write_com(0x80+15);write_data('<');write_com(0x80+14);}if(s1num==5){write_com(0x80+15);write_data(' ');write_com(0x80+11);write_data('<');write_com(0x80+10);}if(s1num==6){write_com(0x80+11);write_data(' ');write_com(0x80+8);write_data('<');write_com(0x80+7); }if(s1num==7){write_com(0x80+8);write_data('-');write_com(0x80+5);write_data('<');write_com(0x80+4); }if(s1num==8){s1num=0;write_com(0x80+5);write_data('-');write_com(0x0c);TR0=1;}}}/**************光标右移***************//* if(s2==0){delay(5);if(s2==0){s1num--;while(!s2);if(s1num==1){TR0=0;write_com(0x80+0x40+11);write_data('<');write_com(0x80+0x40+11);//光标重新回到闪烁点,写光标地址同样加一write_com(0x0f); //光标闪烁}if(s1num==2){write_com(0x80+0x40+11);write_data(' ');write_com(0x80+0x40+8);write_data('<');write_com(0x80+0x40+8);}if(s1num==3){write_com(0x80+0x40+8);write_data(':');write_com(0x80+0x40+5);write_data('<');write_com(0x80+0x40+5);}if(s1num==4){write_com(0x80+0x40+5);write_data(':');write_com(0x80+15);write_data('<');write_com(0x80+15);}if(s1num==5){write_com(0x80+15);write_data(' ');write_com(0x80+11);write_data('<');write_com(0x80+11);}if(s1num==6){write_com(0x80+11);write_data(' ');write_com(0x80+8);write_data('<');write_com(0x80+8);}if(s1num==7){write_com(0x80+8);write_data('-');write_com(0x80+5);write_data('<');write_com(0x80+5);}if(s1num==8){s1num=0;write_com(0x80+5);write_data('-');write_com(0x0c);TR0=1;}}} *//***************************按键加*******************************/if(s1num!=0){if(s3==0){delay(5);if(s3==0){while(!s3);if(s1num==1){miao++;if(miao==60)miao=0;write_sfm(9,miao);write_com(0x80+0x40+10);}if(s1num==2){fen++;if(fen==60)fen=0;write_sfm(6,fen);write_com(0x80+0x40+7);}if(s1num==3){shi++;if(shi==24)shi=0;write_sfm(3,shi);write_com(0x80+0x40+4);}if(s1num==4){xingqi++;if(xingqi==8)xingqi=1;write_com(0x80+0x00+12);display_week();}if(s1num==5){ri++;if(ri==32&&(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)){ri=1;yue++;if(yue==13){yue=1;nian++;write_nyr(3,nian);}write_nyr(6,yue);}if(ri==31&&(yue==4||yue==6||yue==9||yue==11)){ri=1;yue++;write_nyr(6,yue);}if(flag==1){if(ri==30&&yue==2){ri=1;yue++;write_nyr(6,yue);}}if(flag==0){if(ri==29&&yue==2){ri=1;yue++;write_nyr(6,yue);}}write_nyr(9,ri);write_com(0x80+0x00+10);}if(s1num==6){yue++;if(yue==2&&ri>29&&flag==1) //当为闰年时,如果ri=30,但是月份已经加到2,这种情况ri必须等于29{ri=29;write_nyr(9,ri);}if(yue==2&&ri>28&&flag==0) //当为平年时,如果ri=30,但是月份已经加到2,这种情况ri必须等于28{ri=28;write_nyr(9,ri);}if((yue==4||yue==6||yue==9||yue==11)&&(ri==31||ri==29||ri==28)){ri=1;write_nyr(9,ri);}if(yue==13){yue=1;nian++;if(nian%4>0){write_nyr(9,28);}write_nyr(3,nian);}write_nyr(6,yue);write_com(0x80+0x00+7);}if(s1num==7){nian++;if(nian==100)nian=0;flag=0;if(nian%4==0)flag=1;write_nyr(3,nian);write_com(0x80+0x00+4);}}}}/***************************按键减*********************/if(s4==0){delay(5);if(s4==0){while(!s4);if(s1num==1){miao--;if(miao==-1)miao=59;write_sfm(9,miao);write_com(0x80+0x40+10);}if(s1num==2){fen--;if(fen==-1)fen=59;write_sfm(6,fen);write_com(0x80+0x40+7);}if(s1num==3){shi--;if(shi==-1)shi=23;write_sfm(3,shi);write_com(0x80+0x40+4);}if(s1num==4){xingqi--;if(xingqi==0)xingqi=7;write_com(0x80+0x00+12);display_week();}if(s1num==5){ri--;if(ri==0&&(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)){ri=30; //防止当yue=12时,当yue减到11时,ri任然等于31时这种不允许情况出现yue--;if(yue==2){if(flag==1)ri=29;elseri=28;}write_nyr(6,yue);if(yue==0){yue=12;ri=31;write_nyr(9,ri);write_nyr(6,yue);}}if(ri==0&&(yue==4||yue==6||yue==9||yue==11)){ri=31;//按下减小按钮,yue 减到3或5或8或10,为大月yue--;write_nyr(6,yue);}if(flag==1) //闰年标志位{if(ri==0&&yue==2){ri=29;yue--;write_nyr(6,yue);}}if(flag==0) //平年标志位{if(ri==0&&yue==2){ri=28;yue--;write_nyr(6,yue);}}write_nyr(9,ri);write_com(0x80+0x00+10);}if(s1num==6){yue--;if(yue==2&&ri>29&&flag==1){ri=29;write_nyr(9,ri);}if(yue==2&&ri>28&&flag==0){ri=28;write_nyr(9,ri);}if(yue==0){yue=12;nian--;write_nyr(3,nian);}write_nyr(6,yue);if((yue==4||yue==6||yue==9||yue==11)&&(ri==31||ri==29||ri==28)){ri=1;write_nyr(9,ri);}write_com(0x80+0x00+7);}if(s1num==7){nian--;if(nian==-1)nian=99;flag=0; //清除标志位if(nian%4==0)flag=1;write_nyr(3,nian);write_com(0x80+0x00+4);}}}}/************初始化**************/void init(){write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80+0x00);for(num=0;num<15;num++){write_data(table[num]);delay(5);}write_com(0x80+0x40);for(num=0;num<11;num++){write_data(table1[num]);delay(5);}shi=23;fen=59;miao=55;xingqi=1;ri=29;yue=2;nian=12;if(nian%4==0)flag=1;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}/***********主函数*************/ void main(){init(); //初始化while(1){keycan();}}/******启动定时器*************/void timer() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count==18){count=0;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;feng=0;delay(500);feng=1;shi++;if(shi==24){shi=0;ri++;xingqi++;if(xingqi==8)xingqi=1;write_com(0x80+0x00+12);display_week();if(ri==32&&(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)){ri=1;yue++;if(yue==13){yue=1;nian++;if(nian==99)nian=0;if(nian%4==0)flag=1;flag=0;write_nyr(3,nian);}write_nyr(6,yue);}if(ri==31&&(yue==4||yue==6||yue==9||yue==11)){ri=1;yue++;write_nyr(6,yue);}if(flag==1){if(ri==30&&yue==2){ri=1;yue++;write_nyr(6,yue);}}if(flag==0){if(ri==29&&yue==2).专业整理..学习帮手.{ri=1;yue++;write_nyr(6,yue);}}write_nyr(9,ri);}write_sfm(3,shi);}write_sfm(6,fen);}write_sfm(9,miao);}}。
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(); //显示结果}}}}。
1602 C语言程序
#include <reg52.h>unsigned char code tab1[16]=" Now time is: ";unsigned char tab2[16]=" 00:00:00 ";unsigned char second = 0,minite=0,hour=0;/*设置管脚*/sbit RS = P1^0;sbit RW = P1^1;sbit E = P1^2;sbit Beep = P3^4;/*LCD1602控制指令*/ // #define a b ==> a=b#define LCD_Set 0x38 // 0011 1000 显示初始化,16*2显示,5*7点阵,8位数据接口;#define LCD_Clear 0x01 // 0000 0001 清屏LCD ;#define LCD_Display1 0x0f // 0000 1111 显示功能设置:开显示,显示光标,光标闪烁; #define LCD_Display2 0x0c // 0000 1100 显示功能设置:开显示,不显示光标,光标不闪烁;#define LCD_Mode 0x06 // 0000 0110 设置光标状态默认0x06,为读一个字符光标加1 ;#define LCD_1_Left 0x80 //设置初始化数据指针,指向左半屏第一行首位;#define LCD_2_Left (0x80+0x40) //设置初始化数据指针,指向左半屏第二行首位;/*液晶1602 毫秒延时*/void delay_ms(unsigned int ms){unsigned int i,j;for(i=0;i<ms;i++){for(j=0;j<1141;j++){;}}}/*液晶1602 写控制指令函数*/void Write_Command(unsigned char Command){RS = 0 ; // 进行指令的操作RW = 0 ; // 进行写操作P2 = Command ; // 赋值指令E = 1 ; // 使能端拉高delay_ms(1); // 等待指令写完E = 0 ; // 使能端拉低}/*液晶1602 写数据函数*/void Write_Data(unsigned char Data){RS = 1 ; // 进行数据的操作RW = 0 ; // 进行写操作P2 = Data ; // 赋值数据E = 1 ; // 使能端拉高delay_ms(1); // 等待数据写完E = 0 ; // 使能端拉低}/*液晶1602 使用初始化*/void LCD1602_Init(void){Write_Command(LCD_Set); // 显示初始化,16*2显示,5*7点阵,8位数据接口;Write_Command(LCD_Clear); // 清屏LCD ;Write_Command(LCD_Display2); // 显示功能设置:开显示,不显示光标,光标不闪烁; Write_Command(LCD_Mode); // 设置光标状态默认0x06,为读一个字符光标加1 ; }void LCD1602Printfc(unsigned char line,unsigned char address,unsigned char Data){if(line){Write_Command(0xc0+address);Write_Data(Data);}else {Write_Command(0x80+address);Write_Data(Data);}}/*液晶1602 显示*/void LCD1602_Display(unsigned char *table1 , unsigned char *table2){unsigned char i;Write_Command( LCD_1_Left ); //第一行显示16个字符delay_ms(1);for(i=0;i<16;i++){Write_Data(table1[i]);delay_ms(20);}Write_Command( LCD_2_Left ); //第二行显示16个字符delay_ms(1); for(i=0;i<16;i++){Write_Data(table2[i]);delay_ms(20);}}void time_view(void){if(second == 60){minite ++;second=0;}if(minite == 60){hour++;minite = 0;}if(hour == 24)hour=0;LCD1602Printfc(1,0,hour/10+'0');LCD1602Printfc(1,1,hour%10+'0');LCD1602Printfc(1,2,':');LCD1602Printfc(1,3,minite/10+'0');LCD1602Printfc(1,4,minite%10+'0');LCD1602Printfc(1,5,':');LCD1602Printfc(1,6,second/10+'0');LCD1602Printfc(1,7,second%10+'0');}void Time0Init(void){TMOD = 0x01;TH0 = 0x3c;TL0 = 0xb0;ET0 = 1;TR0 = 1;EA = 1;}/*主函数*/void main(void){LCD1602_Init(); //调用1602初始化程序Time0Init();while(1){time_view();// LCD1602_Display(tab1,tab2); //调用显示程序}}void time0(void)interrupt 2{static unsigned char time = 0;TH0 = 0x3c;TL0 = 0xb0;time ++;if(time == 20){time = 0;second ++;} }。
51单片机万年历1602显示时间温度按键调时(焊接前备份)
}
if(hmin_fen==6)
{
hmin_fen=0;
//nmin_shi++;
}
ZuiZhong[13]=l_tmpdate[1]%16+0x30;
ZuiZhong[14]=':';
ZuiZhong[15]=l_tmpdate[0]/16+0x30;
ZuiZhong[16]=l_tmpdate[0]%16+0x30;
ZuiZhong[17]=' ';
/* ZuiZhong[18]=Temperature%1000/100+0x30;
ZuiZhong[19]=Temperature%100/10+0x30;
ZuiZhong[20]=Temperature%10+0x30;
ZuiZhong[21]=0xdf;
ZuiZhong[22]='C'; */
write_lcd1602(0x80+0x43,0); // 20
for(i=23;i<=24;i++)
write_lcd1602( ZuiZhong[i], 1 );
if(K1==0)
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^6; // 【1602显示引脚定义】
sbit rw=P2^5; //【【【【【7-6-5顺序
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语言编写的1602液晶显示闹钟
#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]=" 2012-08-17 MON"; //设定开始显示的时间uchar code table1[]=" 12:30:00";uchar code table2[7][3]= {{"MON"},{"TUE"},{"WED"},{"THU"},{"FRI"},{"SAT"},{"SUN"}};//定义二维字符数组sbit wr=P3^6; // 1602液晶的读/写端sbit dula=P2^6; // 数码管段选sbit wela=P2^7; // 数码管位选sbit lcden=P3^4; // 1602液晶使能端sbit lcdrs=P3^5; // 1602液晶命令/数据端sbit key1=P3^0; // 声明s4按键sbit key2=P3^1; // 声明s8按键sbit key3=P3^2; // 声明s12按键sbit key4=P3^3; // 声明s16按键sbit beep=P2^3; // 声明蜂鸣器sbit rd=P3^7; // 声明4个按键的公共端uchar num1,shi=12,fen=30,miao,yue=8,ri=17,shi1,fen1,miao1,keynum1,week; //定义时分秒变量uint nian=2012; //定义年变量void delayms(uint x){uint i,j;for(i=x;i>0;i--) //定义带参数延时函数for(j=110;j>0;j--);}void write_com(uchar com) //1602液晶写指令函数{ wr=0;lcdrs=0;P0=com;delayms(1);lcden=1;delayms(1);lcden=0;}void write_date(uchar date) //1602液晶写数据函数{ wr=0;lcdrs=1;P0=date;delayms(1);lcden=1;delayms(1);lcden=0;}void write_addate1(uchar add,uint date) //定义显示年的函数{ uint qian;uchar bai,shi,ge;qian=date/1000;bai=date%1000/100;shi=date%1000%100/10;ge=date%10;write_com(add+0x80);write_date(0x30+qian);write_date(0x30+bai);write_date(0x30+shi);write_date(0x30+ge);}void write_addate2(uchar add,uchar date) //定义显示月、日、时、分、秒函数{uchar shi,ge;shi=date/10;ge=date%10;write_com(add+0x80);write_date(0x30+shi);write_date(0x30+ge);}void write_rq(uchar i) //定义显示星期的函数{ uchar x;for(x=0;x<3;x++){ write_date(table2[i][x]);delayms(1);}}void init () //定义初始化函数{dula=0; // 关闭数码管段、位选端wela=0;TMOD=0x01; // 定时器0工作方式为16位TH0=(65536-45872)/256; // 装初值TL0=(65536-45872)%256;EA=1; // 开总中断ET0=1; // 开定时器0中断write_com(0x38); // 设置16*2显示,5*7点阵,8位数据口write_com(0x06); // 写一个字符后地址指针加1write_com(0x0c); // 设置开显示,不显示光标write_com(0x01); // 显示清0,数据清0write_com(0x80); // 使指针指向第1行第1列}void keyscan() // 定义按键函数{uchar keynum;rd=0; //4个按键公共端为低电平if(key1==0) //s4按键被按下{ delayms(3); //去抖延时if(key1==0) //确认s4按键被按下,进入调时间模式{keynum++;while(!key1); //松手检测}if(keynum==1) //s4按下一次{ TR0=0; //关闭定时器0write_com(0x81); //指针指向第1行2列write_com(0x0f); //开启光标显示,光标闪烁}if(keynum==2){write_com(0x86); //光标跳到月份}if(keynum==3){write_com(0x89); //光标跳到日}if(keynum==4){write_com(0x8c); //光标跳到星期}if(keynum==5){write_com(0xc4); //光标跳到时}if(keynum==6){write_com(0xc7); //光标跳到分}if(keynum==7){write_com(0xca); //光标跳到秒}if(keynum==8){ keynum=0; //退出调时间模式TR0=1; //开启定时器0write_com(0x0c); //关闭光标显示}}if(keynum) //当进入调时间模式时{if(key2==0) //s8按键按下{delayms(3); //去抖延时if(key2==0){if(keynum==1){nian++; //s8每按下一次年份加1if(nian==10000) // 加满清0nian=0;write_addate1(1,nian); // 显示年份write_com(0x81); //写完数据指针指向年份原来位置}if(keynum==2){yue++; //s8每按下一次月份加1if(yue==13)yue=0; //加满清0write_addate2(6,yue); //显示月份write_com(0x86); //写完数据指针指向月份原来位置}if(keynum==3){ ri++;if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12) //1,3,5,7,8,10,12月有31天if(ri==32)//加满还原ri=1;if(yue==4||yue==6||yue==9||yue==11) //4,6,9,11月有30天if(ri==31)ri=1;if(yue==2&&((nian%4==0&&nian%100!=0)||nian%400==0)) //闰年2月有30天if(ri==30)ri=1;if(yue==2&&(nian%4!=0)||(nian%100==0&&nian%400!=0)) //非闰年2月有31天if(ri==29)ri=1;write_addate2(9,ri); //显示日write_com(0x89); //写完数据指针指向日原来位置}if(keynum==4){week++;//s8每按下一次星期加1if(week==7)//加满还原week=0;write_rq(week); //显示星期write_com(0x8c); //写完数据指针指向星期原来位置}if(keynum==5){shi++;//s8每按下一次时加1if(shi==24)shi=0;//加满还原write_addate2(0x44,shi); //显示时write_com(0xc4); //写完数据指针指向时原来位置}if(keynum==6){fen++;//s8每按下一次分加1if(fen==60)fen=0;//加满还原write_addate2(0x47,fen); //显示分write_com(0xc7);//写完数据指针指向分原来位置}if(keynum==7){miao++;//s8每按下一次秒加1if(miao==60)miao=0;//加满还原write_addate2(0x4a,miao);//显示秒write_com(0xca);//写完数据指针指向秒原来位置}while(!key2); //松手检测}}if(key3==0){delayms(3);if(key3==0){ //s12按下时减1if(keynum==1){nian--;if(nian==-1)nian=9999;write_addate1(1,nian);write_com(0x81);}if(keynum==2){ yue--;if(yue==-1)yue=12;write_addate2(6,yue);write_com(0x86);}if(keynum==3){ri--;if(ri==0){if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)ri=31;if(yue==4||yue==6||yue==9||yue==11)ri=30;if(yue==2&&((nian%4==0&&nian%100!=0)||nian%400==0))ri=29;if(yue==2&&(nian%4!=0)||(nian%100==0&&nian%400!=0))ri=28;}write_addate2(9,ri);write_com(0x89);}if(keynum==4){week--;if(week==-1)week=6;write_rq(week);write_com(0x8c);}if(keynum==5){shi--;if(shi==-1)shi=23;write_addate2(0x44,shi);write_com(0xc4);}if(keynum==6){fen--;if(fen==-1)fen=59;write_addate2(0x47,fen);write_com(0xc7);}if(keynum==7){miao--;if(miao==-1)miao=59;write_addate2(0x4a,miao);write_com(0xca);}while(!key3); //松手检测}}}if(key4==0) //s16被按下进入调闹钟模式{ delayms(3);if(key4==0){keynum1++;while(!key4);}if(keynum1==1){ write_com(0x01); //清屏,指针清0write_com(0xc6); //在时分之间显示“:”write_date(':');write_com(0xc9); //在分秒之间显示“:”write_date(':');write_com(0x0f); //开启光标write_com(0xc4); //光标指向时}if(keynum1==2){write_com(0xc7);//光标指向分}if(keynum1==3){write_com(0xca); //光标指向秒}if(keynum1==4){ keynum1=0;write_com(0x0c); //关闭光标}}if(keynum1){if(key2==0) //s8按下加1{delayms(3);if(key2==0){if(keynum1==1){shi1++;if(shi1==24)shi1=0;write_addate2(0x44,shi1);write_com(0xc4);}if(keynum1==2){fen1++;if(fen1==60)fen1=0;write_addate2(0x47,fen1);write_com(0xc7);}if(keynum1==3){miao1++;if(miao1==60)miao1=0;write_addate2(0x4a,miao1);write_com(0xca);}while(!key2);}}if(key3==0) //s12每按一次减1{delayms(3);if(key3==0){if(keynum1==1){shi1--;if(shi1==-1)shi1=23;write_addate2(0x44,shi1);write_com(0xc4);}if(keynum1==2){fen1--;if(fen1==-1)fen1=59;write_addate2(0x47,fen1);write_com(0xc7);}if(keynum1==3){miao1--;if(miao1==-1)miao1=59;write_addate2(0x4a,miao1);write_com(0xca);}while(!key3);//松手检测}}}}void main(){ uchar num;init();for(num=0;num<15;num++){ write_date(table[num]);delayms(5);} //显示初始时间write_com(0xc0);for(num=0;num<12;num++){ write_date(table1[num]);delayms(5);}TR0=1; //开启定时器0while(1){ if(shi==shi1&&fen==fen1&&miao==miao1) //闹钟到了蜂鸣器响beep=0;keyscan(); //扫描键盘}}void time() interrupt 1 //中断函数{TH0=(65536-45872)/256;TL0=(65536-45872)%256; //进入中断装初值num1++;if(num1==20) //一秒到了{ num1=0; //清0miao++;if(miao==60) //一分到了{ miao=0; fen++; }if(!keynum1) write_addate2(0x4a,miao); //当调闹钟模式按下时不显示当前时间if(fen==60){ fen=0;shi++;}if(!keynum1) write_addate2(0x47,fen); //当调闹钟模式按下时不显示当前时间if(shi==24){shi=0;ri++;week++;}if(!keynum1) write_addate2(0x44,shi); //当调闹钟模式按下时不显示当前时间if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)if(ri==32){ ri=1; y ue++; }if(yue==4||yue==6||yue==9||yue==11)if(ri==31){ ri=1; yue++; }if(yue==2&&((nian%4==0&&nian%100!=0)||nian%400==0))if(ri==30){ ri=1; yue++; }if(yue==2&&(nian%4!=0)||(nian%100==0&&nian%400!=0))if(ri==29){ ri=1; yue++; }if(!keynum1) write_addate2(9,ri);//当调闹钟模式按下时不显示当前时间if(week==7)week=0;if(!keynum1)//当调闹钟模式按下时不显示当前时间{ write_com(0x8c);write_rq(week);}if(yue==13){ yue=0;nian++;}if(!keynum1)//当调闹钟模式按下时不显示当前时间{write_addate2(6,yue);write_com(0x88);write_date('-');}if(nian==10000)nian=0;if(!keynum1){ write_addate1(1,nian);//当调闹钟模式按下时不显示当前时间write_com(0x85);write_date('-');}}}。
51单片机控制1602LCD显示程序
LCD显示电路#include<reg51.h>sbit RS=P3^7; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P3^6; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^7; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,将BF位定义为P0.7引脚#define Lcd_Data P0#include <string.h>#include<intrins.h> //包含_nop_()函数定义的头文件unsigned char code string1[ ]={0x77,0x75,0x20,0x79,0x61,0x6E,0x67,0x20,0x79,0x61,0x6E,0x67,0x20,0x20,0x20,0x20}; //第一行显示的字符void Lcd_delay1ms() // 函数功能:延时1ms//注:不同单片机不同晶振需要对此函数进行修改{ unsigned char i,j;for(i=0;i<90;i++)for(j=0;j<33;j++);}void Lcd_delay(unsigned int n) // 函数功能:延时若干毫秒,入口参数:n{ unsigned int i;for(i=0;i<n;i++)Lcd_delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。
result=1,忙碌;result=0,不忙***************************************************/bit Lcd_BusyTest(void)bit result;RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1; //E=1,才允许读写_nop_(); //空操作_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间result=BF; //将忙碌标志电平赋给resultE=0;return result;}/*****************************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate***************************************************/void Lcd_WriteCom (unsigned char dictate){ while(Lcd_BusyTest()==1); //如果忙就等待RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0;E=0; //E置低电平(写指令时就是让E从0到1发生正跳变,所以应先置ぜ? _nop_();_nop_(); //空操作两个机器周期,给硬件反应时间Lcd_Data=dictate; //将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:指定字符显示的实际地址x入口参数:注:此函数已经加上了0x80,故只需写上实际地址就行***************************************************/void Lcd_WriteAddress(unsigned char x){ Lcd_WriteCom(x|0x80); //显示位置的确定方法规定为80H+地址码x/*****************************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y(为字符常量)***************************************************/void Lcd_WriteData(unsigned char y){while(Lcd_BusyTest()==1);RS=1; //RS为高电平,RW为低电平时,可以写入数据RW=0;E=0; //E置低电平(写指令时就是让E从0到1发生正跳变所以应先置ぜ?Lcd_Data=y; //将数据送入P0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:对LCD的显示模式进行初始化设置***************************************************/void Lcd_Int(void){Lcd_delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间Lcd_WriteCom(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口Lcd_delay(5); //延时5msLcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);设置模式次写9// Lcd_WriteCom(0x38);Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x0C); //显示模式设置:显示开,有光标,光标闪烁Lcd_delay(5);Lcd_WriteCom(0x06); //显示模式设置:光标右移,字符不移Lcd_delay(5);Lcd_WriteCom(0x01); //清屏幕指令,将以前的显示内容清零Lcd_delay(5); }void hanying_show(void){unsigned char Lcd_i;Lcd_WriteCom(0x01);//清显示:清屏幕指令Lcd_delay(2);Lcd_WriteAddress(0x00); // 设置显示位置为最左侧Lcd_delay(2);Lcd_i=0;while(string1[Lcd_i]!='\0') //'\0'是数组结束标志需先将字符存入{Lcd_WriteData(string1[Lcd_i]); // 显示字符Lcd_i++;Lcd_delay(4);}}void main(){Lcd_Int(); //1602初始化while(1){hanying_show();}}。
Get清风51单片机好学1602全过程C语言编程显示很全的哦
51单片机好学1602全过程C语言编程显示很全的哦阿拉教你轻松学51系列〔就抽精品〕发布: 2021-2-05 16:03 | 作者: tiankai | 来源: 电子园51单片机学习网阿拉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中的字符代码是根本一致的。
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液晶电子时钟显示程序[ 2007-05-31 13:31:45 | By: kevin ]刚写好的基于51单片机控制的1602液晶电子时钟显示程序,整理了一下,并尽量加上的注释,放出来大家共享及交流。
有兴趣的可以参考一下,各管脚定义都比较明显,有一定基础的可稍作修改即可进行实验。
//基于51单片机控制的1602液晶电子时钟显示程序#i nclude <intrins.h>#i nclude <at89x51.h>#define uchar unsigned char#define LCM_RS P2_2 //定义引脚#define LCM_RW P2_1#define LCM_E P2_0#define LCM_Data P0#define Busy 0x80 //用于检测LCM状态字中的Busy标识uchar i, j, k, second, tcount, minute, hour;void WriteDataLCM(unsigned char WDLCM);void WriteCommandLCM(unsigned char WCLCM,BuysC);unsigned char ReadDataLCM(void);unsigned char ReadStatusLCM(void);void LCMInit(void);void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);void DisplayqListChar(unsigned char X, unsigned char Y, unsigned char code *DData);void Delay5Ms(void);void Delay400Ms(void);unsigned char codetable[]={'0','1','2','3','4','5','6','7','8','9'};//数码管数字编码unsigned char code MyNo[] = {"NAME:Who_am_I?"};/******************************************************************** ************************ 函数名称:delay()** 功能描述:延时子程序,大约延时 n MS** 输入:** 输出:** 全局变量:** 调用模块:** 作者: kevin** 日期: 2007年5月31日********************************************************************* ***********************/delay(uchar n){uchar i,j,k;for(i=2;i>0;i--)for(j=n;j>0;j--)for(k=125;k>0;k--);}/******************************************************************** ************************ 函数名称:lcd()** 功能描述:液晶初始化,然后在液晶屏第二行显示提示信息** 输入:** 输出:** 全局变量:** 调用模块:Delay400Ms(),LCMInit(),DisplayListChar()** 作者: kevin** 日期: 2007年5月31日********************************************************************* ***********************/void lcd(void){Delay400Ms(); //启动等待,等LCM讲入工作状态LCMInit(); //LCM初始化Delay5Ms(); //延时片刻(可不要)DisplayListChar(0, 1, MyNo);}/******************************************************************** ************************ 函数名称:WriteDataLCM()** 功能描述:写数据** 输入: WDLCM** 输出:** 全局变量:** 调用模块:** 作者: kevin** 日期: 2007年5月31日********************************************************************************************/void WriteDataLCM(unsigned char WDLCM){ReadStatusLCM(); //检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E = 0; //若晶振速度太高可以在这后加小的延时LCM_E = 0; //延时LCM_E = 1;}/******************************************************************** ************************ 函数名称:WriteCommandLCM()** 功能描述:写指令** 输入:** 输出:** 全局变量:** 调用模块:** 作者: kevin** 日期: 2007年5月31日********************************************************************* ***********************/void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCM(); //根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;}/******************************************************************** ************************ 函数名称:ReadDataLCM()** 功能描述:读数据** 输入:** 输出:** 全局变量:** 调用模块:** 作者: kevin** 日期: 2007年5月31日********************************************************************* ***********************/unsigned char ReadDataLCM(void){LCM_RS = 1;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;return(LCM_Data);}/******************************************************************** ************************ 函数名称:ReadStatusLCM()** 功能描述:读状态** 输入:** 输出:** 全局变量:** 调用模块:** 作者: kevin** 日期: 2007年5月31日********************************************************************* ***********************/unsigned char ReadStatusLCM(void){LCM_Data = 0xFF;LCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;while (LCM_Data & Busy); //检测忙信号return(LCM_Data);}/******************************************************************** ************************ 函数名称:LCMInit()** 功能描述:LCM初始化** 输入:** 输出:** 全局变量:** 调用模块:** 作者: kevin** 日期: 2007年5月31日********************************************************************* ***********************/void LCMInit(void){LCM_Data = 0;WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1); //关闭显示WriteCommandLCM(0x01,1); //显示清屏WriteCommandLCM(0x06,1); // 显示光标移动设置WriteCommandLCM(0x0C,1); // 显示开及光标设置}/******************************************************************** ************************ 函数名称:DisplayOneChar()** 功能描述:按指定位置显示一个字符** 输入:** 输出:** 全局变量:** 调用模块:** 作者: kevin** 日期: 2007年5月31日********************************************************************* ***********************/void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) {Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; // 算出指令码WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码WriteDataLCM(DData);}/******************************************************************** ************************ 函数名称:DisplayListChar()** 功能描述:按指定位置显示一串字符** 输入:** 输出:** 全局变量:** 调用模块:** 作者: kevin** 日期: 2007年5月31日********************************************************************* ***********************/void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData){unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]>0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}/******************************************************************** ************************ 函数名称:Delay5Ms()** 功能描述:5ms延时** 输入:** 输出:** 全局变量:** 调用模块:** 作者: kevin** 日期: 2007年5月31日********************************************************************* ***********************/void Delay5Ms(void){unsigned int TempCyc = 5552;while(TempCyc--);}/******************************************************************** ************************ 函数名称:Delay400Ms()** 功能描述:400ms延时** 输入:** 输出:** 全局变量:** 调用模块:** 作者: kevin** 日期: 2007年5月31日********************************************************************* ***********************/void Delay400Ms(void){unsigned char TempCycA = 5;unsigned int TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);};}/******************************************************************** ************************ 函数名称:timer0()** 功能描述:中断子程序,1秒重写一次液晶,以此实现60秒计数** 输入:** 输出:** 全局变量:** 调用模块:** 作者: kevin** 日期: 2007年5月31日********************************************************************* ***********************/void timer0() interrupt 1 using 0{int i;TH0=(65536-50000)/256*3; //中断设置初始化TL0=(65536-50000)%256*3;tcount++;if(tcount==60) //满1秒{ i=0;DisplayOneChar(i++, 0, 'T'); //在第1行第1个坐标显示DisplayOneChar(i++, 0, 'I'); //在第1行第2个坐标显示DisplayOneChar(i++, 0, 'M'); //在第1行第3个坐标显示DisplayOneChar(i++, 0, 'E'); //在第1行第4个坐标显示DisplayOneChar(i++, 0, ':'); //在第1行第5个坐标显示DisplayOneChar(i++, 0, table[hour/10]); //在第1行第6个坐标显示DisplayOneChar(i++, 0, table[hour%10]); //在第1行第7个坐标显示DisplayOneChar(i++, 0, ':'); //在第1行第1个坐标显示DisplayOneChar(i++, 0, table[minute/10]); //在第1行第8个坐标显示DisplayOneChar(i++, 0, table[minute%10]); //在第1行第9个坐标显示DisplayOneChar(i++, 0, ':'); //在第1行第10个坐标显示DisplayOneChar(i++, 0, table[second/10]); //在第1行第11个坐标显示DisplayOneChar(i++, 0, table[second%10]); //在第1行第12个坐标显示tcount=0;second++;if(second==60) //满1分{second=0;minute++; //分数加1,秒数归零 if(minute==60) //满1小时{minute=0;hour++; //小时数加1,分数归零if(hour==24){hour=0;}}}}}/******************************************************************** ************************ 函数名称:main()** 功能描述:主程序,设置初始时间,中断设置初始化,液晶显示,等待中断** 输入:** 输出:** 全局变量:** 调用模块:** 作者: kevin** 日期: 2007年5月31日********************************************************************* ***********************/void main(){uchar i;second=0;minute=0;hour=0; //设置初始时间TH0=(65536-50000)/256; //中断设置初始化TL0=(65536-50000)%256;EA=1;ET0=1;TMOD=0x21;TR0=1;lcd();i=0;DisplayOneChar(i++, 0, 'T'); //在第1行第1个坐标显示DisplayOneChar(i++, 0, 'I'); //在第1行第2个坐标显示DisplayOneChar(i++, 0, 'M'); //在第1行第3个坐标显示DisplayOneChar(i++, 0, 'E'); //在第1行第4个坐标显示DisplayOneChar(i++, 0, ':'); //在第1行第5个坐标显示DisplayOneChar(i++, 0, table[hour/10]); //在第1行第6个坐标显示DisplayOneChar(i++, 0, table[hour%10]); //在第1行第7个坐标显示DisplayOneChar(i++, 0, ':'); //在第1行第1个坐标显示DisplayOneChar(i++, 0, table[minute/10]); //在第1行第8个坐标显示DisplayOneChar(i++, 0, table[minute%10]); //在第1行第9个坐标显示DisplayOneChar(i++, 0, ':'); //在第1行第10个坐标显示DisplayOneChar(i++, 0, table[second/10]); //在第1行第11个坐标显示DisplayOneChar(i++, 0, table[second%10]); //在第1行第12个坐标显示while(1); //等待中断}。
我的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; }
51单片机 lcd1602测试C程序
51单片机 lcd1602测试C程序///原创,绝对正版...嘻嘻嘻~~~//********************************************************************** //lcd_1602测试C程序//RS接P2^5,RW接P2^6,E接P2^7,P0口为数据口//如果硬件正常,则在液晶屏幕上显示第一行为"Weclome!",第二行显示"Ilove you!"//**********************************************************************//********************************************************************** #include <reg51.h>sbit rs_1602=P2^5;sbit rw_1602=P2^6;sbit en_1602 =P2^7;#define lcd_data P0 //加上拉//********************************************************************** //1602LCD延时Zms函数//********************************************************************** void delay_1602(int z){ int x,y;for(x=0;x<z;x++)for(y=0;y<=111;y++);}//****************************************************************** **** //1602LCD写地址函数//****************************************************************** **** void adr_write(unsigned char adr){delay_1602(5);en_1602=0;rs_1602=0;rw_1602=0;en_1602=1;lcd_data=adr;en_1602=0;}//****************************************************************** **** //1602LCD写数据函数//****************************************************************** **** void ddr_write(unsigned char ddr){delay_1602(5);en_1602=0;rs_1602=1;rw_1602=0;en_1602=1;lcd_data=ddr;en_1602=0;}//****************************************************************** ****//1602LCD初始化函数//****************************************************************** ****void lcd_init(void){en_1602=0;adr_write(0x38); //两行显示,5*7模式adr_write(0x01);//清显示adr_write(0x0c); //整体显示打开,不显示光标adr_write(0x06);adr_write(0x80);//从第一行的第一个位置开始显示}//****************************************************************** ****//1602LCD显示字符串数据函数//****************************************************************** ****void str_write(unsigned char *str){while(*str!='\0'){ddr_write(*str);str++;}}//****************************************************************** ****//1602LCD显示定位函数//****************************************************************** ****void set_point(unsigned char x,y){if(!x)adr_write(0x80+y);elseadr_write(0x80+0x40+y);}void main(void){lcd_init(); //LCD1602初始化while(1){set_point(0,4);str_write("Welcome!");set_point(1,2);str_write("I love you!!"); }}。
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单片机好学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单片机控制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," ");
(完整word版)1602液晶时钟程序(51单片机)
1602液晶时钟程序程序按郭天袢《新概念51单片机C语言教程》第十四章扩展显示年、月、日、星期调节功能。
1)时间显示在1602液晶上,并按秒实时更新2)能调节按键调整时、分、秒、年、月、日和星期3)每次按键按下时有短滴声响声4)断电后下次上电会接着上次断电前的时间数继续运行原理图如图//原代码如下:#include<reg52.h>//#include"24c02.h"#define uchar unsigned char#define uint unsigned int#include"24c02.h"sbit dula=P2^6;sbit wela=P2^7;sbit LCDEN=P3^4;sbit LCDRS=P3^5;sbit s1=P3^0;//定义按键--功能键sbit s2=P3^1;//定义按键--增大键sbit s3=P3^2;//定义按键--减小键sbit rd=P3^7;//按键公共脚sbit beep=P2^3;//定义蜂鸣器脚uchar count,s1_num;//定义中断次数计数变量功能键按键次数变量uchar week,day,month,year;//定义变量:星期日月年char miao,shi,fen;//定义秒分时变量uchar code table[]=" 2012-11-28 Wed";//void write_week(char we);//显示星期几函数void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void di()//蜂鸣器响一声函数{beep=0;delay(100);beep=1;}void write_com(uchar com) //液晶写命令函数{LCDRS=0;P0=com;delay(5);LCDEN=1;delay(5);LCDEN=0;}void write_date(uchar date) //液晶写数据函数{LCDRS=1;P0=date;delay(5);LCDEN=1;delay(5);LCDEN=0;}void write_week(char we) //写星期几显示函数{write_com(0x80+12);switch(we){case 1: write_date('M');delay(5); //星期一Mondaywrite_date('o');delay(5);write_date('n');delay(5);break;case 2: write_date('T');delay(5); //星期二Tuesdaywrite_date('u');delay(5);write_date('e');delay(5);break;case 3: write_date('W');delay(5); //Wednesdaywrite_date('e');delay(5);write_date('d');delay(5);break;case 4: write_date('T');delay(5); //Thursdaywrite_date('h');delay(5);write_date('u');delay(5);break;case 5: write_date('F');delay(5); //星期五Fridaywrite_date('r');delay(5);write_date('i');delay(5);break;case 6: write_date('S');delay(5); //星期六Saturdaywrite_date('a');delay(5);write_date('t');delay(5);break;case 7: write_date('S');delay(5); //星期日Sundaywrite_date('u');delay(5);write_date('n');delay(5);break;default: break;}}void write_sfm(uchar add,uchar date) //写时分秒函数{uchar shiwei,gewei;shiwei=date/10;gewei=date%10;write_com(0x80+0x40+add);//设置显示位置write_date(0x30+shiwei);//加上0x30是因为数字变成字符串需要加上0x30,看ASCII码值与字符的关系write_date(0x30+gewei);}void write_year_month_day(uchar add,uchar day) //写年月日数函数{uchar shi,ge;shi=day/10;ge=day%10;write_com(0x80+add);//设置显示位置write_date(0x30+shi);//加上0x30是因为数字变成字符串需要加上0x30,看ASCII码值与字符的关系write_date(0x30+ge);}void init() //初始化函数{uchar num;rd=0;beep=1;dula=0;wela=0;LCDEN=0;//将使能端置0以完成高脉冲fen=0;miao=0;shi=0;count=0;//计数初始为0init_24c02();write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口write_com(0x0c);//设置开显示,不显示光标write_com(0x06);//写一个字符后地址指针自动加1write_com(0x01);//显示清0,数据指针清0write_com(0x80); //设置显示初始坐标for(num=0;num<15;num++) //显示年月日{write_date(table[num]);delay(5);}write_com(0x80+0x40+6); //写出时间显示部分的两个冒号write_date(0x3a);delay(5);write_com(0x80+0x40+9);write_date(0x3a);delay(5);miao=read_add(1);//开机上电时读取24c02 IIC的数据赋值fen=read_add(2);shi=read_add(3);week=read_add(4);//读取星期几day=read_add(5);//读取多少日month=read_add(6);year=read_add(7);write_sfm(10,miao);//分别送去液晶显示write_sfm(7,fen);write_sfm(4,shi);write_week(week);//开机从24c02读取的星期几数从新写入液晶显示出来write_year_month_day(9,day);write_year_month_day(6,month);write_year_month_day(3,year);//定时器初始化TMOD=0x01; //设置定时器0工作模式1TH0=(65536-45876)/256; //定时器装初值TL0=(65536-45876)%256;EA=1; //开总中断ET0=1; //打定时器0中断TR0=1; //启动定时器0}void keyscan() //按键扫描函数{if(s1==0){delay(5);if(s1==0){s1_num++; //功能键按下次数记录while(!s1); //按键释放确认di();if(s1_num==1) //只按一次按键时TR0=0; //关闭定时器write_com(0x80+0x40+11);write_com(0x0f); //打开光标闪烁}if(s1_num==2) //第二次按下光标闪烁定位到分钟位置{write_com(0x80+0x40+8);}if(s1_num==3) //第三次按下光标闪烁定位到小时位置{write_com(0x80+0x40+5);}/**************************************if(s1_num==4) //第三四次按下退出{s1_num=0;write_com(0x0c); //取消光标闪栎TR0=1; //启动定时器使时钟开始走}***************************************/if(s1_num==4) //光标处星期{write_com(0x80+14);}if(s1_num==5) //光标处日{write_com(0x80+10);}if(s1_num==6) //光标处月{write_com(0x80+7);}if(s1_num==7) //光标处年{write_com(0x80+4);}if(s1_num==8) //当第八次按功能键时退出光标闪烁及开始计时{s1_num=0;write_com(0x0c); //取消光标闪栎TR0=1; //启动定时器使时钟开始走}}if(s1_num!=0){if(s2==0)//增加键确认按下{delay(5);if(s2==0){while(!s2);di();if(s1_num==1){miao++;if(miao==60)miao=0;write_sfm(10,miao);write_com(0x80+0x40+11);write_add(1,miao);}if(s1_num==2){fen++;if(fen==60)fen=0;write_sfm(7,fen);write_com(0x80+0x40+8);write_add(2,fen);}if(s1_num==3){shi++;if(shi==24)shi=0;write_sfm(4,shi);write_com(0x80+0x40+5);write_add(3,shi);}if(s1_num==4)//按四次功能键后光标至星期几处,可调节星期几{week++;if(week==8)week=1;write_week(week);write_com(0x80+14); //写一个字符后光标会移一位,所以要重新定义光标位置write_add(4,week);}if(s1_num==5) //光标至显示日处,可调节多少日{day++;if(day==32)day=1;write_year_month_day(9,day);write_com(0x80+10);write_add(5,day);}if(s1_num==6) //光标至显示月处调节月份{month++;if(month==13)month=1;write_year_month_day(6,month);write_com(0x80+7);write_add(6,month);}if(s1_num==7){year++;if(year==100)year=00;write_year_month_day(3,year);write_com(0x80+4);write_add(7,year);}}}if(s3==0) //确认减小键被按下{delay(5);//按键防抖延时if(s3==0) //确认减小键被按下{while(!s3);di();if(s1_num==1){miao--;if(miao==-1)miao=59;write_sfm(10,miao);write_com(0x80+0x40+11);write_add(1,miao);}if(s1_num==2){fen--;if(fen==-1)fen=59;write_sfm(7,fen);write_com(0x80+0x40+8);write_add(2,fen);}if(s1_num==3){shi--;if(shi==-1)shi=23;write_sfm(4,shi);write_com(0x80+0x40+5);write_add(3,shi);}if(s1_num==4){week--;if(week==0)week=7;write_week(week);write_com(0x80+14); //写一个字符后光标会移一位,所以要重新定义光标位置write_add(4,week);}if(s1_num==5)//光标至显示日处,可调节多少日{day--;if(day==0)day=31;write_year_month_day(9,day);write_com(0x80+10);//光标位置移回在显示多少日的个位write_add(5,day);}if(s1_num==6) //光标至显示月处调节月份{month--;if(month==0)month=12;write_year_month_day(6,month);write_com(0x80+7);write_add(6,month);}if(s1_num==7){year--;if(year==-1)year=99;write_year_month_day(3,year);write_com(0x80+4);write_add(7,year);}}}}}void main(){init();//首先初始化各数据while(1){keyscan(); //按键扫描函数}}void timer0() interrupt 1 //定时器0中断服务程序{TH0=(65536-45876)/256;TL0=(65536-45876)%256;count++; //中断次数累加,计数if(count==20) //50微秒乘以20等于1秒{count=0;miao++;if(miao==60) //秒加到60则进位分钟{miao=0; //同时秒数清0fen++;if(fen==60) //分钟加到60则进位小时{fen=0; //同时分钟清0shi++;if(shi==24) //小时加到24则小时清0{shi=0;}write_sfm(4,shi);//小时若变化则重新写入write_add(3,shi);//写入24c02存储起来,小时数的写入地址为3 }write_sfm(7,fen);//分钟若变化则重新写入write_add(2,fen);}write_sfm(10,miao);//秒若变化则重新写入write_add(1,miao);}}/***********************************24C02.h头文件,将以下源代码需存为与保存的C代码根目录下。
51单片机驱动1602液晶的C程序
完成清屏指令。
}
//********************************
//********写指令函数***********设置先向1602写入的数据为地址*
voidLCD_write_command(uchardat)
#defineLCD_DBP1
sbitLCD_RS=P2;
sbitLCD_RW=P2;
sbitLCD_E=P2;
/******定义函数****************/
#defineucharunsignedchar
#defineuintunsignedint
voidLCD_init(void);//声明初始化函数
{
LCD_write_command(0x38);//设置8位格式,2行,5x7
LCD_write_command(0x0c);//整体显示,关光标,不闪烁
//LCD_write_command(0x06);//设定输入方式,增量不移位
//LCD_write_command(0x01);//清除屏幕显示
51单片机驱动1602液晶的C程序
#include
/*****************************************电路连接
P1------DB0~DB7P2.0------RS
P2.1------RW
P2.2------E
*****************************************/
{
LCD_DB=dat;
LCD_RS=0;//指令
LCD_RW=0;//写入
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define LCDIO P2 sbit LCD1602_RS=P0^7; //data command select 1 data 0 command pin 4 sbit LCD1602_RW=P0^6; //read write select 1 read 0 write pin 5 sbit LCD1602_EN=P0^5; //LCD enable signal pin 6 sbit SDA=P2^3; //AT24C02 serial data pin 5 sbit SCLK=P2^2; //AT24C02 serial clock pin 6 /********************************************************************/ void LCD_delay(void);//lcd delay function void LCD_en_command(unsigned char command);//write command function void LCD_en_dat(unsigned char temp);//write data function void LCD_set_xy( unsigned char x, unsigned char y );//set display addres function void LCD_write_char( unsigned x,unsigned char y,unsigned char dat);//write lcd a character function void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);//write lcd string function void LCD_init(void);//lcd initize function /********************************************************************/ void I2C_delay(void);//I2C delay function void I2C_start(void);//I2C start function void I2C_stop(void);//I2C stop function void I2C_send_ack(bit k);//I2C send responsion function void I2C_write_byte(unsigned char dat);//I2C bus write byte function unsigned char I2C_read_byte(void);//I2C bus read byte function /********************************************************************/ void AT24C02_write(unsigned char address,unsigned char dat);//write 24c0 information function unsigned char AT24C02_read(unsigned char address);//read 24c02 information function /********************************************************************/ void Mcu_init(void);//system initize funcition void delay_nms(unsigned int n);//delay functinon unsigned char count[2]; /********************************************************************/ void main() {
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
{ SDA=k; I2C_delay(); SCLK=HIGH; I2C_delay(); SCLK=LOW;
} /*********************************************************************** void I2C_write_byte(unsigned char dat) { unsigned char i; for (i=8;i>0;i--) { SCLK=LOW; I2C_delay(); SDA=(bit)(dat&MSB); dat<<=1; I2C_delay(); SCLK=HIGH; I2C_delay(); } SCLK=LOW; } /*********************************************************************** unsigned char I2C_read_byte(void) { unsigned char i,dat; for (i=0;i<8;i++) { SCLK=LOW; I2C_delay(); SDA=HIGH; I2C_delay(); SCLK=HIGH; dat<<=1; I2C_delay();
} /*********************************************************************** void timer0(void) interrupt 1 using 1 { TH0=-(12000/256); TL0=-(12000%256); count[0]=count[0]+1; if(count[0]==100) { count[0]=0; count[1]=count[1]+1; if(count[1]==99) count[1]=0; } } /***************************************** void Mcu_init(void) { TMOD=0x11; TH0=-(12000/256); TL0=-(12000%256); EA=HIGH;
ET0=HIGH; TR0=HIGH; LCD_init();
} /*********************************************************************** /******************************** I2C PART **************************/ void I2C_delay(void) { _nop_();_nop_();_nop_();_nop_(); } /*********************************************************************** void I2C_start(void) { SDA=HIGH; _nop_(); SCLK=HIGH; _nop_(); SDA=LOW; _nop_(); SCLK=LOW; _nop_(); } /*********************************************************************** void I2C_stop(void) { SDA=LOW; _nop_(); SCLK=HIGH; _nop_(); SDA=HIGH; _nop_(); SCLK=LOW; _nop_(); } /*********************************************************************** void I2C_send_ack(bit k)
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]); }