51单片机1602液晶程序

发布者:Howard_Sun最新更新时间:2016-05-31 来源: eefocus关键字:51单片机  1602液晶  显示控制 手机看文章 扫描二维码
随时随地手机看文章
#include

#define Lcd_Data P0
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit Busy=P0^7;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit buzzer=P3^7;
unsigned int hour,min,second,day,month,year;  ////////定义的几个时间
unsigned char code Time[] = {"Time:           "};////用于显示
unsigned char code num[] = {"0123456789ABCDEF"};/////////////用于液晶显示
unsigned char code haha[]={"^_^"};
unsigned char code middle[]={":"};
unsigned int numberflag;
 unsigned int number;
unsigned  code heart[]={0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f, 
                        0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, 
                       0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, 
                       0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E, 
                      0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00, 
                      0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01, 
                      0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00, 
                      0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00};//心图案
unsigned int t0_1S;//定义0.1S变量
unsigned char keyvalue;//定义键值
void delay(unsigned int time)/////////////////////////////////////////////延时程序
{
 while(time--);
}
void Delay_1ms(unsigned char t)///////////////////////////精确延时子程序,延时 1MS*t S
{
 unsigned char a;
 while(--t != 0)
 {
  for(a = 0; a < 125; a++);
 }
}
////////////////////////////////////////////////
///////////////////////////////////////////////////
//////////////////////////////////////////////////液晶的程序
void Read_Busy(void)
{
 do{     Lcd_Data=0xff;
   RS=0;
   RW=1;
   E=0;
   delay(2);
   E=1;}while(Busy);
}
void Write_Comn(unsigned char comn)
{
 Lcd_Data=comn;
 RS=0;
 RW=0;
 E=0;
 Read_Busy();
 E=1;
}
void Write_Data(unsigned char Lcddata)
{
 Lcd_Data=Lcddata; 
 RS=1;
 RW=0;
 E=0;
 Read_Busy();
 E=1;

}
void init()  
{
 Write_Comn(0x01); ///清显示
 delay(50);
 Write_Comn(0x02); //光标位于左上方
 Write_Comn(0x38); //5*8点阵  8位2行
 Write_Comn(0x06);//  文字不动,光标右移 
 Write_Comn(0x0f);///光标闪烁
}
////////////////////////////////////////////////////
//////////////////////////////////////////////
////////////////////////////////////////////////////
///////////////////////////////////////////以上为lcd的程序;
/////////////////////////////////////////以下为键盘扫描的程序
void KEY4X4_scan(void)
{
    keyvalue=0x00;//无按键时返回Ox00
 P1=0xFE;//扫描第1行
 delay(1);
 if((P1&0xF0)!=0xF0)
  keyvalue=(P1>>4)|0x10;//返回键值
 P1=0xFD;//扫描第2行
 delay(1);
 if((P1&0xF0)!=0xF0)
  keyvalue=(P1>>4)|0x20;//返回键值
 P1=0xFB;//扫描第3行
 delay(1);
 if((P1&0xF0)!=0xF0)
  keyvalue=(P1>>4)|0x30;//返回键值
 P1=0xF7;//扫描第4行
 delay(1);
 if((P1&0xF0)!=0xF0)
  keyvalue=(P1>>4)|0x40;//返回键值
 // return keyvalue;
}
//////////////////////////////////////////////////
/////////////////////////////////////////////////
///////////////////////////////////////////////秒表程序
void seconddisplay(void)//显示时间
{
 unsigned char aa = 0, bb = 0, cc = 0, dd = 0,ee = 0;//定义时间各个位 
    if(t0_1S>60000)t0_1S=0;
 aa=t0_1S/10000;
 bb=t0_1S%10000/1000;
 cc=t0_1S%1000/100;
 dd=t0_1S%100/10;
 ee=t0_1S%10;
 Write_Comn(0xc9);  
 Write_Data(num[aa]);
 Write_Data(num[bb]);
 Write_Data(num[cc]);
 Write_Data( num[dd] );
    Write_Data('.');
 Write_Data(num[ee]);
 Write_Data('S');
 
}

  /////////////////////////////////////////////////////////////秒表
