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

📄 lcd.c

📁 单片机实现计算器程序
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
sbit dc=0xa0;		/*P2.0	LCD的RS  21*/
sbit rw=0xa1;		/*P2.1	LCD的R/W 22*/
sbit cs=0xa4;		/*P2.4	LCD的E   25*/
sfr  lcdbus=0x80;	/*p0	LCD数据 D0=P0.0*/
unsigned int sys10mscounter;
unsigned char syslimitcounter;
char path1[8]={0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f};/*自定义符号:横1*/
char path2[8]={0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00};/*自定义符号:横2*/
char pats1[8]={0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15};/*自定义符号:竖1*/
char pats2[8]={0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a};/*自定义符号:竖2*/
void soft_nop(){}
void soft_10ms()/***********12MHZ提供10MS软件延时************/
{	register int i;
	for(i=0;i<711;i++);
}
void soft_20ms()/***********12MHZ提供20MS软件延时************/
{	soft_10ms();
	soft_10ms();
}
void hard_10ms(unsigned int delaytime) /*基于10MS的硬件延时*/
{	sys10mscounter=delaytime;
	while(sys10mscounter);
}
unsigned char data lcdcounter;
bit lcdusing1,lcdusing2;
bit lcd_checkbusy()/*检查LCD忙*/
{	register lcdstate;
	dc=0;				/*dc=1为数据,=0为命令.*/
	rw=1;				/*rw=1为读,=0为写.*/
	cs=1;				/*cs=1选通.*/
	soft_nop();
	lcdstate=lcdbus;
	cs=0;
	return((bit)(lcdstate&0x80));
}
void lcd_wrcmd(unsigned char lcdcmd) /*写LCD命令*/
{	lcdusing1=1;
	while(lcd_checkbusy());
	lcdbus=lcdcmd;
	dc=0;				/*dc=1为数据,=0为命令.*/
	rw=0;				/*rw=1为读,=0为写.*/
	cs=1;				/*cs=1选通.*/
	soft_nop();
	cs=0;
	lcdbus=0xff;
	lcdusing1=0;
}
void lcd_moveto(char position) /*移动光标到指定位.0-79*/
{	register cmd=0x80;
	lcdcounter=position;
        if (position > 59)
            position += 0x18;
        else
        {   if (position > 39)position -= 0x14;
            else
            {       if (position > 19)position += 0x2c;	
            }       
        }   
	cmd=cmd|position;
	lcd_wrcmd(cmd);
}
void lcd_wrdata(char lcddata) /*在当前显示位置显示数据*/
{	char i;
	lcdusing2=1;
	while(lcd_checkbusy());	
	if(lcdcounter==8){
//		lcd_moveto(20);
		lcd_wrcmd(0x80);
		while(lcd_checkbusy());	
		}
//	if(lcdcounter==40){
//		lcd_moveto(40);
//		while(lcd_checkbusy());	
//		}
//	if(lcdcounter==60){
//		lcd_moveto(60);
//		while(lcd_checkbusy());	
//		}
	if(lcdcounter==16){
//		lcd_moveto(0);
		lcd_wrcmd(0xC0);
		while(lcd_checkbusy());	
		lcdcounter=0;
		}					/*为通用而如此*/
	lcdcounter++;
	lcdbus=lcddata;
	dc=1;				/*dc=1为数据,=0为命令.*/
	rw=0;				/*rw=1为读,=0为写.*/
	cs=1;				/*cs=1选通.*/
	soft_nop();
	cs=0;
	lcdbus=0xff;
	lcdusing2=0;
}
void lcd_string(char *strpoint) /*在当前显示位置显示LCD字符串*/
{	register i=0;
	while(strpoint[i]!=0){
		lcd_wrdata(strpoint[i]);
		i++;
		}
}
void lcd_init()/*初始化*/
{	lcd_wrcmd(0x38);		/*设置8位格式,2行,5*7*/
	lcd_wrcmd(0x0c);		/*整体显示,关光标,不闪烁*/
	lcd_wrcmd(0x06);		/*设定输入方式,增量不移位*/
	lcd_wrcmd(0x01);		/*清除显示*/
	lcdcounter=0;
}
void lcd_cls()/*清除显示*/
{	lcd_wrcmd(0x01);
	lcdcounter=0;
}
void timer0(void) interrupt 1 		/*T0中断*/
{	TH0=0xd8;			/*12M,10ms*/
	TL0=0xf6;
	TR0=1;
	if(sys10mscounter!=0)sys10mscounter--;		/*定时器10ms*/
	if(syslimitcounter!=0)syslimitcounter--;	/*定时器10ms*/
}

void lcd_wr(char a )
{
unsigned char j;
//IE=0;P0=0xff;P1=0xff;P2=0xff;P3=0xff; /*初始化T*/
//lcd_init();soft_20ms();
//TMOD=0x51;
//TH0=0xd8;			/*12M,10ms*/
//TL0=0xf6;
//TR0=1;ET0=1;EA=1;
//	while(1)
//	{
	/*全黑、横一、横二、竖一、竖二、U、Q、ABCD...,*/
	lcd_init();	/*全黑*/
	for(j=0;j<80;j++){lcd_wrdata(0xff);}
	hard_10ms(50);
	lcd_init();	/*横一,可参考自行设计符号*/
	lcd_wrcmd(0x40);
	for(j=0;j<8;j++)lcd_wrdata(path1[j]);
	for(j=0;j<100;j++)lcd_wrdata(0);
	hard_10ms(50);
	lcd_init();	/*横二*/
	lcd_wrcmd(0x40);
	for(j=0;j<8;j++)lcd_wrdata(path2[j]);
	for(j=0;j<100;j++)lcd_wrdata(0);
	hard_10ms(50);
	lcd_init();	/*竖一*/
	lcd_wrcmd(0x40);
	for(j=0;j<8;j++)lcd_wrdata(pats1[j]);
	for(j=0;j<100;j++)lcd_wrdata(0);
	hard_10ms(50);
	lcd_init();	/*竖二*/
	lcd_wrcmd(0x40);
	for(j=0;j<8;j++)lcd_wrdata(pats2[j]);
	for(j=0;j<100;j++)lcd_wrdata(0);
	hard_10ms(50);
	lcd_init();
	lcd_string("123456789ABCDEFG");
	hard_10ms(50);
	lcd_init();
	lcd_string("QQQQQQQQQQQQQQQQ");
	hard_10ms(50);
	lcd_init();
	lcd_string("ABCDEFGHIJKLMNOP");
	hard_10ms(50);
//	}
}

⌨️ 快捷键说明

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