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

📄 12.c

📁 很精简的LCD12864程序!!!对大家绝对有用
💻 C
字号:
#include <reg52.h>
#include <math.h>
#define timer0_count 0xfc18   //64536   65536-64536=1000us=1ms
 int sum=0,sec=0,min=0,hour=0;
  int i=0;
void lcd_init(void);    //LCD初如化
void clr_lcd(void);    //清显示
void send_com(unsigned char cmd);   //写指令
void send_data(unsigned char dat);   //写数据
void chek_busy(void);         //检测忙
void set_xy(unsigned char xpos,unsigned char ypos);     //认定显示位置
void print(unsigned char x,unsigned char y,char* str);  
void printstr(unsigned char xpos,unsigned char ypos,unsigned char str[],unsigned char k);
//int m=0;
char code int2charLCD[]="0123456789";
//unsigned char code buf[4] ={0xbb,0xb6,0xd3,0xad};//欢迎
//unsigned char code buf1[2] ={0x00,0x00};
//unsigned char buf1[2]={0x00,1};
#define DATA P0         //定义P0为DATA
#define CONTROL P2    //定义P2为控制口
#define E 2 //并行的使能信号 sbit E = P2^2
#define RW 1 //并行的读写信号 sbit RW = P2^1
#define RS 0 //并行的指令数据选择信号 sbit RS = P2^0
#define PSB 3 //并/串行接口选择 sbit PSB = P2^3
#define RST 5 //复位 低电平有效 sbit RST = P2^5
#define SETB(x,y) (x|=(1<<y))
#define CLRB(x,y) (x&=(~(1<<y)))
#define CHKB(x,y) (x&(1<<y))
/********定时器t0初始化**************************/
void timer0_initialize(void)
   {
	EA=0;
//	timer0_tick=0;
	TR0=0;
	TMOD&=0xf0;
	TMOD|=0x01;
	TL0=(timer0_count&0xff) ;
	TH0=(timer0_count>>8);
	PT0=0;
	ET0=1;
	TR0=1;
	EA=1;
	}


/*********定时器中断服务子程序***************************/
static void time0_isr(void) interrupt 1 using 1
 {
 // int buf1=0;
 
  TR0=0;
  TL0=(timer0_count&0xff);   //将18H放入TL0
  TH0=(timer0_count>>8);     //右移8位,将fcH放入TH0中
  TR0=1;
  i+=1;
  if(i>=100)
    {  i=0;

   sum=sum+1;
	if(sum==10)
	  {
	     sum=0;
		  sec++;
		   if(sec==60)
			 {
			   sec=0;
				    min++;
					 if(min==60)
					   { min=0;
					    hour++;
						 if(hour==24)
						   hour=0;
					}  }
			 }
	  }
 //  buf1[1]=sum;
	}
 // }


/********************测忙碌**********************/
//测忙碌子程序
//RS=0,RW=1,E=H,D0-D7=状态字
/************************************************/
void chek_busy(void)
{ unsigned char temp1;//状态信息(判断是否忙)
CLRB(CONTROL,RS); // RS = 0;
SETB(CONTROL,RW); // RW = 1;
SETB(CONTROL,E); // E = 1;
do{temp1 = DATA;DATA=0xFF;} while(temp1&0x80);
SETB(CONTROL,E); // E = 1;
DATA=0xFF;
}
/********************写命令**********************/
//写命令子程序
//
/************************************************/
void send_com(unsigned char cmd)/*写命令*/
{
chek_busy();
CLRB(CONTROL,RS); //RS = 0;
CLRB(CONTROL,RW); //RW = 0;
DATA = cmd;
SETB(CONTROL,E); //E = 1;
CLRB(CONTROL,E); //E = 0;
}
/********************写数据**********************/
//写数据子程序
//
/************************************************/
void send_data(unsigned char dat)
{
chek_busy();
SETB(CONTROL,RS); //RS = 1;
CLRB(CONTROL,RW); //RW = 0;
DATA = dat;
SETB(CONTROL,E); //E = 1;
CLRB(CONTROL,E); //E = 0;
}
/********************初始化**********************/
//复位、通讯方式选择
/************************************************/
void lcd_init(void)
{
SETB(CONTROL,RST);//复位RST=1
SETB(CONTROL,PSB); //通讯方式为并口PSB = 1
//send_com(0x34);//34H--扩充指令操作
send_com(0x30);//功能设置,一次送8位数据,基本指令集
send_com(0x0C);//0000,1100 整体显示,游标off,游标位置off
send_com(0x01);//0000,0001 清DDRAM
send_com(0x02);//0000,0010 DDRAM地址归位
send_com(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC
}

/*******************************************************************/
// 设置显示位置 xpos(1~16),tpos(1~4)
/*******************************************************************/
void set_xy(unsigned char xpos,unsigned char ypos)
{
switch(ypos)
{
case 1:
send_com(0X80|xpos);break;
case 2:
send_com(0X90|xpos);break;
case 3:
send_com(0X88|xpos);break;
case 4:
send_com(0X98|xpos);break;
default:break;
}
}
/*******************************************************************/
// 在指定位置显示字符串
/*******************************************************************/
void print(unsigned char x,unsigned char y,char* str)
{
unsigned char lcd_temp;
set_xy(x,y);
lcd_temp=*str;
while(lcd_temp != 0x00)
{
send_data(lcd_temp);
lcd_temp=*(++str);
}
}

/********************写字符串******************/
//写字符串子程序
//xpos1取0~7共八列,ypos1取0~3共四行。
/**********************************************/
void printstr(unsigned char xpos,unsigned char ypos,unsigned char str[],unsigned char k)
{ unsigned char n;
switch (ypos)
{ case 1: xpos |= 0x80;break; //第一行
  case 2: xpos |= 0x90;break; //第二行
  case 3: xpos |= 0x88;break; //第三行
  case 4: xpos |= 0x98;break; //第四行
  default: break;
}

send_com(xpos); //此处的Xpos已转换为LCM的显示寄存器实际地址
for(n=0;n < k;n++)
{
send_data(str[n]);//显示汉字时注意码值,连续两个码表示一个汉字
}
}
/************************************/
//在指定位置显示数字
/***************************************/
void display_LCD_number(unsigned char xpos,unsigned char ypos,unsigned char number)
{
  unsigned char x,y;
switch (ypos)
{ case 1: xpos |= 0x80;break; //第一行
  case 2: xpos |= 0x90;break; //第二行
  case 3: xpos |= 0x88;break; //第三行
  case 4: xpos |= 0x98;break; //第四行
  default: break;
}
  send_com(xpos); //此处的Xpos已转换为LCM的显示寄存器实际地址
 // unsigned char ;
 // x=number/100;
//  y=(number-x*100)/10;
 // z=number%10;
   x=number/10;
	y=number-x*10;
  send_data(int2charLCD[x]);
   send_data(int2charLCD[y]);
// send_data(int2charLCD[z]);
}
/********************清屏************************/
//清屏
/************************************************/
void clr_lcd(void)
{
send_com(0x01);
//send_com(0x34);
//send_com(0x30);
}

/**************主函数***********************/
void main ()
{
timer0_initialize();
lcd_init();           //设定液晶工作方式
//printstr(1,1,buf,4);
//printstr(2,1,"数字时钟",8);
print(3,1,"时钟");
print(1,2,":");
print(3,2,":");
//printstr(6,2,buf1,1);
//print(0,3," SEEGU百度空间");
//print(7,2,buf1);
while(1)
{
//display_LCD_number(0,2,hour);
//display_LCD_number(2,2,min);
display_LCD_number(4,2,sec);
}
}



⌨️ 快捷键说明

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