void mysecond()
{            unsigned int i;
                              init();//初始化液晶
         Write_Comn(0x01);//清显示
         k1=1;k2=1; 
         t0_1S=0;
         Write_Comn(0x80);
        
         for(i=0;i<16;i++)
          {
          Write_Data( Time[i] );//显示time字样
          }
      run:
       seconddisplay();
         if(k1==0)
            {  
            while(1)
            {
                Delay_1ms(100);//延时0.1S
             t0_1S++;
             seconddisplay();
                       if(k2==0)
                {
                 while(1)
                 {
                 if(k1==0)break;
                 if(k3==0){t0_1S=0;
                           goto over;
                    }
                     } 
                }
                       }
                }
       goto run;
       over:
       t0_1S=0;
         
}
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
void showheart()
{
         unsigned int i;                // char m=0; 
                       init(); 
                      Write_Comn(0x40);             //设定CGRAM地址 
          for(i=0;i<64;i++)    //将心型代码写入CGRAM中 
          { 
                  Write_Data(heart[i]);           
          } 
          Write_Comn(0x85);        //设定上排的显示位置 
          for(i=0;i<4;i++)        //显示心型图案的上半部分 
          { 
                  Write_Data(i); 
          } 
          Write_Comn(0xc5);        //将显示坐标转移到下排和上排相对应的地方 
          for(i=4;i<8;i++)        //显示心型图案的下半部分 
          { 
                  Write_Data(i); 
          }

 


}
//////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////
/////////////////////////////////////////////
////////////////////////////////////////////////
///////////////////////////////////定时器中断的初始化
void init_int()
{
     TMOD=0x01;
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  ET0=1;
  TR0=1;
  EA=1;
}
  void edit(unsigned int t)////////////////////////////对月,天 时 分 秒的计算
  {
  unsigned int a,b;
  a=t/10;
  b=t%10;
  Write_Data(num[a]);
  Write_Data(num[b]);
  }
void showmiddle(unsigned int x)///////////////////////////////显示冒号的函数
{   Write_Comn(x);
      Write_Data(middle[0]);
}
void  showhaha(unsigned int x) //////////////////////////////////显示笑脸的函数
{ unsigned int i;
 Write_Comn(x);
    for(i=0;i<3;i++)
   Write_Data(haha[i]);
}
 void showtime()
 { unsigned int a,b,c,d;
   
    
     a=year/1000;
  b=(year%1000)/100;
  c=((year%1000)%100)/10;
  d=year%1000%100%10;
   init();
  showhaha(0x80);  /////////////////////////////////显示笑脸
  Write_Comn(0x80+3);
  Write_Data(num[a]);
  Write_Data(num[b]);
  Write_Data(num[c]);
  Write_Data(num[d]);
  
  showmiddle(0x80+7); ////////////////////////////显示冒号
  Write_Comn(0x80+8);
     edit(month);

  showmiddle(0x80+10); ////////////////////////////显示冒号  
  Write_Comn(0x80+11);
  edit(day);
  showhaha(0x80+13);///////////////////////////////////////显示笑脸
 showhaha(0xc0+1);  //////////////////////////////////////显示笑脸
  Write_Comn(0xc0+4);
  edit(hour);

  showmiddle(0xc0+6);   ////////////////////////////显示冒号
  Write_Comn(0xc0+7);
  edit(min);

    showmiddle(0xc0+9); /////////////////////////////////显示冒号
  Write_Comn(0xc0+10);
  edit(second);
  showhaha(0xc0+12);////////////////////////////////显示笑脸
 }
 //////////////////////////////////
 /////////////////////////////////////
 ///////////////////////////////键盘上显示数字的小函数
 void shownumber()
 {
                              numberflag=0;
                          Write_Comn(0x80+number-1);
                       Write_Data(num[number]);
 }

 

关键字:51单片机  1602液晶  显示控制 引用地址:51单片机1602液晶程序

上一篇:51单片机 1602液晶显示控制代码2
下一篇:51单片机按键直接控制舵机旋转

推荐阅读最新更新时间:2024-03-16 14:55

