c51单片机万年历模拟,12864LCD屏显示实时温度与时间

前言

c51单片机万年历模拟期末作品,用到了温度传感模块及12864液晶显示模块及矩阵键盘模块及复位电路,电源模块,晶振模块,可在12864屏上显示实时温度与时间,本人自己做的期末作品,仅供同学们研究学习。


一、效果展示

时间是变化的,此图是随便抓的一张
矩阵按键控制显示温度

二、连线

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
矩阵键盘就链接了一个跳帽

二、部分代码示例

1.端口定义

代码如下(示例):

#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
// 矩阵键盘
unsigned char j,k,jp,key;
bit flag = 0;
sbit row1=P2^5;                //行端口定义
sbit row2=P2^4;
sbit row3=P2^3;
sbit row4=P2^2;

sbit col1=P1^7;                 //列端口定义
sbit col2=P1^6;
sbit col3=P2^0;
sbit col4=P2^1;
/*TS12864A-3 端口定义*/
#define LCD_data  P0             //数据口
sbit LCD_RS  =  P3^5;            //寄存器选择输入
sbit LCD_RW  =  P3^6;            //液晶读/写控制
sbit LCD_EN  =  P3^4;            //液晶使能控制
sbit LCD_PSB =  P3^7;            //串/并方式控制
 
uint temp;
float f_temp;
sbit s1=P2^2;
sbit s2=P2^3;
sbit s3=P2^4;
sbit ds=P3^3;     //温度传感器信号线

2.温度显示函数

代码如下(示例):

void tempdisplay()					  //温度显示函数
 {
 uint mm;
 tempchange();
  mm=get_temp(); 
  tab2[10]=mm%1000/100+'0';
  tab2[11]=mm%100/10+'0';
  tab2[12]='.';
  tab2[13]=mm%10+'0';
  wr_com(0x80); 
 for(i=0;i<14;i++)
{
wr_date(tab2[i]);
delay(10);
}
wr_com(0x88); 		//显示作者1
 for(i=0;i<9;i++)
{
wr_date(tab4[i]);
delay(10);
}
wr_com(0x98);  	//显示作者2
 for(i=0;i<9;i++)
{
wr_date(tab5[i]);
delay(10);
}
}

3.时间显示函数

代码如下(示例):

void display()		  //时间显示函数
{
change();
wr_com(0x90);			 //数字显示位置
wr_date(y1+48);
delay(10);
wr_date(y2+48);
delay(10);
wr_date(y3+48);
delay(10);
wr_date(y4+48);
delay(10);
wr_com(0x93);
wr_date(mol+48);
delay(10);
wr_date(mor+48);
delay(10);
wr_com(0x95);
wr_date(dl+48);
delay(10);
wr_date(dr+48);
delay(10);
wr_com(0x89);
wr_date(hl+48);
delay(10);
wr_date(hr+48);
delay(10);
wr_com(0x8b);
wr_date(ml+48);
delay(10);
wr_date(mr+48);
delay(10);
wr_com(0x8d);
wr_date(sl+48);
delay(10);
wr_date(sr+48);
delay(10);
     
}

4.主函数

代码如下(示例):

void main()
{

lcd_init();    //lcd初始化
init();      //定时器初始化
fistdispay();			   //汉字显示
while(1)
{
keyScan();
if(flag)
  {
  lcd_init();    //lcd初始化
    while(1)
     {
     tempdisplay();			 //温度显示
     }
  }  
else
  {
 	 display();		  //时间显示
     calendar_change();   //判断闰年非闰年	
	  
   }
   }
}

总结

在这里插入图片描述

提示:
上述为部分代码,
想学习参考的同学可以关注公众号:老王搞电脑
后台回复:单片机
即可获得源程序及pcb制版图


  • 12
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
/*-----------------------------------------------------------*/ #define LCD_OFF 0x3E #define LCD_ON 0x3F #define Add_X 0xB8 //the start address of the page 0 ;(0~7) #define Add_Y 0x40 //the start address of the Y counter ; (0~64) #define Add_Z 0xC0 //the start address of the DDRAM ; (0~64) #define UPLINE 0x01 #define UNDERLINE 0x80 /*-----------------------------------------------------------*/ #define LCD12864_DATA_PORT P0 sbit LCD12864_EN =P1^4; sbit LCD12864_RW =P1^3; //0:write ; 1:read sbit LCD12864_RS =P1^2; //0:the command .1:the data sbit LCD12864_CS_L =P1^1; //select the left of the lcd when 1 sbit LCD12864_CS_R =P1^0; sbit LCD12864_RST =P1^5; /*------------------------------------------------------------*/ void delayus(unsigned int us) { while(us--); } void delayms(unsigned ms) { unsigned int i,j; for (i=0;i<ms;i++) { for (j=0;j<1000;j++) ; } } /*--------------------------select the LCD--------------------*/ void LCDSel(unsigned char sel) { switch(sel) { case 0: LCD12864_CS_L=0;LCD12864_CS_R=0;break; case 1: LCD12864_CS_L=1;LCD12864_CS_R=0;break; //left case 2: LCD12864_CS_L=0;LCD12864_CS_R=1;break; //right default:; }; } /*------------------------------------------------------------*/ void WaitLCD() { unsigned char flag; LCD12864_DATA_PORT=0xFF; LCD12864_RW=1; LCD12864_RS=0; LCD12864_EN=1; LCD12864_EN=1; LCD12864_EN=0; LCD12864_DATA_PORT=0xFF; //读有效数据 LCD12864_RW=1; LCD12864_RS=0; ; LCD12864_EN=1; do { flag=LCD12864_DATA_PORT; LCD12864_DATA_PORT=0xFF; }while(!((flag&0x80)==0x80)); LCD12864_EN=0; } //*/ /*-------------------------------------------------------------*/ void WriteDatToLCD12864(unsigned char dat) { WaitLCD(); LCD12864_RS=1; //the data LCD12864_RW=0; //write LCD12864_DATA_PORT=dat; LCD12864_EN=1; ; LCD12864_EN=0;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值