📄 test1.c
字号:
#include<avr/io.h>
#include<util/delay.h>
#include"pic_temp.h"
#define NOP() asm("nop")
#define DATA_LO_DDR DDRA
#define DATA_LO_PORT PORTA
#define DATA_LO_PIN PINA
#define DATA_HI_DDR DDRD
#define DATA_HI_PORT PORTD
#define DATA_HI_PIN PIND
#define LCD_CS_DDR DDRB
#define LCD_CS_PORT PORTB
#define LCD_CS_PIN PINB
#define LCD_CS_BIT 0
#define LCD_RS_DDR DDRB
#define LCD_RS_PORT PORTB
#define LCD_RS_PIN PINB
#define LCD_RS_BIT 1
#define LCD_WR_DDR DDRB
#define LCD_WR_PORT PORTB
#define LCD_WR_PIN PINB
#define LCD_WR_BIT 2
#define LCD_RD_DDR DDRB
#define LCD_RD_PORT PORTB
#define LCD_RD_PIN PINB
#define LCD_RD_BIT 3
#define LCD_RST_DDR DDRB
#define LCD_RST_PORT PORTB
#define LCD_RST_PIN PINB
#define LCD_RST_BIT 4
#define DATA_INPUT() {\
DATA_LO_DDR = 0x00;\
DATA_HI_DDR = 0x00;\
}
#define DATA_OUTPUT() {\
DATA_LO_DDR = 0xff;\
DATA_HI_DDR = 0xff;\
}
#define LCD_CS_H() LCD_CS_PORT |= 1<<LCD_CS_BIT
#define LCD_CS_L() LCD_CS_PORT &= ~(1<<LCD_CS_BIT)
#define LCD_RS_H() LCD_RS_PORT |= 1<<LCD_RS_BIT
#define LCD_RS_L() LCD_RS_PORT &= ~(1<<LCD_RS_BIT)
#define LCD_WR_H() LCD_WR_PORT |= 1<<LCD_WR_BIT
#define LCD_WR_L() LCD_WR_PORT &= ~(1<<LCD_WR_BIT)
#define LCD_RD_H() LCD_RD_PORT |= 1<<LCD_RD_BIT
#define LCD_RD_L() LCD_RD_PORT &= ~(1<<LCD_RD_BIT)
#define LCD_RST_H() LCD_RST_PORT |= 1<<LCD_RST_BIT
#define LCD_RST_L() LCD_RD_PORT &= ~(1<<LCD_RST_BIT)
#define PORT_INI() {\
DATA_INPUT();\
LCD_CS_H();\
LCD_RS_H();\
LCD_WR_H();\
LCD_RD_H();\
LCD_RST_L();\
LCD_CS_DDR |= 1<<LCD_CS_BIT;\
LCD_RS_DDR |= 1<<LCD_RS_BIT;\
LCD_WR_DDR |= 1<<LCD_WR_BIT;\
LCD_RD_DDR |= 1<<LCD_RD_BIT;\
LCD_RST_DDR |= 1<<LCD_RST_BIT;\
}
void LCD_WR_REG(unsigned char index,unsigned int val)
{
LCD_CS_L();
LCD_RS_L();
DATA_OUTPUT();
DATA_LO_PORT = (unsigned char)index;
DATA_HI_PORT = 0;
//DATA_HI_PORT = (unsigned char)(index>>8);
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
LCD_RS_H();
DATA_LO_PORT = (unsigned char)val;
DATA_HI_PORT = (unsigned char)(val>>8);
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
LCD_CS_H();
}
unsigned int LCD_RD_REG(unsigned char index)
{
unsigned int ret;
LCD_CS_L();
LCD_RS_L();
DATA_OUTPUT();
DATA_LO_PORT = (unsigned char)index;
DATA_HI_PORT = 0;
//DATA_HI_PORT = (unsigned char)(index>>8);
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
LCD_RS_H();
DATA_INPUT();
ret = DATA_HI_PIN;
ret <<= 8;
ret += DATA_LO_PIN;
LCD_RD_L();
NOP();
NOP();
LCD_RD_H();
LCD_CS_H();
return ret;
}
void LCD_Write_Start()
{
LCD_CS_L();
LCD_RS_L();
DATA_OUTPUT();
DATA_LO_PORT = 0x22;
DATA_HI_PORT = 0x00;
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
LCD_RS_H();
}
void LCD_Write_Data(unsigned int val)
{
DATA_LO_PORT = (unsigned char)val;
DATA_HI_PORT = (unsigned char)(val>>8);
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
}
void LCD_Write_End()
{
LCD_CS_H();
}
void LCD_Read_Start()
{
LCD_CS_L();
LCD_RS_L();
DATA_OUTPUT();
DATA_LO_PORT = 0x22;
DATA_HI_PORT = 0x00;
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
LCD_RS_H();
DATA_INPUT();
LCD_RD_L();//dummy read
NOP();
LCD_RD_H();
NOP();
NOP();
}
unsigned int LCD_RD_DATA()
{
unsigned int ret;
LCD_RD_L();
NOP();
ret = DATA_HI_PIN;
ret <<= 8;
ret += DATA_LO_PIN;
LCD_RD_H();
NOP();
NOP();
return ret;
}
void LCD_Read_End()
{
LCD_CS_H();
}
void delay_Nms(unsigned int n)
{
while(n--)_delay_ms(1);
}
#define Display_ON() LCD_WR_REG(0x07,0x0173)
#define Display_OFF() LCD_WR_REG(0x07,0x0000)
void LCD_Init()
{
PORT_INI();
LCD_RST_L();
delay_Nms(10);
LCD_RST_H();
//delay 10ms
delay_Nms(10);
//initializing funciton 1
LCD_WR_REG(0xe5,0x8000);
LCD_WR_REG(0x00,0x0001);
LCD_WR_REG(0x2b,0x0010);
LCD_WR_REG(0x01,0x0100);
LCD_WR_REG(0x02,0x0700);
LCD_WR_REG(0x03,0x1230);
LCD_WR_REG(0x04,0x0000);
LCD_WR_REG(0x08,0x0202);
LCD_WR_REG(0x09,0x0000);
LCD_WR_REG(0x0a,0x0000);
LCD_WR_REG(0x0c,0x0000);
LCD_WR_REG(0x0d,0x0000);
LCD_WR_REG(0x0f,0x0000);
LCD_WR_REG(0x50,0x0000);
LCD_WR_REG(0x51,0x00ef);
LCD_WR_REG(0x52,0x0000);
LCD_WR_REG(0x53,0x013f);
LCD_WR_REG(0x60,0x2700);
LCD_WR_REG(0x61,0x0001);
LCD_WR_REG(0x6a,0x0000);
LCD_WR_REG(0x80,0x0000);
LCD_WR_REG(0x81,0x0000);
LCD_WR_REG(0x82,0x0000);
LCD_WR_REG(0x83,0x0000);
LCD_WR_REG(0x84,0x0000);
LCD_WR_REG(0x85,0x0000);
LCD_WR_REG(0x90,0x0010);
LCD_WR_REG(0x92,0x0000);
LCD_WR_REG(0x93,0x0003);
LCD_WR_REG(0x95,0x0110);
LCD_WR_REG(0x97,0x0000);
LCD_WR_REG(0x98,0x0000);
//power setting function
LCD_WR_REG(0x10,0x0000);
LCD_WR_REG(0x11,0x0000);
LCD_WR_REG(0x12,0x0000);
LCD_WR_REG(0x13,0x0000);
delay_Nms(200);
LCD_WR_REG(0x10,0x17b0);
LCD_WR_REG(0x11,0x0004);
delay_Nms(50);
LCD_WR_REG(0x12,0x013e);
delay_Nms(50);
LCD_WR_REG(0x13,0x1f00);
LCD_WR_REG(0x29,0x000f);
delay_Nms(50);
LCD_WR_REG(0x20,0x0000);
LCD_WR_REG(0x21,0x0000);
//initializing function 2
LCD_WR_REG(0x30,0x0204);
LCD_WR_REG(0x31,0x0001);
LCD_WR_REG(0x32,0x0000);
LCD_WR_REG(0x35,0x0206);
LCD_WR_REG(0x36,0x0600);
LCD_WR_REG(0x37,0x0500);
LCD_WR_REG(0x38,0x0505);
LCD_WR_REG(0x39,0x0407);
LCD_WR_REG(0x3c,0x0500);
LCD_WR_REG(0x3d,0x0503);
//display on
LCD_WR_REG(0x07,0x0173);
//Display_ON();
}
void LCD_Set_XY(unsigned int x, unsigned int y)
{
LCD_WR_REG(0x20,x);
LCD_WR_REG(0x21,y);
}
void LCD_Set_Window(unsigned int startX,unsigned int startY,unsigned int endX,unsigned int endY)
{
LCD_Set_XY(startX,startY);
LCD_WR_REG(0x50,startX);
LCD_WR_REG(0x52,startY);
LCD_WR_REG(0x51,endX);
LCD_WR_REG(0x53,endY);
}
void LCD_test()
{
unsigned int i,j;
LCD_Write_Start();
for(i=0;i<320;i++)
for(j=0;j<240;j++)
{
if(i>279)LCD_Write_Data(0x0000);
else if(i>239)LCD_Write_Data(0x001f);
else if(i>199)LCD_Write_Data(0x07e0);
else if(i>159)LCD_Write_Data(0x07ff);
else if(i>119)LCD_Write_Data(0xf800);
else if(i>79)LCD_Write_Data(0xf81f);
else if(i>39)LCD_Write_Data(0xffe0);
else LCD_Write_Data(0xffff);
}
LCD_Write_End();
}
unsigned char LCD_DrawPicture(unsigned char startX, unsigned char startY, unsigned int *pic, unsigned char sizeX, unsigned char sizeY)
{
unsigned int endX,endY;
unsigned long totalPixels = (unsigned long)sizeX * (unsigned long)sizeY;
endX = startX+sizeX-1;
endY = startY+sizeY-1;
if(endX>239 || endY>319)return 1;
LCD_Set_Window(startX,startY,endX,endY);
LCD_Write_Start();
while(totalPixels--)LCD_Write_Data(pgm_read_word(pic++));
LCD_Write_End();
return 0;
}
unsigned char LCD_DrawPicture2(unsigned char startX, unsigned char startY, unsigned int *pic, unsigned char sizeX, unsigned char sizeY)
{
unsigned int i,j;
if((startX+sizeX)>240 || (startY+sizeY)>320)return 1;
for (j = 0; j<sizeY; j++)
{
LCD_Set_XY(startX,startY);
LCD_Write_Start();
for(i = 0; i<sizeX; i++)
{
LCD_Write_Data(pgm_read_word(pic++));
}
startY++;//换行
}
LCD_Write_End();
return 0;
}
int main()
{
LCD_Init();
LCD_test();
delay_Nms(2000);
LCD_DrawPicture2(55,111,(unsigned int *)yemin,136,102);
while(1);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -