📄 lcddis.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 + -