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

合集下载

基于51单片机驱动DS12CR887时钟芯片用1602液晶显示的完整程序

基于51单片机驱动DS12CR887时钟芯片用1602液晶显示的完整程序

#include<reg52.h>#include<define.h>#define uchar unsigned char#define uint unsigned intvoid delay(uint z);sbit lcdrs=P3^5;sbit lcd_e=P3^4;sbit s1=P3^0;sbit s2=P3^1;sbit s3=P1^3;sbit s4=P1^2;sbit dscs=P1^4;sbit dsas=P1^5;sbit dsrw=P1^6;sbit dsds=P1^7;sbit dsirq=P3^2;sbit beep=P2^3;void set_time();void Disp_xq();void write_ds(uchar,uchar);uchar read_ds(uchar);uchar num,i,y,xq,mon,d,h,m,s,l,*p,als,alm,alh,a,aa;//定义全局变量uchar code table1[]="2013 02 13 TUE ";uchar code table2[]=" 00:00:00 00:00";uchar code table3[]={15,12,8,5,2, 14,9,6,3};uchar code table4[]={0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02, /*年*/0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00, /*月*/0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x00, /*日*/0x11,0x0E,0x1F,0x1F,0x1F,0x0A,0x11,0x00,};/*闹钟符号*/uchar code table5[7][3]={"Mon","Tue","Wen","Thu","Fri","Sat","Sun"}; void delay(uint z)//延时函数{uint i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}void keyscan() //键位函数{ uchar j;if(s4==0) //闹铃开关{delay(5);while(!s4);if(a==0)a=1;else a=0;}if(s1==0) //调时键{ write_ds(0x0A,0x60);delay(5);while(!s1);if(aa<5)set_XY(table3[aa],1);else set_XY(table3[aa],0);write_com(0x0f);aa++;i=1;j=aa-1;if(aa==10){ aa=0;i=0;write_ds(0x0A,0xa0);write_com(0x0c);}while(s1==i){ delay(5);if(s4==0) //退出调时{delay(5);while(!s4);i=0;aa=0;}if(s2==0) //按键每次加1{delay(5);while(!s2);switch(j){delay(5);case 0:{alm++;if(alm==60)alm=0;write_ds(3,alm);write_sfm1(14,alm);write_com(0x80+0x40+15);};break; //闹铃分case 1:{alh++;if(alh==24)alh=0;write_ds(5,alh);write_sfm1(11,alh);write_com(0x80+0x40+12);};break; //闹铃时case 2:{s++;if(s==60)s=0;write_ds(0,s);write_sfm1(7,s);write_com(0x80+0x40+8);};break; //秒case 3:{m++;if(m==60)m=0;write_ds(2,m);write_sfm1(4,m);write_com(0x80+0x40+5);};break; //分case 4:{h++;if(h==24)h=0;write_ds(4,h);write_sfm1(1,h);write_com(0x80+0x40+2);};break; //时case 5:{xq++;if(xq==8)xq=1;write_ds(6,xq);Disp_xq();};break;//星期case 6:{d++;if(d==31)d=1;write_ds(7,d);write_sfm2(8,d);write_com(0x80+9);};break; //日case 7:{mon++;if(mon==13)mon=1;write_ds(8,mon);write_sfm2(5,mon);write_com(0x80+6);};break; //月case 8:{y++;if(y==64)y=0;write_ds(9,y);write_sfm2(2,y);write_com(0x80+3);}; break; //年}}if(s3==0) //按键每次减1{delay(5);while(!s3);switch(j){ delay(5);case 0:{if(alm==0)alm=60;alm--;write_ds(3,alm);write_sfm1(14,alm);write_com(0x80+0x40+15);};break; //闹铃分case 1:{if(alh==0)alh=24;alh--;write_ds(5,alh);write_sfm1(11,alh);write_com(0x80+0x40+12);};break; //闹铃时case 2:{if(s==0)s=60;s--;write_ds(0,s);write_sfm1(7,s);write_com(0x80+0x40+8);};break; //秒case 3:{if(m==0)m=60;m--;write_ds(2,m);write_sfm1(4,m);write_com(0x80+0x40+5);};break; //分case 4:{if(h==0)h=24;h--;write_ds(4,h);write_sfm1(1,h);write_com(0x80+0x40+2);};break; //时case 5:{if(xq==1)xq=8;xq--;write_ds(6,xq);Disp_xq();};break;//星期case 6:{if(d==1)d=31;d--;write_ds(7,d);write_sfm2(8,d);write_com(0x80+9);};break; //日case7:{if(mon==1)mon=13;mon--;write_ds(8,mon);write_sfm2(5,mon);write_com(0x80+6);};break; //月case 8:{if(y==0)y=64;y--;write_ds(9,y);write_sfm2(2,y);write_com(0x80+3);}; break; //年}}}}}void write_com(uchar com)//1602命令函数{lcdrs=0;P0=com;delay(1);lcd_e=1;delay(1);lcd_e=0;}void write_data(uchar date) //1602数据函数{lcdrs=1;P0=date;delay(1);lcd_e=1;delay(1);lcd_e=0;}void set_XY(uchar X,uchar Y)//设置字符显示位置{if(Y==0)X+=0x80;else X|=0xC0;write_com(X);}void DispOneChar(uchar X,uchar Y,uchar Data){ //显示单个字符set_XY(X,Y);write_data(Data);}void DispChars(uchar X,uchar Y,uchar *p,uchar count){ //显示字符串uchar i;for(i=0;i<count;i++){set_XY(X,Y);write_data(*p);X++;p++;}}void HZ() //写入自定义字符{uchar i;write_com(0x40);for(i=0;i<32;i++)write_data(table4[i]);}void write_sfm1(uchar add,uchar date)//写入s m h{ uchar ge,shi;ge=date%10;shi=date/10;write_com(0x80+0x40+add);write_data(0x30+shi);write_data(0x30+ge);}void write_sfm2(uchar add,uchar date)//写入y mon d{ uchar ge,shi;ge=date%10;shi=date/10;write_com(0x80+add);write_data(0x30+shi);write_data(0x30+ge);}void init () //初初初初初初初初初初初初初初始化函数{ beep=0;a=0;aa=0;i=0;lcd_e=0;EA=1;EX0=1;IT0=1;write_ds(0x0B,0x26);//DS寄存器B// read_ds(0x0C); //DS寄存器C write_ds(0x0A,0x20);//DS寄存器Awrite_com(0x38); //指令6write_com(0x0c); //指令4write_com(0x01); //指令1write_com(0x80); //指令8write_com(0x06); //指令3DispChars(0,1,p=table2,16);//00:00:00DispChars(0,0,p=table1,2);//20set_time();}void write_ds(uchar add,uchar date){dscs=0;dsas=1;dsds=1;dsrw=1;P0=add;dsas=0;dsrw=0;P0=date;dsrw=1;dsas=1;dscs=1;}uchar read_ds(uchar add){uchar ds_date;dsas=1;dsds=1;dsrw=1;dscs=0;P0=add;dsas=0;dsds=0;P0=0xff;ds_date=P0;dsds=1;dsas=1;dscs=1;return ds_date;}#include<keyscan.h>void set_time()//设置时间{write_ds(9,13);//年write_ds(8,2);//月write_ds(7,18);//日write_ds(6,4);//星期write_ds(5,0);//闹铃时write_ds(4,0);//时write_ds(3,1);//闹铃分write_ds(2,0);//分write_ds(1,0);//闹铃秒}void Disp_time() //读出时间{if(i==0){ write_ds(0x0A,0xa0);write_com(0x0c);s=read_ds(0);//读秒m=read_ds(2);//读分alm=read_ds(3); //闹铃分h=read_ds(4);//读时alh=read_ds(5);//闹铃时d=read_ds(7);//读日xq=read_ds(6);//读星期mon=read_ds(8);//读月y=read_ds(9);//读年write_sfm1(7,s);//显秒write_sfm1(4,m);//显分write_sfm1(14,alm);//闹铃分write_sfm1(1,h);//显时write_sfm1(11,alh);//闹铃时write_sfm2(8,d);//显日write_sfm2(5,mon);//显月write_sfm2(2,y);//显年}}void Disp_xq() //显星期{uchar t;write_com(0x0c);xq=read_ds(6);for(t=0;t<3;t++)DispOneChar(t+12,0,table5[xq-1][t]);}void Disp_HZ() //显示自定义字符{HZ();write_com(0x0c);DispOneChar(4,0,0x00);//显示年DispOneChar(7,0,0x01);//显示月DispOneChar(10,0,0x02);//显示日if(a==0)DispOneChar(10,1,0x03);//显示闹钟符号else DispOneChar(10,1,0x20);}void main() //主函数{init();while(1){ Disp_HZ();keyscan();Disp_time();Disp_xq();}}void exter() interrupt 0{beep=1;delay(500);// write_ds(0x0C,0x00);}。

51单片机驱动1602液晶显示器c程序

51单片机驱动1602液晶显示器c程序

51单片机驱动1602液晶显示器c程序/*程序效果:单片机控制液晶显示器1602 显示字母数字,用户自行更改io程序原创安全:51hei*/#includereg52.h //头文件#define uchar unsigned char //宏定义#define uint unsigned intuchar code table[]=“51HEI XING XING “ ; //显示的字母uchar code table1[]=“51HEI MCUXUE YUAU” ;sbit lcdrs=P1; //寄存器选择引脚sbit lcdwr=P1;//读写引脚sbit lcde=P1 ; //片选引脚void delay(uchar x) //延时子函数{uchar i,j;for(i=x;i0;i--) for(j=110;j0;j--);}void write_com(uchar com) //写指令子函数{ //根据1602 液晶显示器协议编写P2=com; lcdrs=0;lcdwr=0;delay(5);lcde=0; delay(5);lcde=1; }void write_dat(uchar dat) //写数据子函数{P2=dat; lcdrs=1;lcdwr=0;delay(5);lcde=0;delay(5);lcde=1;}void init() //初始化子函数{write_com(0x01); //清屏write_com(0x3f); //功能设置write_com(0x0d); //显示控制write_com(0x06); //输入方式设置}void main(){ uchar i; //定义局部变量init();write_com(0x80+0x02+0x10); //指针的位置for(i=0;i15;i++) //显示{ write_dat(table[i]); delay(50); //延时,用于调节速度不匹配}write_com(0x80+0x40+0x10);for(i=0;i16;i++){ write_dat(table1[i]); delay(50);}for(i=0;i16;i++){ write_com(0x18); delay(50);} while(1);}tips:感谢大家的阅读,本文由我司收集整编。

51单片机c语言编写的1602液晶显示闹钟

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单片机驱动LCM1602

51单片机驱动LCM1602

功能;驱动LCM1602,LCM1602为深圳誉信公司的16*2液晶字符型显示模块,程序使用读写方式控制LCM1602,地址分别为:写指令口:80H; 读忙检查口:81H;写数据口:82H; 读数据口:83H;;子程序1:写控制指令子程序;子程序2:写CGRAM数据子程序;子程序3:写DDRAM子程序;子程序4:写数据子程序;子程序5:读忙子程序RG_DLY EQU 2HORG 0000HAJMP MAIORG 0030HMAI: MOV SP,#60HLP_MAI: NOPLCALL SB_WRIN;调用写控制指令子程序LCALL SB_WRCG;调用写CGRAMLP2_MAI:NOPLCALL SB_WRDR;调用写DDRAMRT_MAI: AJMP LP2_MAI;---------------------------------------------------------;---------子程序---开始------------------------------------;-1------写控制指令子程序----------SB_WRIN:PUSH ACCMOV R0,#80H ;写指令口MOV A,#01H ;(INSTR.1)LCALL SB_WAT ;清屏MOVX @R0,AMOV A,#02H ;(INSTR.2)LCALL SB_WAT ;A光标归位MOVX @R0,AMOV A,#06H ;(INSTR.3)LCALL SB_WAT ;AC自动加一,画面不动;MOVX @R0,AMOV A,#0CH ;(INSTR.4)0FH:显示开,关标开,闪烁开LCALL SB_WAT ;0CH 显示开,关标、闪烁关 MOVX @R0,A;MOV A,#18H ;(INSTR.5);LCALL SB_WAT ;光标或画面平移指令;MOVX @R0,AMOV A,#38H ;(INSTR.6)LCALL SB_WAT ;8位数据,2行显示,5-7点阵MOVX @R0,APOP ACCRET;-2----写CGRAM数据子程序------SB_WRCG:PUSH ACCMOV DPTR,#CGRMOV R1,#40H;=CGRAM的首地址MOV R2,#4;=4个字符LP_WG0: MOV R3,#8;=每个字符有8位数据即8行LP_WG1: MOV R0,#80HMOV A,R1LCALL SB_WATMOVX @R0,ACLR AMOVC A,@A+DPTRLCALL SB_WRTDINC R1INC DPTRDJNZ R3,LP_WG1DJNZ R2,LP_WG0NOPPOP ACCRET;-3-----写DDRAM子程序--------SB_WRDR:PUSH ACCMOV R0,#80HMOV A,#80H ; 写第一行DDRAM数据LCALL SB_WATMOVX @R0,AMOV A,#49H ; ILCALL SB_WRTDMOV A,#20H ; SPACELCALL SB_WRTDMOV A,#4CH ; LLCALL SB_WRTDMOV A,#4FH ; OLCALL SB_WRTDMOV A,#56H ; VLCALL SB_WRTDMOV A,#45H ; ELCALL SB_WRTDMOV A,#20H ; SPACELCALL SB_WRTDMOV A,#4DH ; MLCALL SB_WRTDMOV A,#59H ; YLCALL SB_WRTDMOV A,#20H ; SPACELCALL SB_WRTDMOV A,#42H ; BLCALL SB_WRTDMOV A,#41H ; ALCALL SB_WRTDMOV A,#42H ; BLCALL SB_WRTDMOV A,#59H ; YLCALL SB_WRTDMOV A,#20H ; EMPTYLCALL SB_WRTDMOV A,#20H ; EMPTYLCALL SB_WRTDMOV R0,#80HMOV A,#0C0H ;写第二行DDRAM LCALL SB_WATMOVX @R0,AMOV A,#49H ; ILCALL SB_WRTDMOV A,#20H ; SPACE LCALL SB_WRTDMOV A,#41H ; ALCALL SB_WRTDMOV A,#4CH ; LLCALL SB_WRTDMOV A,#53H ; SLCALL SB_WRTDMOV A,#4FH ; OLCALL SB_WRTDMOV A,#20H ; SPACELCALL SB_WRTDMOV A,#4DH ; MLCALL SB_WRTDMOV A,#49H ; ILCALL SB_WRTDMOV A,#53H ; SLCALL SB_WRTDMOV A,#53H ; SLCALL SB_WRTDMOV A,#20H ; SPACE LCALL SB_WRTDMOV A,#59H ; YLCALL SB_WRTDMOV A,#4FH ; OLCALL SB_WRTDMOV A,#55H ; ULCALL SB_WRTDMOV R2,#50 ;延时229ms ACALL SB_DLYPOP ACCRET;-4---写数据子程序---------SB_WRTD:MOV R0,#82H ; LCALL SB_WATMOVX @R0,A ;RET;-5---读忙子程序-----------SB_WAT: PUSH ACCPUSH 00HMOV R0,#81HLP_WAT: MOVX A,@R0RLC AJC LP_WATPOP 00HPOP ACCRET;---------子程序----结束----------------------------------- ;---------------------------------------------------------;------延时子程序-----------SB_DLY: PUSH RG_DLY ;LP1_DLY:PUSH RG_DLYLP2_DLY:PUSH RG_DLYDJNZ R2,$POP RG_DLYDJNZ R2,LP2_DLYPOP RG_DLYDJNZ R2,LP1_DLYPOP RG_DLYDJNZ R2,SB_DLYRET;----------CGRAM区---------- CGR:...................;(用户自编码字符区)END。

LCD1602-51单片机汇编程序.

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。

1602液晶初始化程序(汇编)

1602液晶初始化程序(汇编)

〔原创〕1602液晶初始化程序(2007-12-22 18:10:40)标签:1602液晶it/科技汇编语言液晶初始化,显示数字,按秒计数RS EQU P2.0RW EQU P2.1E EQU P2.2IN_0 EQU P0SECL EQU 40H ;秒低位SECH EQU 41H ;秒高位MH1 EQU 42H ;冒号MINL EQU 43H ;分低位MINH EQU 44H ;分高位MH2 EQU 45H ;冒号HOURL EQU 46H ;时低位HOURH EQU 47H ;时高位;*********************************ORG 0000HAJMP STARTORG 000BHAJMP INTT_0START:MOV SP,#70HMOV R2,#20ACALL INIT_LCD ;初始化液晶MOV R5,#00HMOV IN_0,#84H ;写入显示起始地址(第一行第五个位置ACALL ENABLEMOV TH0,#3fH ;50MSMOV TL0,#0b0HMOV TMOD,#01HACALL SJCZSTART1:SETB EASETB ET0SETB TR0LCALL WDATAAJMP START1;*****时间初值*******SJCZ: MOV 40H,#8 ;显示初值是 08:08:08MOV 41H,#0MOV 42H,#10MOV 43H,#8MOV 44H,#0MOV 45H,#10MOV 46H,#8MOV 47H,#0RET;****T0定时器中断****INTT_0: PUSH ACCMOV TL0,#0b0H ;送定时初值MOV TH0,#3fHDJNZ R2,TTMOV R2,#20INC SECL ;秒记数,到60S就清0MOV A,SECLCJNE A,#0AH,TTINC SECHMOV SECL,#0MOV A,SECHCJNE A,#06H,TTMOV SECH,#0INC MINL ;分记数,到60分请0MOV A,MINLCJNE A,#0AH,TTMOV MINL,#0INC MINHMOV A,MINHCJNE A,#06H,TTMOV MINH,#0INC HOURL ;时记数,到24时清0MOV A,HOURLCJNE A,#04H,TT2MOV A,HOURHCJNE A,#02H,TT1MOV HOURL,#0MOV HOURH,#0AJMP TTTT2: CJNE A,#0AH,TTMOV HOURL ,#0INC HOURHAJMP TTTT1: MOV A,HOURLCJNE A,#0AH,TTMOV HOURL ,#0INC HOURHAJMP TTTT: POP ACCRETI;*******液晶初始化*****INIT_LCD:CALL DELAYL ;延时20ms,等待LCD完成电源的启动MOV IN_0,#01H ;清屏并光标复位ACALL ENABLEMOV IN_0,#38H ;设置显示模式:8位2行5x7点阵ACALL ENABLEMOV IN_0,#0FH ;显示器开、光标开、光标允许闪烁ACALL ENABLEMOV IN_0,#06H ;文字不动,光标自动右移ACALL ENABLEMOV IN_0,#0C0H ;写入显示起始地址(第二行第一个位置)ACALL ENABLERET;******写数据程序***WDATA: MOV IN_0,#84H ;写入显示起始地址(第一行第五个位置ACALL ENABLEMOV R1,#8MOV R0,#47HWDATA1: MOV A,@R0MOV DPTR,#TABLEMOVC A,@A+DPTRMOV IN_0,A ;写入数据SETB RSCLR RWCLR EACALL CHECKBUSYSETB E ; 忙检测DEC R0DJNZ R1,WDATA1MOV R1,#8RET;*******显示字母表********TABLE: DB 30H,31H,32H,33H,34H,35H ;0 1 2 3 4 5DB 36H,37H,38H,39H,3AH,80H,2EH ;6 7 8 9 : 空格 .;*********写指令*****ENABLE: CLR RS ;写入控制命令的子程序CLR RWCLR EACALL CHECKBUSYSETB ERET;*******程序忙检测***CHECKBUSY:MOV IN_0,#0FFH ;判断液晶显示器是否忙的子程序CLR RSSETB RWCLR ENOPSETB EJB P0.7,CHECKBUSY ;如果P1.7为高电平表示忙就循环等待RET;******延时程序****DELAY: MOV R6,#50DEL: MOV R7,#48DJNZ R7,$DJNZ R6,DELRETDELAYL: MOV R7,#100 ;长延时20msD1: MOV R6,#98DJNZ R6,$DJNZ R7,D1RETEND51单片机的1602没做过,只做过其他的控制。

51单片机控制1602LCD显示程序

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();}}。

51单片机计算器1602显示程序

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液晶汇编语言程序
51 单片机驱动 1602 液晶汇编语言程序
LCMRS EQU P2.4 LCMRW EQU P2.5 LCMEN EQU P2.6 LCMDATA EQU P0 ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV SP,#60H LCALL LCMSET LCALL LCMCLR MOV A,#80H LCALL LCMWR0 MOV DPTR,#TAB0 LCALL LCMWR2 MOV A,#0C0H LCALL LCMWR0 MOV DPTR,#TAB1 LCALL LCMWR2 SJMP $
LCALL LCMLAY CLR LCMEN CLR LCMRS CLR LCMRW SETB LCMEN MOV LCMDATA,A
CLR LCMEN RET LCMWR1: ;写入数据
LCALL LCMLAY CLR LCMEN SETB LCMRS CLR LCMRW SETB LCMEN MOV LCMDATA,A CLR LCMEN RET LCMWR2: PUSH ACC LOOP1: CLR A MOVC A,@A+DPTR JZ LOOP2 LCALL LCMWR1 INC DPTR LJMP LOOP1 LOOP2: POP ACC 写入字符串(字符串属于数据)
TAB0: DB &quot;I AM YUAN MING&quot;,00H TAB1: DB &quot;NICE TO MEET YOU&quot;,00H LCMLAY: PUSH ACC LOOP: CLR LCMEN CLR LCMRS SETB LCMRW SETB LCMEN MOV A,LCMDATA CLR LCMEN JB ACC.7,LOOP POP ACC LCALL DELAY RET LCMWR0: ;写入指令 ;读忙程序,用于判断 d7 是否为 0

我的51单片机之 液晶1602 的C语言和汇编编程

我的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; }

经典的KEIL_C51_LCD1602_4总线驱动+中文注释程序(有程序)

经典的KEIL_C51_LCD1602_4总线驱动+中文注释程序(有程序)

网上下载的资料。

因为论坛不支持.doc文件,我就直接复制上来了。

==================================================================/******************************************************************************经典的KEIL_C51_LCD1602_4总线驱动+中文注释程序文件名:1602.ccpu:STC12C5A32S2 晶振频率:11.0592Mhz编程者:BG1EQ@2011-8-25 测试通过*******************************************************************************LCD1602 实际硬件连接:LCM_RS-----P2^0; //1602定义引脚LCM_RW-----P2^1;LCM_E -----P2^7;LCM_DB0-----P0.0LCM_DB1-----P0.1LCM_DB2-----P0.2LCM_DB3-----P0.3LCM_DB4-----P0.4LCM_DB5-----P0.5LCM_DB6-----P0.6LCM_DB7-----P0.7*******************************************************************************/#include <reg52.h> //包含52头文件#include <string.h> //包含初试化头文件#include <intrins.h>//#include <stdlib.h> //包含标准函数库头文件#include "4bitlcm1602.h" //包含delay头文件#include "delay.h" //包含delay头文件#def ine uchar unsigned char#def ine uint unsigned int//------硬件端口定义--------------------------------//------函数(声明)--------------------------------void sys_init(void); //系统初始化函数(声明)/****************************************************************************************** * 函数名称:主程序* 功能描述:******************************************************************************************/ main() //主程序入口{// LCMInit(); //初始化LCDsys_init(); //系统初始化while(1){ //主程序循环(开始)LCD_cls(); //清屏DisplayListChar(0,0," MONITOR V1.0 "); //第1行显示DisplayListChar(0,1," APPLY IN CHINA "); //第2行显示Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();LCD_cls(); //清屏DisplayListChar(0,0," BG1EQ@ "); //第1行显示DisplayListChar(0,1," 2011Y 08M 25D "); //第2行显示Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();LCD_cls(); //清屏DisplayOneChar(0,0,'0'); //显示字符DisplayOneChar(1,0,'1'); //显示字符DisplayOneChar(2,0,'2'); //显示字符DisplayOneChar(3,0,'3'); //显示字符DisplayOneChar(4,0,'4'); //显示字符DisplayOneChar(5,0,'5'); //显示字符DisplayOneChar(6,0,'6'); //显示字符DisplayOneChar(7,0,'7'); //显示字符DisplayOneChar(8,0,'8'); //显示字符DisplayOneChar(9,0,'9'); //显示字符DisplayOneChar(10,0,'0'); //显示字符DisplayOneChar(11,0,'-'); //显示字符DisplayOneChar(12,0,'+'); //显示字符DisplayOneChar(13,0,'='); //显示字符DisplayOneChar(14,0,'#'); //显示字符DisplayOneChar(15,0,'$'); //显示字符Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();LCD_cls(); //清屏DisplayOneChar(0,1,'A'); //显示字符DisplayOneChar(1,1,'B'); //显示字符DisplayOneChar(2,1,'C'); //显示字符DisplayOneChar(3,1,'D'); //显示字符DisplayOneChar(4,1,'E'); //显示字符DisplayOneChar(5,1,'F'); //显示字符DisplayOneChar(6,1,'G'); //显示字符DisplayOneChar(7,1,'H'); //显示字符DisplayOneChar(8,1,'I'); //显示字符DisplayOneChar(9,1,'J'); //显示字符DisplayOneChar(10,1,'K'); //显示字符DisplayOneChar(11,1,'L'); //显示字符DisplayOneChar(12,1,'M'); //显示字符DisplayOneChar(13,1,'N'); //显示字符DisplayOneChar(14,1,'O'); //显示字符DisplayOneChar(15,1,'P'); //显示字符Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();} //主程序循环结束返回}/****************************************************************************************** * 函数名称:sys_init* 功能描述:系统初始化******************************************************************************************/ void sys_init(){Delay400Ms(); //上电后延时,让LCD1602进入稳定状态,LCMInit(); //初始化LCD1602}以上是C51主程序以下是C51 模块化4BITLCM1602.H函数程序/*--------------------------------------------------------------------------4BITLCM1602.H4位总线驱动LCD1602 头文件--------------------------------------------------------------------------*/#if ndef __4BITLCM1602_H__#def ine __4BITLCM1602_H__/*******************************************************************************///#include <reg52.h> //包含52头文件//#include <string.h> //包含初试化头文件//#include <intrins.h>//#include <stdlib.h> //包含标准函数库头文件#def ine uchar unsigned char#def ine uint unsigned int//------硬件端口定义--------------------------------sbit LCM_RS = P2^0; //1602定义引脚sbit LCM_R W = P2^1;sbit LCM_E = P2^7;sbit LCD7=P0^7;sbit LCD6=P0^6;sbit LCD5=P0^5;sbit LCD4=P0^4;uchar bdata lcdbuff; //声明,全局的、可以位寻址的变量sbit lcd_buff7=lcdbuff^7;sbit lcd_buff6=lcdbuff^6;sbit lcd_buff5=lcdbuff^5;sbit lcd_buff4=lcdbuff^4;sbit lcd_buff3=lcdbuff^3;sbit lcd_buff2=lcdbuff^2;sbit lcd_buff1=lcdbuff^1;sbit lcd_buff0=lcdbuff^0;//------函数(声明)--------------------------------void LCMInit(void); //LCM屏初始化void R_BF(); //读忙标志BFvoid w_com(uchar com); //写指令函数void w_cdata(void); //写数据函数void WriteDataLCM(unsigned char WDLCM); //LCM屏写数据函数(声明)void LCD_cls(void); //LCM屏清屏void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);/******************************************************************************************* 函数名称:WriteDataLCM* 功能描述:LCM写数据******************************************************************************************/void WriteDataLCM(uchar WDLCM){R_BF();lcdbuff = WDLCM;LCM_RS = 1;LCM_R W = 0;w_cdata(); //这里写入字符码}/****************************************************************************************** * 函数名称:DisplayListChar* 功能描述:按指定位置显示一串字符,原来的遇到空格0x20就不显示* 函数说明:******************************************************************************************/ void DisplayListChar(uchar X, uchar Y, uchar code *DData){uchar ListLength,j; //定义局部变量ListLength = strlen(DData); //读取字符串长度X &= 0xF; //限制X不能大于15 Y &= 0x1; //限制Y不能大于1 if (X <= 0xF)//X坐标应小于0xF{f or(j=0;j<ListLength;j++){DisplayOneChar(X, Y, DData[j]); //显示单个字符X++;}}}/****************************************************************************************** * 函数名称:DisplayOneChar* 功能描述:按指定位置显示一个字符* 函数说明:******************************************************************************************/ void DisplayOneChar(uchar X, uchar Y, uchar DData){X &= 0xF; //限制X不能大于15Y &= 0x1; //限制Y不能大于1if (Y) X |= 0x40; //如果Y是“1”,则合成显示第二行时地址码+0x40;X |= 0x80; //合成的、显示位置码,指令码:1Yxx xxxx (B)w_com(X); //写入地址码,X数据包含字符的显示位置WriteDataLCM(DData); //写入数据码,要显示的字符数据}/****************************************************************************************** * 函数名称:LCMInit* 功能描述:LCM初始化* 函数说明:LCM初始化******************************************************************************************/ void LCMInit(void){w_com(0x2c); //功能设置为:四位数据总线w_com(0x01); //清屏w_com(0x06); //设置显示输入模式(A C指针自加1,显示不移位)w_com(0x0c); //显示开/关设置(设置显示、光标和闪烁开关)}/****************************************************************************************** * 函数名称:R_BF* 功能描述:读忙标志BF* 函数说明:读忙标志BF*******************************************************************************************/ void R_BF(){LCD7=1; //BF端口在DB7,置LCD7为“1”等待测试本端口电平LCM_RS=0;LCM_R W=1;LCM_E=1; //RS=0;R W=1;E=1表示读忙标志BFwhile(LCD7); //若内部操作位BF忙CPU就等待BF不忙才能操作LCM_E=0;}/****************************************************************************************** * 函数名称:w_com* 功能描述:写命令* 函数说明:主要用来初始化一些设置显示、输入模式、显示开关、光标、移位、功能、地址*******************************************************************************************/ void w_com(uchar com){R_BF();lcdbuff = com;LCM_RS = 0;LCM_R W = 0;w_cdata();}/****************************************************************************************** * 函数名称:w_cdata* 功能描述:写命令的公共* 函数说明:四位数据总线, 每发送一字节,先发送高四位,再发送低四位*******************************************************************************************/ void w_cdata(void){//-----写命令的高4位LCD7 = lcd_buff7;LCD6 = lcd_buff6;LCD5 = lcd_buff5;LCD4 = lcd_buff4;LCM_E = 1;_nop_();LCM_E = 0;_nop_();_nop_();//-----写命令的低4位LCD7 = lcd_buff3;LCD6 = lcd_buff2;LCD5 = lcd_buff1;LCD4 = lcd_buff0;LCM_E = 1;_nop_();LCM_E = 0;}/****************************************************************************************** * 函数名称:LCD_cls* 功能描述:LCM清屏*******************************************************************************************/void LCD_cls(void){w_com(0x01); //清屏}#endi f以下是C51 模块化DELA Y.H 函数程序/*--------------------------------------------------------------------------DELA Y.H延时函数头文件--------------------------------------------------------------------------*/#if ndef __DELA Y_H__#def ine __DELA Y_H__#def ine uchar unsigned char#def ine uint unsigned int//------函数(声明)--------------------------------void Delay400Ms(void); //延时400mS函数(子程序)/******************************************************************************************* 函数名称:Delay400Ms* 功能描述:400ms延时******************************************************************************************/ void Delay400Ms(void){uchar TempCycA = 30; //1周期MPU用30, 12周期MPU用5uint TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);};}#endi f。

C51单片机对1602lcd模块的驱动

C51单片机对1602lcd模块的驱动
{
lcm_data = 0;
lcm_write_command(0x38,0); //16*2显示,5*7点阵,8位数据接口,不检测忙
delay5ms();
lcm_write_command(0x38,0);
delay5ms();
lcm_write_command(0x38,0); //三次显示模式,不检测忙
{
y = y
x = x //限制2行,没行15个字
if(y)
x =x + 0x40; //算RAM地址
x = x + 0x80;
lcm_write_command(x,0);
lcm_write_data(disp_data);
}
/***********************************
//传递参数:unsigned char x,unsigned char y,unsigned char disp_data
//返回值:无
//函数功能:指定位置显示一个字符
//函数说明:
***********************************/
void disp_one_char(unsigned char x,unsigned char y,unsigned disp_data)
return lcm_data;
}
/***********************************
//函数名称:void lcm_write_data(unsigned char wd_lcm)
//传递参数:unsigned char wd_lcm
//返回值:无
//函数功能:lcm写数据
//函数说明:

LCD1602.H51单片机LCD1602显示驱动程序

LCD1602.H51单片机LCD1602显示驱动程序

LCD1602.H(51单片机LCD1602显示驱动程序)/*无敌高氯酸修改函数功能delay_ms(time) 延时time毫秒LCD_init() 初始化清空LCD屏LCD_print(x,y,str)在(x,y)坐标上显示str字符0=;0;i--)for (j=0;j<1140;j++);}/************************************************ *********************函数名称:LCD_print()功能描述:显示字符或字符串入口参数:字符或字符串返回值:无************************************************* *********************/void LCD_print(uchar x,uchar y,uchar *str){LCD_gotoxy(x,y);while(*str!='\0'){LCD_wdata(*str);str++;}}/************************************************** *******************函数名称:LCD_wcommand()功能描述:LCD写指令入口参数:uchar lcd_cmd:命令字,uchar busy_f:忙检测标志位返回值:无************************************************* ********************/void LCD_wcommand(uchar lcd_cmd,busy_f){if (busy_f) Rstatus(); //不忙才执行下个程序Port = lcd_cmd;Rw = 0;En = 0;En = 0;En = 1;}/************************************************ *********************函数名称:LCD_wdata()功能描述:LCD写数据入口参数:uchar wdata:所写数据返回值:无************************************************* ********************/void LCD_wdata(uchar wdata){Rstatus();Port = wdata;Rs = 1;Rw = 0;En = 0; //若晶振速度太高可以在这后加小的延时En = 0; //延时}/************************************************ *********************函数名称:LCD_rdata()功能描述:LCD读数据入口参数:无返回值:所读数据************************************************* ********************/uchar LCD_rdata(void){Rs = 1;Rw = 1;En = 0;En = 0;En = 1;return Port;}/************************************************ *********************函数名称:Rstatus()功能描述:LCD读忙状态入口参数:无返回值:若忙,则等待,不忙则返回Port************************************************* ********************/uchar Rstatus(void){Port = 0xFF;Rs = 0;Rw = 1;En = 0;En = 0;En = 1;while (Port & 0x80); //检测忙信号,不忙则退出等待return(Port);}/************************************************ *********************函数名称:LCD_init()功能描述:LCD初始化入口参数:无返回值:无************************************************* ********************/void LCD_init(void){Port = 0;LCD_wcommand(0x38,0); //三次显示模式设置,不检测忙信号delay_ms(3);LCD_wcommand(0x38,0);delay_ms(3);LCD_wcommand(0x38,0);delay_ms(3);LCD_wcommand(0x38,1); //显示模式设置(0X38双行(5*7),0X34单行(5*10)),0X30单行(5*7);开始要求每次检测忙信号LCD_wcommand(0x08,1); //关闭显示LCD_wcommand(0x01,1); //显示清屏LCD_wcommand(0x06,1); // 显示光标移动设置LCD_wcommand(0x0C,1); // 显示开及光标设置}/************************************************ *********************函数名称:LCD_gotoxy()功能描述:定位到(x,y)位置入口参数:x为行(0~1),y为列(0~15)返回值:无************************************************* ********************/void LCD_gotoxy(uchar x, uchar y){x &= 0x1; //限制x不能大于1,y不能大于15y &= 0xF;if(!x) LCD_wcommand(0x80|y,1);else LCD_wcommand(0xC0|y,1);}。

C51单片机控制1602液晶屏

C51单片机控制1602液晶屏

C51单片机用一组I/O口驱动1602液晶屏中国兵器集团北方华锦化学工业股份有限公司热电公司任宝烈此程序利用C51单片机可位寻址寄存器即可以位寻址又可以按字节寻址的特点,实现对1602液晶屏的控制。

11.0592主频时unsigned char bdata C; //在位寻址区定义字符变量Csbit C7=C^7;sbit C6=C^6;sbit C5=C^5;sbit C4=C^4;sbit C3=C^3;sbit C2=C^2;sbit C1=C^1;sbit C0=C^0;sbit RS=P1^1;sbit RW=P1^2;sbit EN=P1^3;sbit I4=P1^4;sbit I5=P1^5;sbit I6=P1^6;sbit I7=P1^7;/****************延时***************/void delay_ms(unsigned int i){unsigned int t;while(i--){for(t=0;t<123;t++);}}/***用LCD1602高四位数据线写入命令**/void write_com(unsigned char command){C=command;RS=0;RW=0;EN=0; //写命令delay_ms(1);I7=C7;I6=C6;I5=C5;I4=C4;EN=1;delay_ms(6); //延时EN=0; //下降沿将数据写入LCD1602 delay_ms(1);I7=C3;I6=C2;I5=C1;I4=C0;EN=1;delay_ms(1); //延时EN=0; //下降沿将数据写入LCD1602 }/**用LCD1602高四位数据线写入数据**/void write_dat(unsigned char dat){C=dat;RS=1;RW=0;EN=0;delay_ms(1);I7=C7;I6=C6;I5=C5;I4=C4;EN=1;delay_ms(6); //延时EN=0;delay_ms(1);I7=C3;I6=C2;I5=C1;I4=C0;EN=1;delay_ms(1); //延时EN=0;}/********LCD1602初始化*************/void LCD_init(void){write_com(0x02);write_com(0x28);write_com(0x0c);write_com(0x80);write_com(0x01); //清屏}/*******设置LCD1602列、行**********/void LCD_sor(unsigned char x,unsigned y){unsigned char address;if(y==0)address=0x80+x;elseaddress=0xC0+x;write_com(address);}/*******************/void LCD_str(unsigned x,unsigned char y,unsigned char *str) {LCD_sor(x,y);while((*str)!='\0'){write_dat(*str);str++;}}。

51单片机经典C程序(1602)

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源代码

51单片机控制LCD液晶1602源代码
void Lcd1602_Clear_Line(unsigned char line);
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单片机)

(完整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单片机驱动LCD1602程序设计(C语言)

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