c语言LcD动态显示技术资料讲解.docx
- 文档编号:22990941
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:18
- 大小:49.92KB
c语言LcD动态显示技术资料讲解.docx
《c语言LcD动态显示技术资料讲解.docx》由会员分享,可在线阅读,更多相关《c语言LcD动态显示技术资料讲解.docx(18页珍藏版)》请在冰豆网上搜索。
c语言LcD动态显示技术资料讲解
c语言LcD动态显示技术
//实例84:
液晶时钟设计
#include
#include
#include
sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.0引脚
sbitRW=P2^1;//读写选择位,将RW位定义为P2.1引脚
sbitE=P2^2;//使能信号位,将E位定义为P2.2引脚
sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.7引脚
sbitk0=P1^0;
sbitk1=P1^1;
sbitk2=P1^2;
sbitk3=P1^3;
sbitk4=P1^4;
sbitk5=P1^5;
sbitk6=P1^6;
sbitk7=P1^7;
sbitk8=P2^6;
sbitk9=P2^7;
unsignedchartable_1[9]={0x00,0x00,0x3A,0x00,0x00,0x3A,0x00,0x00,0x00};//定义字符数组显示数字
unsignedcharcount;//定义变量统计中断累计次数
unsignedchars,m,h;//定义变量储存秒、分钟和小时
/*****************************************************
函数功能:
延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
voiddelay1ms()
{
unsignedchari,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:
延时若干毫秒
入口参数:
n
***************************************************/
voiddelay(unsignedcharn)
{
unsignedchari;
if(k9==0)
n=n/2;
for(i=0;i delay1ms(); } /***************************************************** 函数功能: 判断液晶模块的忙碌状态 返回值: result。 result=1,忙碌;result=0,不忙 ***************************************************/ unsignedcharBusyTest(void) { bitresult; RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1;//E=1,才允许读写 _nop_();//空操作 _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 result=BF;//将忙碌标志电平赋给result E=0;//将E恢复低电平 returnresult; } /***************************************************** 函数功能: 将模式设置指令或显示地址写入液晶模块 入口参数: dictate ***************************************************/ voidWriteInstruction(unsignedchardictate) { while(BusyTest()==1);//如果忙就等待 RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_();//空操作两个机器周期,给硬件反应时间 P0=dictate;//将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令 } /******************************************** 函数功能: 转换 ******************************************************************************/ voidCovhms() { table_1[0]=h/10+0x30; table_1[1]=h%10+0x30; table_1[3]=m/10+0x30; table_1[4]=m%10+0x30; table_1[6]=s/10+0x30; table_1[7]=s%10+0x30; } /***************************************************** 函数功能: 指定字符显示的实际地址 入口参数: x ***************************************************/ voidWriteAddress(unsignedcharx) { WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x" } /***************************************************** 函数功能: 将数据(字符的标准ASCII码)写入液晶模块 入口参数: y(为字符常量) ***************************************************/ voidWriteData(unsignedchary) { while(BusyTest()==1); RS=1;//RS为高电平,RW为低电平时,可以写入数据 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" Covhms(); P0=y;//将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能: 对LCD的显示模式进行初始化设置 ***************************************************/ voidLcdInitiate(void) { delay(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间 WriteInstruction(0x38);//显示模式设置: 16×2显示,5×7点阵,8位数据接口 delay(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x38); delay(5); WriteInstruction(0x38);//连续三次,确保初始化成功 delay(5); WriteInstruction(0x0c);//显示模式设置: 显示开,无光标,光标不闪烁 delay(5); WriteInstruction(0x06);//显示模式设置: 光标右移,字符不移 delay(5); WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除 delay(5); } /************************mainfunction***********************************************/ voidmain(void) { unsignedchari,j,k=0x00; LcdInitiate();//调用LCD初始化函数 TMOD=0x01;//使用定时器T0的模式1 TH0=0xD8;//定时器T0的高8位设置初值 TL0=0xF0;//定时器T0的低8位设置初值 EA=1;//开总中断 ET0=1;//定时器T0中断允许 TR0=1;//启动定时器T0 count=0;//中断次数初始化为0 s=0;//秒初始化为0 m=0;//分钟初始化为0 h=12; while(! k0)//如果是按键k0按下静止 { WriteAddress(0x10);//写地址 for(i=0;i<8;i++) {WriteData(table_1[i]);} LcdInitiate(); } while(! k1)//如果是按键k1按下整体闪烁 { WriteAddress(0x10);//写地址 for(i=0;i<8;i++) {WriteData(table_1[i]);}; delay(5000); delay(5000); delay(5000); WriteInstruction(0x01); delay(5000); delay(5000); delay(5000); } while(! k2)//如果是按键k2按下单字闪烁 { for(j=0;j<8;j++) { WriteAddress(0x50);//写地址 for(i=0;i<8;i++) {WriteData(table_1[i]);} delay(5000); delay(5000); LcdInitiate(); WriteAddress(0x50); for(i=0;i<8;i++) { if(i==j) table_1[j]=0x00; WriteData(table_1[i]); }; if(j==2||j==5) table_1[j]=0x3A; delay(5000); delay(5000); LcdInitiate(); }; }; while(! k3)//如果是按键k3按下向前向后滚动 { for(j=0;j<33;j++) { WriteAddress(0x00+j);//写地址 for(i=0;i<8;i++) {WriteData(table_1[i]);}; delay(5000); LcdInitiate(); } for(j=31;j>0;j--) { WriteAddress(0x00+j);//写地址 for(i=0;i<8;i++) {WriteData(table_1[i]);}; delay(5000); LcdInitiate(); }; }; while(! k4)//如果是按键k4按下单字移动 { for(j=0;j<8;j++) { WriteAddress(0x50);//写地址 for(i=0;i<8;i++) {WriteData(table_1[i]);}; delay(5000); delay(5000); LcdInitiate(); WriteAddress(0x10+j); WriteData(table_1[j]); WriteAddress(0x50); for(i=0;i<8;i++) { if(i==j) table_1[j]=0x00; WriteData(table_1[i]); }; if(j==2||j==5) table_1[j]=0x3A; delay(5000); delay(5000); LcdInitiate(); } }; while(! k5)//如果是按键k5按下向两边扩张 { WriteAddress(0x50);//写地址 for(i=0;i<8;i++) {WriteData(table_1[i]);}; delay(5000); delay(5000); LcdInitiate(); WriteAddress(0x4c);//写地址 for(i=0;i<8;i++) { WriteData(table_1[i]); WriteData(table_1[8]); }; delay(5000); delay(5000); LcdInitiate(); WriteAddress(0x48);//写地址 for(i=0;i<8;i++) { WriteData(table_1[i]); WriteData(table_1[8]); WriteData(table_1[8]); }; delay(5000); delay(5000); LcdInitiate(); WriteAddress(0x44);//写地址 for(i=0;i<8;i++) { WriteData(table_1[i]); WriteData(table_1[8]); WriteData(table_1[8]); WriteData(table_1[8]); }; delay(5000); delay(5000); LcdInitiate(); WriteAddress(0x40);//写地址 for(i=0;i<8;i++) { WriteData(table_1[i]); WriteData(table_1[8]); WriteData(table_1[8]); WriteData(table_1[8]); WriteData(table_1[8]); }; delay(5000); delay(5000); LcdInitiate(); } while(! k6)//如果是按键k6按下向中间压缩 {WriteAddress(0x40);//写地址 for(i=0;i<8;i++) { WriteData(table_1[i]); WriteData(table_1[8]); WriteData(table_1[8]); WriteData(table_1[8]); WriteData(table_1[8]); }; delay(5000); delay(5000); LcdInitiate(); WriteAddress(0x44);//写地址 for(i=0;i<8;i++) { WriteData(table_1[i]); WriteData(table_1[8]); WriteData(table_1[8]); WriteData(table_1[8]); }; delay(5000); delay(5000); LcdInitiate(); WriteAddress(0x48);//写地址 for(i=0;i<8;i++) { WriteData(table_1[i]); WriteData(table_1[8]); WriteData(table_1[8]); }; delay(5000); delay(5000); LcdInitiate(); WriteAddress(0x4c);//写地址 for(i=0;i<8;i++) { WriteData(table_1[i]); WriteData(table_1[8]); }; delay(5000); delay(5000); LcdInitiate(); WriteAddress(0x50);//写地址 for(i=0;i<8;i++) {WriteData(table_1[i]);}; delay(5000); delay(5000); LcdInitiate(); } while(! k7)//如果是按键k7按下上下移动 { WriteAddress(0x10);//写地址 for(i=0;i<8;i++) {WriteData(table_1[i]);}; delay(5000); LcdInitiate(); WriteAddress(0x50);//写地址 for(i=0;i<8;i++) {WriteData(table_1[i]);}; delay(5000); LcdInitiate(); } while(! k8)//如果是按键k8按下,组合运动 { for(i=0;i<8;i++) { for(k=0;k<8;k++) { WriteAddress(0x10+k);//写地址 WriteData(table_1[i]); WriteAddress(0x50); for(j=0;j<8;j++) { if(i==j) table_1[j]=0x00; WriteData(table_1[j]); } if(i==2||i==5) table_1[i]=0x3A; delay(5000); LcdInitiate(); WriteAddress(0x50); for(j=0;j<8;j++) { if(i==j) table_1[j]=0x00; WriteData(table_1[j]); } if(i==2||i==5) table_1[i]=0x3A; delay(5000); delay(5000); delay(5000); } } } } /******************************************************* 函数功能: 定时器T0的中断服务函数 ********************************************************/ voidTime0(void)interrupt1using1//定时器T0的中断编号为1,使用第1组工作寄存器 { count++;//每产生1次中断,中断累计次数加1 if(count==100)//如果中断次数计满100次 { count=0;//中断累计次数清0 s++;//秒加1 } if(s==60)//如果计满60秒 { s=0;//秒清0 m++;//分钟加1 } if(m==60)//如果计满60分 { m=0;//分钟清0 h++;//小时加1 } if(h==24)//如果计满24小时 { h=0;//小时清0 } TH0=0xD8;//定时器T0高8位重新赋初值 TL0=0xF0;//定时器T0低8位重新赋初值 } /**************************************************************/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 LcD 动态 显示 技术资料 讲解