8051单片机(STC89C52)两个倒计时器同步计数
此处需要定时器0提供5ms精准定时, 则每个定时周期都需要(5*10^-3)/(1*10^-6)=5000次加1计数, 所以这里定时器0的初始值设为65536 - 5000 = 60536 = EA84H. 这里先实现两个倒计时器同时工作, 下一步该考虑怎么实现两个倒计时器不同步工作. #include STC89C5xRC.H void delay()//用定时器0实现5ms精准定时 { TMOD = 0x01; TH0 = 0xEA; TL0 = 0x84;//65536 - 5000 = 60036 TF0 = 0;//置溢出标志位为0 TR0 = 1;//开启定时器0 w
[单片机]
80<font color='red'>51单片机</font>(STC89C52)两个倒计时器同步计数
51单片机游戏(贪吃蛇)
一、电路设计 此电路由AT89C51最小系统、74HC595位移缓存器、8*8点阵LED屏和按键组成。 74HC595位移缓存器 74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7’输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。 二、运行结果 三、部分代码 /*想要更多项目私wo!!!*/ #include config.h static struct Food { unsig
[单片机]
<font color='red'>51单片机</font>游戏(贪吃蛇)
51单片机8位数码管电子时钟仿真图及源代码
利用8位数码管显示时间,原理与4位数码管显示的基本一样 仿真图: 程序源代码: 本程序已经通过在线软件仿真和硬件制作. org 0000h ;程序开始入口地址 sjmp main ;跳转至主程序 org 000bh ;T0中断入口地址 ljmp inti0 ;跳转至T0中断程序 org 001bh ;T1中断入口地址 ljmp inti1 ;跳转至T1中断程序 org 0030h main:mov tmod,#11h ;设T0、T1为模式1 mov ie,#8ah ;开T0、T1允许中断 mov th0,#4ch ;赋T0 50ms初值 mov tl0,#00h mov th1,#4ch ;赋T1 50ms初值 mov t
[单片机]
<font color='red'>51单片机</font>8位数码管电子时钟仿真图及源代码
51单片机,C语言编程,控制指示灯闪烁的频率
c51单片机,c语言编程,关于指示灯定时闪烁的。 P1.0 P1.1 P1.2 P1.3上面各接有一个指示灯,P2.0接一个外接按键。 要求: 按一下按键P1.0以1Hz的频率闪烁 半周期为500ms 第二次按下按键P1.1以2Hz的频率闪烁 半周期为250ms 第三次按下按键P1.2以3Hz的频率闪烁 半周期为165ms 第四次按下按键P1.3以4Hz的频率闪烁 半周期为125ms 第五次按下按键P1.0以1Hz的频率闪烁 半周期为500ms 如此循环。 单片机外接6MHz晶振,如何写这个程序? 悬赏分:30 本程序有实用价值,在不同的工作状态,以不同的速度闪烁,可表现出不同的紧急程度。 系统的晶振是6MHz,则机器周
[单片机]
<font color='red'>51单片机</font>,C语言编程,<font color='red'>控制</font>指示灯闪烁的频率
DS1302时钟与LCD1602液晶显示
DS1302是一个实时时钟芯片,它在实时显示时间中应用。它可以对年、月、日、周、时、分、秒进行计时。 DS1302的引脚及原理图如下: 它与CPU的连接需要SCLK(7)、I/O(6)和RST(5)三个引脚,VCC2和VCC1分别为主电源和备份电源,X1和X2分别接外部振荡器。在于CPU的通信中I/O用来传输数据,RST作为复位信号,SCLK用来控制数据字节的读写。 DS1302的读写时序如下: 程序中对芯片的操作主要是参考芯片的时序状态,时序中说明只要有对数据的操作RST就需要置1,在读数据的前8个时钟中在SCLK处于高电平的过程中会获取控制字信息,此过程I/O数据不会变化,而在低电平的过程中I/O
[单片机]
DS1302时钟与LCD<font color='red'>1602</font><font color='red'>液晶</font><font color='red'>显示</font>
旋转LED屏显示控制器设计方案
引言 在各种设备中,显示设备占有重要地位,少了显示设备就像人少了眼睛,很多内在的东西都看不见。显示设备很重要也很常见,然而它的外形总是那么单调,像一个个的模型。旋转LED屏以其新颖、可视角360°吸引了电子狂热者的眼光。本项目是通过主控芯片STM32F103,将触摸技术与旋转LED屏幕相结合,可以实现时钟的变换,还可以利用触摸技术在旋转LED上玩一些小游戏[1],让旋转LED不再只是单一的观赏性的技术。 旋转LED显示屏是一种通过同步控制发光二极管(LED)位置和点亮状态来实现图文显示的新型显示屏,因其结构新颖、成本低、可视视角达360°而得到了迅速的发展。目前,常见的LED显示屏都是采用扫描方式进行显示的,其实现原理是在不同
[单片机]
旋转LED屏<font color='red'>显示</font><font color='red'>控制</font>器设计方案
MCS-51单片机的中断系统介绍
计算机与外界的联系是通过外部设备(也称为外设、输入/输出设备或I/O设备)与外界联系的。计算机与外设之间不是直接相连的,而是通过不同的接口电路来达到彼此间的信息传送的目的。 计算机与外设之间交换信息的方式: (1)无条件传送方式:外设对计算机来说总是准备好的。 (2)查询传送方式:传送前计算机先查询外设的状态,若已经准备好就传送,否则就继续查询/等待。 (3)中断传送方式:外设通过申请中断的方式与计算机进行数据传送。 (4)直接存储器存取方式(DMA):传送数据的双方直接通过总线传送数据, 不经CPU中转。 1.中断的定义 所谓 中断 ,是指CPU执行正常程序时,系统中出现特殊请求,CPU暂时中止当
[单片机]
基于51单片机的多点温度控制系统设计
摘 要:针对目前壁挂炉采暖中温度控制不准确的现状,以单片机为控制中心,采用Dalias公司的“一线总线”数字化温度传感器DSl8820以及脉冲控制器件,设计一款多点测温及温度控制系统;系统能够同时测量多点温度,并根据温度设定实时控制各回路通断及壁挂炉的燃烧与停止,从而进一步提高居室的舒适性及采暖系统的经济性。 关键词:51单片机;DSl8820;多点温度检测;温度控制系统 随着生活水平的提高,人们对家居需求由面积需求变为舒适需求。地板采暖采用辐射方式供暖,符合人体生理需求曲线,如果控制系统选取得当,不仅可以提高房间舒适度,更可以使系统运行费用降低许多。如今一般是在典型位置安装一个温控装置,温控装置连接到壁挂炉,温控器根据室温
[工业控制]
基于<font color='red'>51单片机</font>的多点温度<font color='red'>控制</font>系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved