📄 lcd.c
字号:
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/delay.h>
#include "self_def.h"
//定义字码数组
unsigned char zima[]={
//{0}
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//{1}
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//{2}
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//{3}
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//{4}
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//{5}
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//{6}
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//{7}
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//{8}
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//{9}
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//{E}
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//{S}
0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//{W}
0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//{N}
0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
//发送主控制指令
void OUTMI(uchar i)
{
E1_H;
EN_INS;
PORTA=i;
//_delay_us(10);
E1_L;
}
//发送从控制指令
void OUTSI(uchar i)
{
E2_H;
EN_INS;
PORTA=i;
//_delay_us(10);
E2_L;
}
//发送主数据
void OUTMD(uchar i)
{
E1_H;
EN_DATA;
PORTA=i;
//_delay_us(10);
E1_L;
}
//发送从数据
void OUTSD(uchar i)
{
E2_H;
EN_DATA;
PORTA=i;
//_delay_us(10);
E2_L;
}
//设置页面
void SetPage(uchar i,uchar j)
{
OUTMI(0xB8|i);
OUTSI(0xB8|j);
}
//设置物理地址
void SetAddress(uchar i,uchar j)
{
OUTMI(i);
OUTSI(i);
}
//清屏
void clrscr(void)
{
uchar i,page;
for(page=0;page<4;page++)
{
SetPage(page,page);
SetAddress(0,0);
for(i=0;i<61;i++)
{
OUTMD(0);
OUTSD(0);
}
}
}
//显示两行汉字
//字码为宋体,常规,小四,16*16格式
void display_word(uchar d,uchar x_add,uchar layer)
{
//page表示页面,address表示显存的物理地址,window左右部分
uchar x,address=0,window=0;
unsigned int d_where;
//uchar dis_data;
d_where=d*32;
for(x=0;x<16;x++)
{
if(x_add>60){
window=1;
address=x_add%61;
}
else
address=x_add;
if(layer==0)
{
//写第一行8个字
SetPage(0,0); //写page0
SetAddress(address,address);
if(1==window) //判断左边还是右边,即主还是从
OUTSD(zima[d_where]);
else
OUTMD(zima[d_where]);
SetPage(1,1); //写page1
SetAddress(address,address);
if(1==window)
OUTSD(zima[d_where+16]);
else
OUTMD(zima[d_where+16]);
}
else
{
//写第二行8个字
SetPage(2,2);
SetAddress(address,address);
if(1==window)
OUTSD(zima[d_where]);
else
OUTMD(zima[d_where]);
SetPage(3,3);
SetAddress(address,address);
if(1==window)
OUTSD(zima[d_where+16]);
else
OUTMD(zima[d_where+16]);
}
x_add++;
d_where++;
}
}
//初始化LCD
void init_lcd(void)
{
DDRA=0xFF;
DDRB|=(1<<PB0)|(1<<PB1)|(1<<PB4);
DDRD|=(1<<PD4);
EN_WRITE;
OUTMI(0xE2);OUTSI(0xE2); //复位
OUTMI(0xAE);OUTSI(0xAE); //POWER SAVE
OUTMI(0xA4);OUTSI(0xA4); //动态驱动
OUTMI(0xA9);OUTSI(0xA9); //1/32占空比
OUTMI(0xA0);OUTSI(0xA0); //顺时针
OUTMI(0xEE);OUTSI(0xEE); //写模式
OUTMI(0x00); //column 0
OUTMI(0xC0); //从第一行开始显示
OUTSI(0x00);
OUTSI(0xC0);
OUTMI(0xAF);OUTSI(0xAF); //display on
}
//取字码地址
uchar get_d_where(uchar c)
{
uchar d_where;
if(c>='0'&&c<='9')
d_where=c-'0';
else if(c=='E'||c=='e')
d_where=10;
else if(c=='S'||c=='s')
d_where=11;
else if(c=='W'||c=='w')
d_where=12;
else
d_where=13;
return d_where;
}
int main(void)
{
//时钟
//CLKPR=(1<<CLKPCE)|(1<<CLKPS1)|(1<<CLKPS0);
//OSCCAL=0xC7;
DDRD=(1<<PD2);
PORTD&=~(1<<PD2);
MCUCR=(1<<ISC01)|(1<<ISC00);
GICR=(1<<INT0);
SREG|=(1<<SREG_I);
init_lcd();
uchar gps_data[]={"Nn9654"};
uchar i=0,x_add=0,d_where,c;
clrscr();
while(gps_data[i]!='\0')
{
c=gps_data[i];
d_where=get_d_where(c);
display_word(d_where,x_add,0);
display_word(d_where,x_add,1);
x_add+=16;
i++;
}
_delay_us(100);
PORTD=(1<<PD2);
while(1);
}
SIGNAL(SIG_INTERRUPT0)
{
clrscr();
display_word(1,0,0);
display_word(2,16,0);
display_word(3,32,0);
display_word(4,48,0);
display_word(5,0,1);
display_word(6,16,1);
display_word(7,32,1);
display_word(8,48,1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -