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

📄 200632153848.c

📁 c8051f 单片机与液晶显示模块的接口程序!比较有借鉴意义!与大家共享!
💻 C
字号:
#include <c8051f020.h>
#include <intrins.h>
#include <math.h>
#include <float.h>
#include <stdio.h>
//
sfr16 ADC0=0xbe;
sfr16 TMR3=0x94;
sfr16 TMR3RL=0x92;
//
#define SYSCLK 22118400
#define BAUDRATE 9600
#define SAMPLERATE0 5000
#define VREF0 2430
sbit LCD_DATA=P0^0;
sbit LCD_BUSY=P0^1;
#define key0 0xfe
#define key1 0xfd
#define key2 0xfb
#define key3 0xf7
#define key4 0xef
//
void sysclk_init(void);
void port_init(void);
void uart0_init(void);
void adc0_init(void);
void timer3_init(unsigned int count);
void adc0_isr(void);
void lcd_init(void);
void send(unsigned char sj);
void lcd_setcoordinate(unsigned int start_x,unsigned int start_y);
void delay100us(unsigned char count);
void Timer0_Delay (int ms);

unsigned char kbscan(void);
void lcd_cursor(void);
void DAC0_transition(long value);
void display_time_data(void);


void lcd_clr(unsigned int start_x,unsigned int start_y,unsigned int end_x,unsigned int end_y,unsigned char black);
void lcd_line(unsigned int start_x,unsigned int start_y,unsigned int end_x,unsigned int end_y);
//

