📄 lcd.c
字号:
/******************************************
//测试系统
//芯片:ATmega16L
//频率:8MHz内频
//电压:3.3V
*******************************************/
#include"LCD.h"
/***************************************************
//颜色数值
//红色,绿色,蓝色,黄色,黑色,白色,天蓝色,紫色
****************************************************/
uint color[]={0xF800,0x07E0,0x001F,0xFFE0,0x0000,0xFFFF,0x07FF,0xF81F};
/***********************
1us延时函数
***********************/
void delay_us(uint16 t)
{
//_delay_us(1) ;
uint16 i;
while(--t)
{
i=8;
while(i--);
}
}
/**********************
1ms延时函数
***********************/
void delay_ms(uint16 t)
{
uint16 i;
while(--t)
{
i=1000;
while(--i) delay_us(1);
}
}
/*********************
I/O口初始化
**********************/
void LCD_IO_Init()
{
DDRA = 0xFF;
DDRC = 0xFF;
}
/********************************
写寄存器函数
********************************/
void LCD_WriteRegister(uint8 index)
{
LCD_RS_L ;
LCD_CS_H;
PORTA= index;
LCD_WR_L;
LCD_WR_H;
}
/***************************
写8位数据函数
****************************/
void LCD_WriteByte(uint8 data)
{
LCD_RS_H;
LCD_CS_H;
DATA= data;
LCD_WR_L;
LCD_WR_H ;
}
/***************************************************
//写寄存器数据函数
//输入:type 数据位数: 1为16位,0为8位。
****************************************************/
void LCD_WriteCommand(uint8 type,uint8 index,uint16 val)
{
LCD_RS_L ;
LCD_CS_H ;
DATA= index;
LCD_WR_L;
LCD_WR_H ;
delay_us(1);
LCD_RS_H;
if(type)
{
DATA= (uint8)(val>>8);
LCD_WR_L;
LCD_WR_H ;
}
delay_us(1);
DATA= (uint8)val;
LCD_WR_L;
LCD_WR_H ;
}
/***************************
//写16位数据函数
//输入: val数据
****************************/
void LCD_WriteData(uint16 val)
{
LCD_RS_H;
LCD_CS_H;
DATA= (uint8)(val>>8);
LCD_WR_L;
LCD_WR_H;
DATA= (uint8)val;
LCD_WR_L;
LCD_WR_H ;
}
/**********************
LCD初始化函数
***********************/
void LCD_Init()
{
LCD_IO_Init();
LCD_RST_L;
delay_ms(10);
LCD_RST_H;
delay_ms(10);
//initializing funciton 1
delay_us(10);
LCD_WriteRegister(0xA1);
delay_us(16);
LCD_WriteByte(0x00);
delay_us(90);
LCD_WriteRegister(0xA0);
delay_us(10);
LCD_WriteByte(0x00);
delay_us(10);
LCD_WriteCommand(0,0x70,0xC8);
delay_ms(10);
LCD_WriteCommand(0,0x72,0xA3);
delay_us(10);
LCD_WriteCommand(0,0x73,0x04);
delay_us(10);
LCD_WriteCommand(0,0x75,0x45);
delay_us(10);
LCD_WriteCommand(0,0x76,0x23);
delay_us(10);
LCD_WriteCommand(0,0x77,0x08);
delay_us(10);
LCD_WriteCommand(0,0x78,0x08);
delay_us(10);
LCD_WriteCommand(0,0x79,0x00);
delay_us(10);
LCD_WriteCommand(0,0x7F,0xF0);
delay_us(10);
LCD_WriteCommand(0,0x71,0x81);
delay_ms(2);
LCD_WriteCommand(0,0x0D,0x23);
delay_us(10);
LCD_WriteCommand(0,0x11,0x00);
delay_us(10);
LCD_WriteCommand(0,0x12,0x00);
delay_us(10);
LCD_WriteCommand(0,0x21,0x37);
delay_us(10);
LCD_WriteCommand(0,0x22,0x02);
delay_us(10);
LCD_WriteCommand(0,0x23,0x24);
delay_us(10);
delay_us(10);
LCD_WriteCommand(0,0x24,0x13);
delay_us(10);
LCD_WriteCommand(0,0x25,0x0A);
delay_us(10);
LCD_WriteCommand(0,0x26,0x82);
delay_us(10);
LCD_WriteCommand(0,0x27,0x01);
delay_us(10);
LCD_WriteCommand(0,0x1E,0x25);
delay_us(10);
LCD_WriteCommand(0,0x1F,0x59);
delay_us(10);
//GAMMA设置
LCD_WriteCommand(1,0x30,0x0777);
delay_us(10);
LCD_WriteCommand(1,0x31,0x0444);
delay_us(10);
LCD_WriteCommand(1,0x32,0x0555);
delay_us(10);
LCD_WriteCommand(1,0x33,0x0444);
delay_us(10);
LCD_WriteCommand(1,0x34,0x0333);
delay_us(10);
LCD_WriteCommand(1,0x35,0x0333);
delay_us(10);
LCD_WriteCommand(1,0x36,0x0333);
delay_us(10);
LCD_WriteCommand(1,0x37,0x0333);
delay_us(10);
LCD_WriteCommand(1,0x38,0x0444);
delay_us(10);
LCD_WriteCommand(1,0x39,0x0555);
delay_us(10);
LCD_WriteCommand(1,0x3A,0x0666);
delay_us(10);
LCD_WriteCommand(1,0x3B,0x0666);
delay_us(10);
LCD_WriteCommand(1,0x3C,0x0777);
delay_us(10);
LCD_WriteCommand(1,0x3D,0x0777);
delay_us(10);
LCD_WriteCommand(1,0x3E,0x0777);
delay_us(10);
LCD_WriteCommand(1,0x3F,0x0777);
delay_us(10);
LCD_WriteCommand(1,0x40,0x0777);
delay_us(10);
LCD_WriteCommand(1,0x41,0x0777);
delay_us(10);
LCD_WriteCommand(1,0x42,0x0777);
delay_us(10);
LCD_WriteCommand(1,0x43,0x0777);
delay_us(10);
LCD_WriteCommand(1,0x44,0x0777);
delay_us(10);
LCD_WriteCommand(1,0x45,0x0777);
delay_us(10);
LCD_WriteCommand(1,0x46,0x0777);
delay_us(10);
LCD_WriteCommand(1,0x47,0x0777);
delay_us(10);
LCD_WriteCommand(1,0x48,0x0777);
delay_us(10);
LCD_WriteCommand(1,0x49,0x0777);
delay_us(10);
LCD_WriteCommand(1,0x4A,0x0777);
delay_us(10);
LCD_WriteCommand(1,0x4B,0x0777);
delay_us(10);
LCD_WriteCommand(1,0x4C,0x0777);
delay_us(10);
LCD_WriteCommand(1,0x4D,0x0666);
delay_us(10);
LCD_WriteCommand(1,0x4E,0x0666);
delay_us(10);
LCD_WriteCommand(1,0x4F,0x0666);
delay_us(400);
LCD_WriteCommand(0,0x00,0x04); //扫描方向控制
delay_us(10);
LCD_WriteCommand(0,0x01,0x07);
delay_us(10);
//写区域控制
LCD_WriteCommand(0,0x02,0x00); //X
LCD_WriteCommand(1,0x03,0x0000); //Y
LCD_WriteCommand(0,0x04,0xEF); //结束列数(0~239)
LCD_WriteCommand(1,0x05,0x013F); //结束行数(0~319)
LCD_WriteCommand(0,0x06,0x00);
LCD_WriteCommand(1,0x07,0x0000);
LCD_WriteCommand(0,0x08,0xEF);
LCD_WriteCommand(1,0x09,0x013F);
delay_us(10);
LCD_WriteCommand(0,0x0A,0x00);
delay_us(10);
LCD_WriteCommand(0,0x0B,0x00);
delay_us(10);
LCD_WriteCommand(0,0x0C,0x00);
delay_us(10);
LCD_WriteCommand(0,0x14,0x00);
delay_us(10);
LCD_WriteCommand(0,0x15,0x00);
delay_us(10);
LCD_WriteCommand(0,0x16,0x00);
delay_us(10);
LCD_WriteCommand(1,0x17,0x01FF);
delay_us(10);
LCD_WriteCommand(1,0x18,0x01FF);
delay_us(10);
LCD_WriteCommand(0,0x13,0x00);
delay_us(10);
LCD_WriteCommand(1,0x19,0x01FF);
delay_us(10);
LCD_WriteCommand(1,0x1B,0x01FF);
delay_us(10);
LCD_WriteCommand(1,0x1C,0x01FF);
delay_us(10);
LCD_WriteCommand(1,0x1A,0x01FF);
delay_us(10);
LCD_WriteCommand(0,0x1D,0x0E);
delay_us(10);
LCD_WriteCommand(0,0x10,0x06); //开显示
delay_us(100);
}
/******************************
//测试程序
//彩色测试
*******************************/
void LCD_test()
{
uint16 temp;
uint32 num,num1,num2;
uint8 n;
LCD_WriteCommand(0,0x02,0x00); //X
LCD_WriteCommand(1,0x03,0x0000); //Y
LCD_WriteCommand(0,0x04,0xEF); //结束列数(0~239)
LCD_WriteCommand(1,0x05,0x013F); //结束行数(0~319)
LCD_WriteRegister(0x0E);
//彩色条纹测试
for(n=0;n<8;n++)
{
temp=color[n];
for(num=40*240;num>0;num--)
LCD_WriteData(temp);
}
delay_ms(1000);
//彩色屏幕测试
for(n=0;n<8;n++)
{
LCD_WriteRegister(0x0E);
temp=color[n];
for(num1=(uint32)240*320;num1>0;num1--)
{
LCD_WriteData(temp);
/*
for(num2=320;num2>0;num2--)
{
LCD_WriteData(temp);
}*/
}
delay_ms(1000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -