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

📄 sy8.c

📁 12864液晶屏的使用 基于c8051f005单片机 在液晶屏上显示"中国石油大学"
💻 C
字号:
#include <c8051f000.h>
#define uchar unsigned char
#define uint unsigned int

sbit LCD_CS=P3^0;			//片选接口 低电平有效
sbit LCD_RES=P3^1;			//单片机复位接口 低电平有效
sbit LCD_A0=P3^2;			//数据/命令选择位 低电平命令 高电平数据
sbit LCD_SCK=P3^3;			//时钟信号口  上升沿触发
sbit LCD_DA=P3^4;			//数据信号口

void delay(uint i);
void sysclk_init();
void port_init();

float flash_re(uchar x);
void flash_wr(uchar x,float dat);



void lcd_send_data(uchar dat);
void lcd_send_cmd(uchar dat);
void lcd_init();
void lcd_set_page(uchar dat);
void lcd_set_colume(uchar dat);
void lcd_clr();
void lcd_point(uchar x,uchar y);
void lcd_display_one_num(uchar wordx,uchar wordy,uchar *n);
void lcd_word(uchar wordx,uchar wordy,uchar *word);
void lcd_display_num(uchar x,uchar y,float num);


//-------------------------------------------------------
//汉字字模
//每个汉字16X16 x+16 page+1 y+16
//-------------------------------------------------------
uchar code jia[]={0x02,0x02,0x3A,0xAA,0xAA,0xBE,0xAA,0xAA,0xAA,0xBE,0xAA,0xAA,0x3A,0x02,0x02,0x00,
0x00,0x80,0x80,0x5F,0x40,0x20,0x10,0x0E,0x10,0x20,0x60,0xDF,0x40,0x00,0x00,0x00};
uchar code zhi[]={0x00,0x08,0x08,0x08,0x08,0x08,0x09,0x0A,0x0C,0x88,0x48,0x28,0x1C,0x08,0x00,0x00,
0x20,0x60,0x30,0x08,0x18,0x24,0x24,0x22,0x41,0x40,0x40,0x40,0x40,0x40,0x40,0x00};
uchar code ye[]={0x10,0x61,0x06,0xE0,0x18,0x84,0xE4,0x1C,0x84,0x65,0xBE,0x24,0xA4,0x64,0x04,0x00,
0x04,0x04,0xFF,0x00,0x01,0x00,0xFF,0x41,0x21,0x12,0x0C,0x1B,0x61,0xC0,0x40,0x00};
uchar code jing[]={0x00,0x00,0x00,0x00,0x7E,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x7E,0x00,0x00,0x00,0x00,
0x00,0x7F,0x25,0x25,0x25,0x25,0x7F,0x00,0x00,0x7F,0x25,0x25,0x25,0x25,0x7F,0x00};
uchar code shi[]={0x00,0x10,0x0C,0x04,0x4C,0xB4,0x94,0x05,0xF6,0x04,0x04,0x04,0x14,0x0C,0x04,0x00,
0x00,0x82,0x82,0x42,0x42,0x23,0x12,0x0A,0x07,0x0A,0x12,0xE2,0x42,0x02,0x02,0x00};
uchar code yan[]={0x02,0xFA,0x82,0x82,0xFE,0x80,0x40,0x60,0x58,0x46,0x48,0x50,0x20,0x20,0x20,0x00,
0x08,0x08,0x04,0x24,0x40,0x3F,0x22,0x2C,0x21,0x2E,0x20,0x30,0x2C,0x23,0x20,0x00};
uchar code meng[]={0x40,0x44,0x24,0x14,0xFF,0x94,0x64,0x40,0x24,0x14,0xFF,0x0C,0x34,0x64,0x24,0x00,
0x00,0x80,0x88,0x88,0x46,0x45,0x29,0x31,0x11,0x09,0x05,0x03,0x01,0x00,0x00,0x00};
uchar code face[]={0xE0,0x10,0x0C,0x24,0x22,0x21,0x21,0x81,0x01,0x21,0x21,0x22,0x24,0x0C,0x10,0xE0,
0x07,0x08,0x30,0x20,0x40,0x88,0x90,0x97,0x94,0x90,0x88,0x40,0x20,0x30,0x08,0x07};

uchar * code zichuan[]={jia,meng,zhi,ye,jing,shi,yan,face};

//--------------------------------------------------------
//数字字模
//每个数字8X16 x+8 page+2 y+16
//--------------------------------------------------------
uchar code num0[]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00};
uchar code num1[]={0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00};
uchar code num2[]={0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00};
uchar code num3[]={0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00};
uchar code num4[]={0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00};
uchar code num5[]={0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00};
uchar code num6[]={0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00};
uchar code num7[]={0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00};
uchar code num8[]={0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00};
uchar code num9[]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00};
uchar code dian[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00};

uchar * code albnum[]={num0,num1,num2,num3,num4,num5,num6,num7,num8,num9,dian};



void main()
{	
	uchar i;
	sysclk_init();
	port_init();
	lcd_init();
	lcd_clr();						//清屏
	lcd_display_num(0,0,flash_re(0));//显示 读取FLASH中的数据
	for(i=0;i<8;i++)				//显示  贾梦之液晶实验 和一个 笑脸 
	{
		lcd_word(16*i,2,zichuan[i]);
	}
	for(i=0;i<11;i++)
	{
		lcd_display_one_num(8*i,4,albnum[i]);
	}
	lcd_display_num(0,6,3.657);
	flash_wr(0,8.14);					//向flash中写数据

	for(;;);
}


//--------------------------------------------
//显示10-0之间的小数 有效数字4位
//每个数字宽8 高16   带小数点共宽5位 40列
//x:数字列位置(0-87) y:数组行(页)(1-8)  num:显示的数字(10-0之间的浮点数)
//--------------------------------------------
void lcd_display_num(uchar x,uchar y,float num)
{
	lcd_display_one_num(x,y,albnum[(uchar)(num)]);
	x+=8;
	lcd_display_one_num(x,y,albnum[10]);			//显示小数点
	x+=8;
	lcd_display_one_num(x,y,albnum[((uint)(num*=10))%10]);
	x+=8;
	lcd_display_one_num(x,y,albnum[((uint)(num*=10))%10]);
	x+=8;
	lcd_display_one_num(x,y,albnum[((uint)(num*=10))%10]);
}

//--------------------------------------------
//显示1个阿拉伯数字
//每个数字宽8 高16
//wordx:数字列位置(0-119) wordy:数组行(页)(1-8)  num:显示的数字(10-0之间的浮点数)
//--------------------------------------------

