⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcdshow.c

📁 可以显示年月日,时间等,也可以设置闹钟,设定时间
💻 C
字号:
/*文件描述:本文件包含了用HD44780显示相关的3个子程序    *
*         1. LCDShow:在LCD上显示32个字符               *
*         2. LcdInit:初始化Lcd                         *
*         3. Lcd_Command:执行给定的cmd命令             *
*-------------《嵌入式应用技术基础教程》--------------*/
//[以下为子程序源代码]
//[头文件]
#include "GP32C.h"         //包含头文件
#define LcdData PTB        //Lcd显示数据传送口
#define LcdData_D  DDRB    //数据口方向寄存器
#define LcdCtrl PTC        //Lcd控制信号传送口
#define LcdCtrl_D  DDRC    //控制口方向寄存器
#define  LcdRS 0           //Lcd寄存器选择信号PTC0
#define  LcdRW 1           //读写信号接PTC1
#define  LcdE  2           //Lcd使能信号接PTC2
//内部调用子程序
void Lcd_Command(unsigned char cmd); //命令执行子程序
void LcdInit(void);                  //Lcd初始化子程序
unsigned char flat=0;   
extern unsigned char clockstr[8]; /*时间显示的LCD显示*/
extern unsigned char alartstr[5]; /*闹钟显示的LCD显示*/
extern unsigned char datestr[10]; /*日期显示LCD显示*/    
unsigned char data[3];time[3]; 
/*LcdShow:在HD44780显示屏上显示数据--------------------*
*功能描述:在HD44780显示屏上显示str中的32个数据         *
*参  数:str:待显示数组                                 *
*返  回:无                                             *
*------------------以上为子程序说明-------------------*/
void lcdshow2(unsigned char str[])
  {	 	
    unsigned char i;
    LcdInit();               //调用Lcd初始化子程序
 	//显示第1行16个字符
 	LcdCtrl&=~(1<<LcdRS);      //RS、R/W=00,写指令
	LcdCtrl&=~(1<<LcdRW);    
  	Lcd_Command(0b10000000); //后7位为DDRAM地址0x00 
	LcdCtrl|=1<<LcdRS;		 //RS、R/W=10,写数据到DDRAM中
    LcdCtrl&=~(1<<LcdRW);
   	for (i=0;i<16;i++)       //逐个显示
       Lcd_Command(str[i]);
    //显示第2行16个字符
   	LcdCtrl&=~(1<<LcdRS);    //RS、R/W=00,写指令
	LcdCtrl&=~(1<<LcdRW);    
  	Lcd_Command(0b11000000); //后7位为DDRAM地址0x40 
	LcdCtrl|=1<<LcdRS;		 //RS、R/W=10,写数据到DDRAM中
	LcdCtrl&=~(1<<LcdRW);
    for (i=16;i<32;i++)      //逐个显示
	  Lcd_Command(str[i]);
   }
void lcdshow(unsigned char strl1[],unsigned char strl2[])
  {	 	
    unsigned char i;
    LcdInit();               //调用Lcd初始化子程序
 	//显示第1行16个字符
 	LcdCtrl&=~(1<<LcdRS);      //RS、R/W=00,写指令
	LcdCtrl&=~(1<<LcdRW);    
  	Lcd_Command(0b10000011); //后7位为DDRAM地址0x03 
	LcdCtrl|=1<<LcdRS;		 //RS、R/W=10,写数据到DDRAM中
    LcdCtrl&=~(1<<LcdRW);
   	for (i=0;i<16;i++)       //逐个显示
       Lcd_Command(strl1[i]);
    //显示第2行16个字符
   	LcdCtrl&=~(1<<LcdRS);    //RS、R/W=00,写指令
	LcdCtrl&=~(1<<LcdRW);    
  	Lcd_Command(0b11000100); //后7位为DDRAM地址0x44 
	LcdCtrl|=1<<LcdRS;		 //RS、R/W=10,写数据到DDRAM中
	LcdCtrl&=~(1<<LcdRW);
    for (i=16;i<32;i++)      //逐个显示
	  Lcd_Command(strl2[i]);
   }
   
void lcdshow1(unsigned char x,unsigned char y,unsigned char data)
  {	 	
    unsigned char i;
 	LcdCtrl&=~(1<<LcdRS);      //RS、R/W=00,写指令
	LcdCtrl&=~(1<<LcdRW);    
  	Lcd_Command(0b10000000|(x*0x40+y)); //DDRAM地址 
	LcdCtrl|=1<<LcdRS;		 //RS、R/W=10,写数据到DDRAM中
    LcdCtrl&=~(1<<LcdRW);
    Lcd_Command(data);
   }

void guangbiao(unsigned char x,unsigned char y)
  {	 	
	LcdCtrl&=~(1<<LcdRS);      //RS、R/W=00,写指令
	LcdCtrl&=~(1<<LcdRW);    
  	Lcd_Command(0b10000000|(x*0x40+y)); //DDRAM地址 0x03
  	Lcd_Command(0b00001111);

   }
   
/*LcdInit:初始化Lcd------------------------------------*
*功  能:初始化Lcd(HD44780),设置显示方式,清屏,AC自动+1  *
*参  数:无                                             *
*返  回:无                                             *
*-----------------------------------------------------*/

void LcdInit(void)
  {
    unsigned char i;
    LcdData_D=0b11111111;     //数据口为输出
    LcdCtrl_D|=(1<<LcdE);     //控制口低三位为输出
    LcdCtrl_D|=(1<<LcdRS); 
    LcdCtrl_D|=(1<<LcdRW); 
    LcdCtrl|=(1<<LcdE);       //E=1
    LcdCtrl&=~(1<<LcdRS);     //RS、R/W=00,写指令
    LcdCtrl&=~(1<<LcdRW);    
    Lcd_Command(0b00111000);  //8位数据接口,2行,5*7点阵
    Lcd_Command(0b00001000);  //关显示,关光标显示,不闪烁	
    Lcd_Command(0b00000001);  //清屏
    for(i=0;i<250;i++);       //延时>1.6ms
    for(i=0;i<250;i++); 
    Lcd_Command(0b00010100);  //光标右移一个字符位,AC自
                              //  动加1  (是否错误?)
    Lcd_Command(0b00001100);  //开显示,关光标显示,不闪烁
  }
/*Lcd_Command:执行给定的cmd命令------------------------*
*功  能:执行给定的cmd命令,且延时                       *
*参  数:cmd:待执行的命令                               *
*返  回:无                                             *
*-----------------------------------------------------*/
void Lcd_Command(unsigned char cmd)
  {	 	
    unsigned char i;	 
    for (i=0;i<20;i++);    //等待>40us
    LcdData=cmd;	         //把指令码送到Lcd数据传送口
    LcdCtrl|=(1<<LcdE);    //Lcd开始接收数据
    asm("NOP");
    asm("NOP");
    asm("NOP");
    LcdCtrl&=~(1<<LcdE);   //Lcd结束接收数据
    for (i=0;i<20;i++);    //等待>40us
  }

  
   
void left(void)     ////进入左移时间模式
{ 

 if(flat>10)
  { 
    flat--;
    LcdCtrl&=~(1<<LcdRS);      //RS、R/W=00,写指令
    LcdCtrl&=~(1<<LcdRW);    
    Lcd_Command(0b00010000);   //后7位为DDRAM地址0x10
   
  }  
  else if(flat==10)
   { 
    flat--;
    LcdCtrl&=~(1<<LcdRS);      //RS、R/W=00,写指令
    LcdCtrl&=~(1<<LcdRW);    
    Lcd_Command(0b10001100);  //后7位为DDRAM地址0x4c
   }
   else if(flat>0)
     {
        flat--;
        LcdCtrl&=~(1<<LcdRS);      //RS、R/W=00,写指令
        LcdCtrl&=~(1<<LcdRW);    
       Lcd_Command(0b00010000);  //后7位为DDRAM地址0x10
     }
   Lcd_Command(0b00001111);  //开显示,开光标显示,闪烁
}
void right(void)      ////进入右移时间模式
{ 
  if(flat<9)
  { 
    flat++;
    LcdCtrl&=~(1<<LcdRS);      //RS、R/W=00,写指令
    LcdCtrl&=~(1<<LcdRW);    
    Lcd_Command(0b00010100);   //
   
  }  
  else if(flat==9)
   { 
    flat++;
    LcdCtrl&=~(1<<LcdRS);      //RS、R/W=00,写指令
    LcdCtrl&=~(1<<LcdRW);    
    Lcd_Command(0b11000100);  //后7位为DDRAM地址0x44
   }
   else if(flat<17)
     {
        flat++;
        LcdCtrl&=~(1<<LcdRS);      //RS、R/W=00,写指令
        LcdCtrl&=~(1<<LcdRW);    
       Lcd_Command(0b00010100);  //后7位为DDRAM地址0x03
     }
   
} 
  
void down(void)      ////进入左移时间模
{
    unsigned char i,j;
    j=flat;
   i=(unsigned char)datestr[j]-0x30;
    i++;
    datestr[j]=(unsigned char)i+0x30;
    if(j<=3)data[2]=data[2]-10^(3-j);
    if(j>=5&&j<=6)data[1]=data[1]-10^(j-5);
    if(j>=8&&j<=9)data[0]=data[0]-10^(j-8);
    if(j>=10&&j<=11)time[2]=time[2]-10^(j-10);
    if(j>=13&&j<=14)time[1]=time[1]-10^(j-13);
    if(j>=15&&j<=16)time[0]=time[0]-10^(j-15); 
}
void up(void)       ////进入右移时间模式
  { 
   //
    unsigned char i,j;
    j=flat;
    i=(unsigned char)datestr[j]-0x30;
    i=i+1;
    datestr[j]=(unsigned char)i+0x30;
    if(j<=3)data[2]=data[2]+10^(3-j);
    if(j>=5&&j<=6)data[1]=data[1]+10^(j-5);
    if(j>=8&&j<=9)data[0]=data[0]+10^(j-8);
    if(j>=10&&j<=11)time[2]=time[2]+10^(j-10);
    if(j>=13&&j<=14)time[1]=time[1]+10^(j-13);
    if(j>=15&&j<=16)time[0]=time[0]+10^(j-15); 
    lcdshow((unsigned char *)datestr,(unsigned char *)clockstr);
     
  
  }   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -