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

📄 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初始化子程序
  //在HD44780显示屏上显示一个字符子函数
void LcdshowCharacter(unsigned char str,unsigned char m,unsigned char n); 
unsigned char ChangeASCII(unsigned char x);   //转换数值x为对应的ASCII码子函数
//外部变量
extern unsigned char time[14];
extern unsigned char alarm[14];
extern unsigned char Ttime[3];
extern int Tdate[3];
extern unsigned char Ttime2[3];
extern int Tdate2[3];





/*LcdshowCharacter:在HD44780显示屏上显示一个字符--------------------*
*功能描述:在HD44780显示屏上第m行,第n列显示字符str         *
*参  数:str:待显示字符                                 *
*返  回:无                                             *
*------------------以上为子程序说明-------------------*/
void LcdshowCharacter(unsigned char str,unsigned char m,unsigned char n)  
  {	 	
 	LcdCtrl&=~(1<<LcdRS);      //RS、R/W=00,写指令
	LcdCtrl&=~(1<<LcdRW);    
  	Lcd_Command(0b10000000|((m-1)*0x40+(n-1))); 
	LcdCtrl|=1<<LcdRS;		 //RS、R/W=10,写数据到DDRAM中
    LcdCtrl&=~(1<<LcdRW);
   	Lcd_Command(str);
   }

unsigned char ChangeASCII(unsigned char x)   //转换数值x为对应的ASCII码
{
    unsigned char y;
    return y=x+0x30;
}

//显示大小为n字符数组在第m行的子函数
void LcdShowString(unsigned char str[],unsigned char n,unsigned char m)  
{
   unsigned char i;
   LcdInit();
   for(i=0;i<n;i++)
    {
      LcdshowCharacter(str[i],m,(i+1));
    }
}



void Lcdshow(unsigned char temp[])             //显示日期时间子程序
{   unsigned char i;
    LcdInit();
    for(i=0;i<4;i++)
     {
       LcdshowCharacter(ChangeASCII(temp[i]),1,(i+4));
     }
   
    LcdshowCharacter('-',1,8);
    LcdshowCharacter(ChangeASCII(temp[4]),1,9);
    LcdshowCharacter(ChangeASCII(temp[5]),1,10);
    LcdshowCharacter('-',1,11);
    LcdshowCharacter(ChangeASCII(temp[6]),1,12);
    LcdshowCharacter(ChangeASCII(temp[7]),1,13);
    LcdshowCharacter(ChangeASCII(temp[8]),2,5);
    LcdshowCharacter(ChangeASCII(temp[9]),2,6);
    LcdshowCharacter(':',2,7);
    LcdshowCharacter(ChangeASCII(temp[10]),2,8);
    LcdshowCharacter(ChangeASCII(temp[11]),2,9);
    LcdshowCharacter(':',2,10);
    LcdshowCharacter(ChangeASCII(temp[12]),2,11);
    LcdshowCharacter(ChangeASCII(temp[13]),2,12); 
     
}
   
/*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(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 LcdShowCursor(unsigned char m,unsigned char n)    //显示光标在第m行,第n列
{
   LcdCtrl&=~(1<<LcdRS);     //RS、R/W=00,写指令
   LcdCtrl&=~(1<<LcdRW);
   Lcd_Command(0b00001111); 
   Lcd_Command(0b10000000|((m-1)*0x40+(n-1)));
}





/*void LcdShowMenu(void)    //显示菜单
{  
   unsigned char temp[12]="1. Set Time";
   unsigned char temp2[13]="2. Set Alarm";
   unsigned char i;
   LcdInit();
   for(i=0;i<11;i++)
    {
      LcdshowCharacter(temp[i],1,(i+1));
    }
   for(i=0;i<12;i++)
    {
      LcdshowCharacter(temp2[i],2,(i+1));
    }
}*/

//将输入的键值传送到相应位置的位
void Transmission(unsigned char Keyvalue,unsigned char temp[],unsigned char m,unsigned char n)
{
   if(m==1)    //在第一行
    {
      switch(n)
       {
         case 4:temp[0]=Keyvalue;break;
         case 5:temp[1]=Keyvalue;break;
         case 6:temp[2]=Keyvalue;break;
         case 7:temp[3]=Keyvalue;break;
         case 9:temp[4]=Keyvalue;break;
         case 10:temp[5]=Keyvalue;break;
         case 12:temp[6]=Keyvalue;break;
         case 13:temp[7]=Keyvalue;break;
         
       }
    }
   if(m==2)       //在第二行
    {
      switch(n)
       {
         case 5:temp[8]=Keyvalue;break;
         case 6:temp[9]=Keyvalue;break;
         case 8:temp[10]=Keyvalue;break;
         case 9:temp[11]=Keyvalue;break;
         case 11:temp[12]=Keyvalue;break;
         case 12:temp[13]=Keyvalue;break;
       } 
    } 
}

