lcdqdcx.c

来自「51系列单片机适用的LCD液晶显示器驱动程序」· C语言 代码 · 共 196 行

C
196
字号
#include <regx52.h>
#include<intrins.h>
//=======================
#define Uchar unsigned char
#define Uint unsigned int
// ================= LCM1602A端口地址定义 =======================
char xdata Lcd1602CmdPort _at_ 0x7cff;  //E=1 RS=0 RW=0
char xdata Lcd1602WdataPort _at_ 0x7eff; //E =1 RS=1 RW=0
char xdata Lcd1602StatusPort _at_ 0x7dff; //CS=1 RS=0 RW=1
#define Busy 0x80    // 忙判别位

extern unsigned char idata seconds[2];
extern unsigned char idata minutes[3];
extern unsigned char idata hours[3];
extern unsigned char idata dates[2];
extern unsigned char idata months[3];
extern unsigned char idata days[1];
extern unsigned char idata years[5];

code unsigned char Monday[]="Mon.";
code unsigned char Tuesday[]="Tue.";
code unsigned char Wenseday[]="Wed.";
code unsigned char Thursday[]="Thur.";
code unsigned char Friday[]="Fri.";
code unsigned char Saturday[]="Sat.";
code unsigned char Sunday[]="Sun.";


void Delay400Ms(void);
void Delay5Ms(void);
void LcdWriteData( char dataW );
void LcdWriteCommand( Uchar CMD,Uchar AttribC );
void LcdReset( void );
void Display( Uchar dd );
void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
void ePutstr(Uchar x,Uchar y, Uchar code *ptr);

//================ 随便写几句测试主程序 ================
void display1602(void)
{

Uchar i,k;

	  for(i=0,k=0;i<3;i++,k++)
    DispOneChar(k,0,hours[i]);

	  for(i=0,k=3;i<3;i++,k++)
    DispOneChar(k,0,minutes[i]);

	  for(i=0,k=6;i<2;i++,k++)
    DispOneChar(k,0,seconds[i]);


	  for(i=0,k=0;i<5;i++,k++)
    DispOneChar(k,1,years[i]);

	 for(i=0,k=5;i<3;i++,k++)
    DispOneChar(k,1,months[i]);

	   for(i=0,k=8;i<2;i++,k++)
    DispOneChar(k,1,dates[i]);

	 switch(days[0])
	 {
	 case 0x30:
	            ePutstr(11,1,Monday);
				 break;


	 case 0x31: 
	            ePutstr(11,1,Tuesday);
				 break;
	 case 0x32:
	             ePutstr(11,1,Wenseday );
				 break;
	 case 0x33:
	            ePutstr(11,1,Thursday);
				 break;
	 case 0x34:
	            ePutstr(11,1,Friday);
				 break;;
	 case 0x35:
	             ePutstr(11,1,Saturday);
				 break;
	 case 0x36:
	            ePutstr(11,1,Sunday);
				 break;


	 default:   
	           ePutstr(11,1,Monday);
	           break;
	 
	 }
  
  
  



}
/*=======================================================
 显示字符串
=======================================================*/
void ePutstr(Uchar x,Uchar y, char code *ptr) {
Uchar i,l=0;
 while (ptr[l] >31){l++;};
  for (i=0;i<l;i++) {
  DispOneChar(x++,y,ptr[i]);
  if ( x == 20 ){
   x = 0; y ^= 1;
  }
 }
}
/*=======================================================
 演示一行连续字符串,配合上位程序演示移动字串
=======================================================*/
void Display( Uchar dd ) {
Uchar i;
 
 for (i=0;i<16;i++) {
  DispOneChar(i,1,dd++);
  
  dd &= 0x7f;
  if (dd<32) dd=32;
 }
}
/*=======================================================
 显示光标定位
=======================================================*/
void LocateXY( char posx,char posy) {
Uchar temp;
 temp = posx & 0xf;
 posy &= 0x1;
 if ( posy )temp |= 0x40;
 temp |= 0x80;
 LcdWriteCommand(temp,0);
}
/*=======================================================
 按指定位置显示数出一个字符
=======================================================*/
void DispOneChar(Uchar x,Uchar y,Uchar Wdata) {
 LocateXY( x, y );    // 定位显示地址
 LcdWriteData( Wdata );   // 写字符
}
/*=======================================================
 初始化程序, 必须按照产品资料介绍的初始化过程进行
=======================================================*/
void LcdReset( void ) {
    LcdWriteCommand( 0x38, 0);   // 显示模式设置(不检测忙信号)
  Delay5Ms();
 LcdWriteCommand( 0x38, 0);   // 共三次
  Delay5Ms();
 LcdWriteCommand( 0x38, 0);
  Delay5Ms();
 LcdWriteCommand( 0x38, 1);   // 显示模式设置(以后均检测忙信号)
    LcdWriteCommand( 0x08, 1);   // 显示关闭
    LcdWriteCommand( 0x01, 1);   // 显示清屏
 LcdWriteCommand( 0x06, 1);   // 显示光标移动设置
 LcdWriteCommand( 0x0c, 1);   // 显示开及光标设置
}
/*=======================================================
 写控制字符子程序: E=1 RS=0 RW=0
=======================================================*/
void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {
 if (AttribC) while( Lcd1602StatusPort & Busy );  // 检测忙信号?
 Lcd1602CmdPort = CMD;
}
 
/*=======================================================
 当前位置写字符子程序: E =1 RS=1 RW=0
=======================================================*/
void LcdWriteData( char dataW ) {
 while( Lcd1602StatusPort & Busy );     // 检测忙信号
 Lcd1602WdataPort = dataW;
}
// 短延时
void Delay5Ms(void)
{
 Uint i = 5552;
 while(i--);
}
//长延时
void Delay400Ms(void)
{
 Uchar i = 5;
 Uint j;
 while(i--)
 {
  j=7269;
  while(j--);
 };
}
 

⌨️ 快捷键说明

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