void lcd_display_one_num(uchar wordx,uchar wordy,uchar *n)
{
	uchar i;
	lcd_set_page(wordy);
	lcd_set_colume(wordx);
	for(i=0;i<8;i++)
		lcd_send_data(*(n+i));
	lcd_set_page(wordy+1);
	lcd_set_colume(wordx);
	for(i=0;i<8;i++)
		lcd_send_data(*(n+i+8));
}
void delay(uint i)
{
	for(;i>0;i--);
}
void lcd_send_data(uchar dat)
{
	uchar i;
	LCD_CS=0;				//片选选通
	LCD_A0=1;				//选择发送数据
	LCD_SCK=1;
	for(i=0;i<8;i++)
	{
		dat<<=1;				//将要发送位送人CY寄存器
		LCD_DA=CY;			//发送CY中字节
		LCD_SCK=0;
		delay(10);
		LCD_SCK=1;			//时钟电平上升沿 数据位送给LCD
		delay(10);
	}
	LCD_CS=1;				//片选关
	delay(20);
}
void lcd_send_cmd(uchar dat)
{
	uchar i;
	LCD_CS=0;				//片选选通
	LCD_A0=0;				//选择发送命令
	LCD_SCK=1;
	for(i=0;i<8;i++)
	{
		dat<<=1;				//将要发送位送人CY寄存器
		LCD_DA=CY;			//发送CY中字节
		LCD_SCK=0;
		delay(10);
		LCD_SCK=1;			//时钟电平上升沿 数据位送给LCD
		delay(10);
	}
	LCD_CS=1;				//片选关
	delay(20);
}
void lcd_init()
{
	LCD_RES=1;
	delay(20000);
	lcd_send_cmd(0xE2);			//复位
	lcd_send_cmd(0xA2);			//d0:Set LCD drive voltage bias ratio 0=1/9bias 1=1/7bias
    lcd_send_cmd(0xC8);			//d3:select COM output direction 0=normal 1=reverse
	lcd_send_cmd(0xA0);			//d0:select SEG output direction 0=normal 1=reverse
	lcd_send_cmd(0xA6);			//d0:0=display normal 1=reverse
	lcd_send_cmd(0xF8);			//select booster ratio
	lcd_send_cmd(0x00);			//select booster ratio d0&d1:00=4x
	lcd_send_cmd(0x2C);			//d2:1=select internal power supply operating mode
	lcd_send_cmd(0x2E);
	lcd_send_cmd(0x2F);
	lcd_send_cmd(0x81);			//select the VO output voltage electronic volume register
	lcd_send_cmd(0x14);			//select the VO output voltage electronic volume register
	lcd_send_cmd(0x0E);			//select the VO output voltage electronic volume register
	lcd_send_cmd(0xAF);			//d0:LCD display ON=1/OFF=0
	lcd_send_cmd(0xE0);
	lcd_send_cmd(0x40);			//Set the display RAM start line address
}
void lcd_set_page(uchar dat)
{
	lcd_send_cmd(0xb0|dat);
}
void lcd_set_colume(uchar dat)
{
	uchar tmp;
	tmp=dat>>4;
	lcd_send_cmd(0x10|tmp);			//送列地址高四位
	tmp=0x0f&dat;
	lcd_send_cmd(tmp);				//送列地址低四位
}
void lcd_clr()
{
	uchar i,j;
	for(i=0;i<8;i++)
	{
		lcd_set_page(i);
		lcd_set_colume(0);
		for(j=0;j<128;j++)
			lcd_send_data(0x00);
	}
}
//-------------------------------------------------------
//x:列(0-127) y:行(0-63)
//-------------------------------------------------------
void lcd_point(uchar x,uchar y)	
{
	lcd_set_colume(x);			//设置列			
	lcd_set_page(y>>3);			//设置页
	lcd_send_data(1<<(0x07&y));	
}
//-------------------------------------------------------
//每个汉字宽16 高2页
//
//wordx:汉字列位置(0-111) wordy:汉字行(0-8) word:字模数组名
//-------------------------------------------------------
void lcd_word(uchar wordx,uchar wordy,uchar *word)	
{
	uchar i;
	lcd_set_page(wordy);
	lcd_set_colume(wordx);
	for(i=0;i<16;i++)
		lcd_send_data(*(word+i));
	lcd_set_page(wordy+1);
	lcd_set_colume(wordx);
	for(i=0;i<16;i++)
		lcd_send_data(*(word+i+16));
}

void sysclk_init()
{
	WDTCN=0XDE;					//关看门狗
	WDTCN=0XAD;
	OSCICN=0x07;				//内部16M时钟
}


void port_init()
{
	XBR0=0X00;					//CEX0,CEX1连接到端口
	XBR1=0X00;
	XBR2=0X40;					//交叉开关允许
	PRT0CF=0Xff;				//P0口输出方式推挽
	PRT1CF=0Xff;				//P1口输出方式推挽
	PRT2CF=0Xff;				//P2口输出方式推挽
}

//----------------------------------------------
//向flash的128字节扇区写数据  扇区地址0x8000-0x807f
//dat 要存储的数据   x:存储在128字节扇区的第X字节
//----------------------------------------------
void flash_wr(uchar x,float dat)
{
	float xdata *pwr=0x8000+8*x;//写指针
	FLSCL=0x89;
	PSCTL=0x03;					//擦除允许 写允许
	*pwr=1;
	PSCTL=0x01;					//写允许
	*pwr=dat;
}

//----------------------------------------------
//读取flash的128字节扇区内容
//----------------------------------------------
float flash_re(uchar x)
{
	float code *pre=0x8000+8*x;//读指针
	return *pre;
}

⌨️ 快捷键说明

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