//判断按下的键是否数字键
unsigned char Discriminant(unsigned char m)
{ 
  if(m=='1'||m=='2'||m=='3'||m=='4'||m=='5'||m=='6'||m=='7'||m=='8'||m=='9'||m=='0')
  return 1;
  else return 0;
}

void Delay(void)
  {  unsigned char u;
     unsigned char v; 
    for(u=0;u<=250;u++)
      for(v=0;v<=250;v++);
  }

void Changetime(int temp1[],unsigned char temp2[])  //将数组temp1拆分存储到数组temp2
{
   time[0]=temp1[0]/1000;
   time[1]=temp1[0]/100%10;
   time[2]=temp1[0]/10%10;
   time[3]=temp1[0]%10;
   time[4]=temp1[1]/10;
   time[5]=temp1[1]%10;
   time[6]=temp1[2]/10;
   time[7]=temp1[2]%10;
   time[8]=temp2[0]/10;
   time[9]=temp2[0]%10;
   time[10]=temp2[1]/10;
   time[11]=temp2[1]%10;
   time[12]=temp2[2]/10;
   time[13]=temp2[2]%10;
}


void Change(void)         //将数组time组合存储到数组Tdate
{
   Tdate[0]=time[0]*1000+time[1]*100+time[2]*10+time[3];
   Tdate[1]=time[4]*10+time[5];
   Tdate[2]=time[6]*10+time[7];
   Ttime[0]=time[8]*10+time[9];
   Ttime[1]=time[10]*10+time[11];
   Ttime[2]=time[12]*10+time[13];
}


void Change2(void)      //将数组alarm组合存储到数组Tdate2
{
   Tdate2[0]=alarm[0]*1000+alarm[1]*100+alarm[2]*10+alarm[3];
   Tdate2[1]=alarm[4]*10+alarm[5];
   Tdate2[2]=alarm[6]*10+alarm[7];
   Ttime2[0]=alarm[8]*10+alarm[9];
   Ttime2[1]=alarm[10]*10+alarm[11];
   Ttime2[2]=alarm[12]*10+alarm[13];
}


void Controle(void)           //控制时钟的日期时间合法
{  
   if(time[12]>5) time[12]=0;
   if(time[10]>5) time[10]=0;
   if(Ttime[0]>=20&&time[9]>=5) time[9]=0;
   if(time[8]>2) time[8]=0;
   if(Tdate[1]==2&&(Tdate[0]%4==0&&Tdate[0]%100!=0||Tdate[0]%400==0))
	 { if(time[6]>2) time[6]=0;}
   if(Tdate[1]==1||Tdate[1]==3||Tdate[1]==5||Tdate[1]==7||
      Tdate[1]==8||Tdate[1]==10||Tdate[1]==12)
	 { if(time[6]==3&&time[7]>1) time[7]=0;}
   if(Tdate[1]==2||Tdate[1]==4||Tdate[1]==6||Tdate[1]==9||Tdate[1]==11)
	 { if(time[6]==3&&time[7]>0) time[7]=0;}
   if(time[6]>3) time[6]=0;
   if(Tdate[1]>10&&time[5]>2) time[5]=0;
   if(time[4]>1) time[4]=0;
   if(time[6]>3) time[6]=0;
   if(Tdate[1]>10&&time[5]>2) time[5]=0;
   if(time[4]>1) time[4]=0;                   
}


void Controle2(void)           //控制闹钟的日期时间合法
{  
   if(alarm[12]>5) alarm[12]=0;
   if(alarm[10]>5) alarm[10]=0;
   if(Ttime2[0]>=20&&alarm[9]>=5) alarm[9]=0;
   if(alarm[8]>2) alarm[8]=0;
   if(Tdate2[1]==2&&(Tdate2[0]%4==0&&Tdate2[0]%100!=0||Tdate2[0]%400==0))
	 { if(alarm[6]>2) alarm[6]=0;}
   if(Tdate2[1]==1||Tdate2[1]==3||Tdate2[1]==5||Tdate2[1]==7||
      Tdate2[1]==8||Tdate2[1]==10||Tdate2[1]==12)
	 { if(alarm[6]==3&&alarm[7]>1) alarm[7]=0;}
   if(Tdate2[1]==2||Tdate2[1]==4||Tdate2[1]==6||Tdate2[1]==9||Tdate2[1]==11)
	 { if(alarm[6]==3&&alarm[7]>0) alarm[7]=0;}
   if(alarm[6]>3) alarm[6]=0;
   if(Tdate2[1]>10&&alarm[5]>2) alarm[5]=0;
   if(alarm[4]>1) alarm[4]=0;
   if(alarm[6]>3) alarm[6]=0;
   if(Tdate2[1]>10&&alarm[5]>2) alarm[5]=0;
   if(alarm[4]>1) alarm[4]=0;                   
}

⌨️ 快捷键说明

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