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

📄 lcddis.c

📁 128×64液晶显示模块显示程序
💻 C
字号:
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include "char_model.h"

#define LcdCtrl_Port  PORTB
#define Lcd_Res       PB2
#define Lcd_A0        PB3
#define Lcd_RW        PB4
#define Lcd_E1        PB5
#define Lcd_E2        PB6
#define LcdData_Port  PORTC



uint8_t disp_buf[20];//显示缓存

uint8_t bw,sw,gw,sf,bf, led= 0,bw_s=0,sw_s=0,gw_s=0,key_right,key_left,key_down,key_up;
uint16_t ADC_rel = 0;
uint8_t flag_adc = 0;


//时间延迟
void Delay(uint32_t usecond)
{
	uint8_t j = 8;
	uint32_t i;
	for(i = 0; i < usecond; i++)
	{
		while(j--);
	}
}

//微控制器初始化
void MCUInit(void)
{
	PORTA = 0x0f;
	DDRA = 0x0f;
	
	PORTB = 0x00;
	DDRB = 0xff;
	
	PORTC = 0x00;
	DDRC = 0xff;
	
	PORTD = 0xff;
	DDRD = 0x00;
}




//命令-数据发送模块
//temp:命令或数据暂存变量,m_s:指令(0)—数据(1) 信号,l_r:左屏(0)-右屏(1)-全屏(2) 选择
void LcdDataSend(uint8_t temp, uint8_t m_s, uint8_t l_r)
{
	Delay(2);//不使用忙线,所以延迟2us,等待LCD空闲
	if(m_s == 0) //判断是指令还是数据:0-指令,1-数据
	{
		cbi(LcdCtrl_Port, Lcd_A0);
	}
	else
	{
		sbi(LcdCtrl_Port, Lcd_A0);
	}
	
	if(l_r == 0) //判断屏幕:0-左屏,1-右屏,2-全屏
	{
		sbi(LcdCtrl_Port, Lcd_E1);
		cbi(LcdCtrl_Port, Lcd_E2);
	}
	else if(l_r == 1)
	{
		cbi(LcdCtrl_Port, Lcd_E1);
		sbi(LcdCtrl_Port, Lcd_E2);
	}
	else if(l_r == 2)
	{
		sbi(LcdCtrl_Port, Lcd_E1);
		sbi(LcdCtrl_Port, Lcd_E2);
	}
	
	Delay(5);
	LcdData_Port = temp;//送如指令或数据
	Delay(5);
	cbi(LcdCtrl_Port, Lcd_E1);//关闭液晶,防止干扰
	cbi(LcdCtrl_Port, Lcd_E2);				
}

//通用显示模块
//addr:发送代码表的地址,page:显示的页,row:显示的列
void WordSend(uint8_t addr, uint8_t page, uint8_t row, uint8_t zy)
{
	uint8_t width;//字模宽度为12*12
	uint8_t hig;//字模高度为2页
	for(hig = 0; hig < 2; hig++)
	{
	    LcdDataSend(page, 0, zy);
	    LcdDataSend(row, 0, zy);
	    for(width = 0; width < 12; width++)
	    {
	        if(hig < 1)
			LcdDataSend(PRG_RDB(&CBYTE[addr][width]), 1, zy);
			else
			LcdDataSend(PRG_RDB(&CBYTE[addr][width + 12]), 1, zy);
		}
		page++;
	}
}

//lcd初始化
void LcdInit(void)
{
	cbi(LcdCtrl_Port, Lcd_Res);
	Delay(1000);
	sbi(LcdCtrl_Port, Lcd_Res);
	cbi(LcdCtrl_Port, Lcd_RW);
	
	LcdDataSend(0xe2, 0, 2);//reset
	LcdDataSend(0xae, 0, 2);//display on/off: off
	//LcdDataSend(0xc0, 0, 2);//display start line : 1
	LcdDataSend(0xa4, 0, 2);//static drive on/off: off
	//LcdDataSend(0x00, 0, 2);//column address set: 0
	//LcdDataSend(0xb8, 0, 2);//page address set: 1
	LcdDataSend(0xa9, 0, 2);//duty select: 1/32
	LcdDataSend(0xa0, 0, 2);//adc select: rightward outpu
	LcdDataSend(0xee, 0, 2);//read modify write: off 
	LcdDataSend(0xaf, 0, 2);//display on off: ON	
}	
	
//清屏
//
void LcdClear(void)
{
	uint8_t temp1, temp2;
	uint8_t leaf = 0xb8;
	for(temp1 = 0; temp1 < 4; temp1++)
	{
		LcdDataSend(leaf, 0, 2);
		LcdDataSend(0, 0, 2);
		for(temp2 = 0; temp2 < 60; temp2++)
		{
			LcdDataSend(0, 1, 2);
		}
		leaf++;
	}
	Delay(1000);
}

//ADC初始化
void ADC_Init(void)
{
  ADMUX=0xc7;
  ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
  
}

INTERRUPT(SIG_ADC)
{
	
	uint16_t h=0,l=0;
	l=ADCL;
	h=ADCH;
	
	ADC_rel=(h<<8)+l;	
}
//INT0初始化
void INT0_init(void)
{
	MCUCR = 0x10;
	GICR = 0x40;
	
}
INTERRUPT(SIG_INTERRUPT0)
{
	while(1)
	{
	disp0();
	/*if(key_left == 0)
		{
		if(gw_s<9)
		{gw_s++;}
		else gw_s=0;
		}
	if(key_down == 0)
		{
		if(sw_s<9)
		{sw_s++;}
		else sw_s=0;
		}
	if(key_right == 0)
		{
		 goto loop;
		}*/
	}

}

void ADCtoBCD(uint16_t temp)
	{   
		
		bw=temp/1000;
		sw=(temp%1000)/100;
		gw=(temp%100)/10;
		sf=temp%10;
	}
//灯驱动,利用A口驱动4个发光二极管
void leddis(uint8_t a)
	{
	switch(a)
	{
	case 1: PORTA &= ~(1<<0);break;
	case 2: PORTA &= ~(1<<1);break;
	case 3: PORTA &= ~(1<<2);break;
	case 4: PORTA &= ~(1<<3);break;
	case 5: PORTA &= ~(1<<4);break;
	default:break;
	}
	}
//四路显示
void disp(uint8_t i)
	{
	leddis(i);
	WordSend(10, 0xb8, 0, 0);
	WordSend(25, 0xb8, 12, 0);
	WordSend(i, 0xb8, 24, 0);
	WordSend(25, 0xb8, 36, 0);
	WordSend(11, 0xb8, 48, 0);
	WordSend(12, 0xb8, 0, 1);
	WordSend(13, 0xb8, 12, 1);
	WordSend(14, 0xb8, 24, 1);
	WordSend(15, 0xb8, 36, 1);
	
	WordSend(bw, 0xba, 0, 0);
	WordSend(sw, 0xba, 12, 0);
	WordSend(gw, 0xba, 24, 0);
	WordSend(16, 0xba, 36, 0);
	WordSend(sf, 0xba, 48, 0);
	WordSend(bf, 0xba, 0, 1);
	WordSend(19, 0xba, 24, 1);
	}

//设置显示
void disp0(void)
	{
	WordSend(20, 0xb8, 0, 0);
	WordSend(21, 0xb8, 12, 0);
	WordSend(22, 0xb8, 24, 0);
	WordSend(23, 0xb8, 36, 0);
	WordSend(24, 0xb8, 48, 0);
	WordSend(12, 0xb8, 0, 1);
	WordSend(13, 0xb8, 12, 1);
	WordSend(14, 0xb8, 24, 1);
	WordSend(15, 0xb8, 36, 1);
	
	WordSend(25, 0xba, 0, 0);
	WordSend(25, 0xba, 12, 0);
	WordSend(25, 0xba, 24, 0);
	WordSend(sw_s, 0xba, 36, 0);
	WordSend(gw_s, 0xba, 48, 0);
	WordSend(25, 0xba, 0, 1);
	WordSend(19, 0xba, 24, 1);
	}
//主函数
int main(void)
{
	
	

	MCUInit();
	LcdInit();
	LcdClear();
	sei();
	ADC_Init();
	INT0_init();
	while(1)
	{
	
  key_up = PIND&0x08;
  key_right = PIND&0x10;
  key_down = PIND&0x20;
  key_left = PIND&0x40;
	    
	   ADCtoBCD(ADC_rel);
	   if(key_down==0) 
	   {
	   //key_down=0x08;
	   disp(1);}
	   if(key_up==0)
	   {//key_up=0x10;
	   disp(2);}
	   if(key_left==0)
	   {//key_left=0x20;
	   disp(3);}
	   /*if(key_right==0)
	   {//key_right=0x40;
	   disp(4);}*/

	}
}

⌨️ 快捷键说明

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