long result[2];
unsigned char menu_down_line;
unsigned int second=0,second_h,second_l,minute=0,minute_h,minute_l,hour=0,hour_h,hour_l,s=0;
void main()
{
unsigned char key;


long v,v_h,v_l,temperature;
int t_h,t_l,temp_frac,temp_int,tf_h,tf_l;
WDTCN=0xde;
WDTCN=0xad;
sysclk_init();
port_init();
uart0_init();
timer3_init(SYSCLK/SAMPLERATE0);
adc0_init();
lcd_init();





EA=1;
AD0EN=1;
delay100us(100);
menu_down_line=0;

lcd_line(15,5,315,5);
   lcd_line(15,5,15,35);
   lcd_line(15,35,315,35);
   lcd_line(315,5,315,35);
   lcd_line(15+60,5,15+60,35);
   lcd_line(15+120,5,15+120,35);
   lcd_line(15+180,5,15+180,35);
   lcd_line(15+240,5,15+240,35);
lcd_setcoordinate(17,9);
send(0x42);
send(0x44);//
lcd_setcoordinate(17+60,9);
send(0x96);
send(0x97);//显示“报警”
lcd_setcoordinate(17+120,9);
send(0x54);
send(0x49);//
send(0x4d);
send(0x45);
lcd_setcoordinate(17+180,9);
send(0x80);
send(0x8f);//
lcd_setcoordinate(17+240,9);
send(0x8a);
send(0x8b); //



while(1)
{

EA=0;
v=result[0];
v=v/2;
EA=1;

DAC0_transition(result);
v=v*VREF0;
v=v>>16;
v=v/10;
v_h=v/10;
v_l=v%10;

send(0x1b);
send(0x6a);
send(0xb0);
send(0x96);
send(0x00);
send(0xa0);
send(0x01);
send(0x10);
send(0x00);
send(0xbe);
lcd_setcoordinate(151,161);
send(0x9b);
send(0x9c);
send(0x30+v_h);
send(0x30+v_l);
lcd_clr(200,160,270,190);
send(0x30+hour_h);
send(0x30+hour_l);
send(0x3a);
send(0x30+minute_h);
send(0x30+minute_l);

delay100us(100);
EA=0;
temperature=result[1];
EA=1;
lcd_setcoordinate(56,87);
lcd_clr(55,86,95,126);
	temperature = temperature - 41380;
temperature = (temperature * 100l) / 156;
temp_int = temperature / 100;
temp_frac = temperature - (temp_int * 100);
t_h=temp_int/10;

t_l=temp_int%10;

tf_h=temp_frac/10;
tf_l=temp_frac%10;
send(0x30+t_h);
		send(0x30+t_l);
send(0x30+tf_h);
send(0x30+tf_l);


key=kbscan();
{if(key!=0)
	{
	switch(key)
		{
		case key1:
		if(menu_down_line<5) 
		{
		menu_down_line=menu_down_line+1;
		lcd_setcoordinate(17+60*menu_down_line,9);
		lcd_cursor();
		}
		else 
		{menu_down_line=0;
		lcd_setcoordinate(17,9);
		lcd_cursor();
		}
		break;
		case key0:
		lcd_setcoordinate(125,87);
		lcd_cursor();
		send(0x31);
		break;
		case key2:
		if(menu_down_line==0)
		{
		
		lcd_clr(15,35,75,65);
		lcd_setcoordinate(17,39);
		send(0x94);
		send(0x95);
		send(0x31);
		send(0x3a);
		send(0x32);
	
		delay100us(100);
		lcd_clr(15,65,75,95);
		lcd_setcoordinate(17,69);
		send(0x94);
		send(0x95);
		send(0x32);
		send(0x3a);
		send(0x34);
		}
		else if(menu_down_line==1)
		{
		lcd_clr(75,35,135,65);
		lcd_setcoordinate(77,39);
		send(0x56);
		send(0x68);
		send(0x3c);
		send(0x35);
		delay100us(100);
		lcd_clr(75,65,135,95);
		lcd_setcoordinate(77,69);
		send(0x56);
		send(0x6c);
		send(0x3c);
		send(0x30);
		}
		else if(menu_down_line==2)
		{
		lcd_clr(135,35,195,65);
		lcd_setcoordinate(137,39);
		display_time_data();
		}
		else if(menu_down_line==3)
		{
		lcd_clr(195,35,255,65);
		lcd_setcoordinate(197,39);
		send(0xea);
		}
		else if(menu_down_line==4)
		{
		lcd_clr(255,35,315,65);
		lcd_setcoordinate(257,39);
		send(0x30+t_h);
		send(0x30+t_l);
		send(0x30+tf_h);
		send(0x30+tf_l);
		}

		break;
		case key3:
		send(0x1b);
		send(0x51);
		send(0x00);
		lcd_line(15,5,315,5);
   lcd_line(15,5,15,35);
   lcd_line(15,35,315,35);
   lcd_line(315,5,315,35);
   lcd_line(15+60,5,15+60,35);
   lcd_line(15+120,5,15+120,35);
   lcd_line(15+180,5,15+180,35);
   lcd_line(15+240,5,15+240,35);
lcd_setcoordinate(17,9);
send(0x94);
send(0x95);//
lcd_setcoordinate(17+60,9);
send(0x96);
send(0x97);//显示“报警”
lcd_setcoordinate(17+120,9);
send(0x98);
send(0x99);//
lcd_setcoordinate(17+180,9);
send(0x8e);
send(0x8f);//
lcd_setcoordinate(17+240,9);
send(0x8a);
send(0x8b); //

		break;
		case key4:
		lcd_setcoordinate(125,87);
		lcd_cursor();
		send(0x34);
		break;

		}
	}
else
while(key);
}

}



}



void sysclk_init(void)
{
unsigned int i;
OSCXCN=0x67;
for(i=0;i<256;i++);
while(!(OSCXCN&0x80));
OSCICN=0x88;
}
void port_init(void)
{
XBR0=0x04;
XBR1=0x00;
XBR2=0x40;
P0MDOUT=0x01;
}
void uart0_init(void)
{
SCON0=0xd0;
TCON=0x40;
TMOD=0x20;
TH1=-(SYSCLK/BAUDRATE/16);
TR1=1;
CKCON=0x10;
PCON=0x80;
TI0=0;
}
void adc0_init(void)
{
ADC0CN=0x45;
ADC0CF=(SYSCLK/2500000)<<3;
ADC0CF |= 0x01;
REF0CN=0x07;
AMX0CF=0x00;
AMX0SL=0x00;
EIE2 |= 0x02; // 允许ADC中断
}
void timer3_init(unsigned int count)
{
TMR3CN=0x02;
TMR3RL=-count;
TMR3=0xffff;
EIE2=0x00; // 禁止定时器3中断
TMR3CN=0x04;
}
void adc0_isr(void) interrupt 15
{
 
 while(!AD0INT);
AD0INT=0;
if(AMX0SL==0)
{
result[0]=ADC0;
AMX0SL=8;
}
else
{result[1]=ADC0;
AMX0SL=0;
}
}
void lcd_init(void)
{
send(0x1b);
send(0x51);
send(0x00);
send(0x1b);
send(0x33);
send(0x1b);
send(0x66);
send(0x04);
}
void send(unsigned char sj)
{
while(LCD_BUSY);
SBUF0=sj;
while(!TI0);
TI0=0;
}
void lcd_setcoordinate(unsigned int start_x,unsigned int start_y)
{
    unsigned char lyb_ls=0;
    send(0x1b);
    send(0x7a);
    lyb_ls=start_x/256;
    send(lyb_ls);
    send(start_x-lyb_ls);
    lyb_ls=start_y/256;
    send(lyb_ls);
    send(start_y-lyb_ls);
}
void delay100us(unsigned char count)
{
	
	unsigned char i,j,k;
	for(k=0;k<count;k++)
	{	
		for(i=0;i<5;i++)
		{
			for(j=0;j<86;j++);
		}
	}
}
unsigned char kbscan(void)
{
P1=0xff;
if((P1&0xff)!=0xff)
	{
	delay100us(50);
	if((P1&0xff)!=0xff)
		{
		return(P1&0xff);
		}
	}
else
	{
	return(0);
	}
}
void lcd_cursor(void)
{
	send(0x1b);
	send(0x74);
	send(0x18);
	send(0x18);
	send(0xff);
	send(0x7e);
	send(0x3c);
	send(0x18);
}
void lcd_line(unsigned int start_x,unsigned int start_y,unsigned int end_x,unsigned int end_y)
{
    unsigned char lyb_ls=0;
    send(0x1b);
    send(0x78);
    lyb_ls=start_x/256;
    send(lyb_ls);
    send(start_x-lyb_ls);
    lyb_ls=start_y/256;
    send(lyb_ls);
    send(start_y-lyb_ls);
    lyb_ls=end_x/256;
    send(lyb_ls);
    send(end_x-lyb_ls);
    lyb_ls=end_y/256;
    send(lyb_ls);
    send(end_y-lyb_ls);
}

void lcd_clr(unsigned int start_x,unsigned int start_y,unsigned int end_x,unsigned int end_y,unsigned char black)
  {
    unsigned char lyb_ls=0;
    send(0x1b);
    send(0x6a);
    lyb_ls=start_x/256;
	if(black)
    send(lyb_ls+0x80);
	else
	send(lyb_ls+0xf0);
    send(start_x-lyb_ls);
    lyb_ls=start_y/256;
    send(lyb_ls+4);
    send(start_y-lyb_ls);
    lyb_ls=end_x/256;
    send(lyb_ls);
    send(end_x-lyb_ls);
    lyb_ls=end_y/256;
    send(lyb_ls);
    send(end_y-lyb_ls);
    delay100us(200);
  }
 void DAC0_transition(long value)
{
	unsigned char temp_h,temp_l;
	DAC0CN  = 0x84;   // 
	temp_h  = value/256; 
	temp_l  = value%256;
	DAC0L   = temp_l;
	DAC0H   = temp_h;
}
void display_time_data(void)
{
for(s=0;s<100;s++)
{
delay100us(100);
s=s+1;
}

if(second<59) second=second+1;
else second=0;
second_h=second/10;
second_l=second%10;

send(0x1b);
send(0x33);
send(0x30+second_h);
send(0x30+second_l);
if(second==0)
	{
	if(minute<59) minute=minute+1;
	else minute=0;
	minute_h=minute/10;
	minute_l=minute%10;
	lcd_clr(90,50,120,80);
	
	send(0x30+minute_h);
	send(0x30+minute_l);
	if(minute==0)
		{
		if(hour<24)hour=hour+1;
		else hour=0;
		hour_h=hour/10;
		hour_l=hour%10;
		lcd_clr(60,50,90,80);
		
		send(0x30+hour_h);
		send(0x30+hour_l);
		}
	}
}

⌨️ 快捷键说明

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