📄 lcd.c
字号:
#include <stdio.h>#include <stdarg.h>#include <memory.h>#include <errno.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/mman.h>#include <sys/ioctl.h>#include <fcntl.h>#include <signal.h>#include <stdlib.h>#include <unistd.h>#include "pic.h"#define MEM_LCD_ADDR 0x50000000/* Memory mapping definitions */#define MAP_SIZE 4096UL#define MAP_MASK (MAP_SIZE - 1)#define DIS_DELAY 1volatile void *map_base;void Display_Picture(unsigned char pic[]);
void Display_Gray(void);
void Display_Grid(unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4);
void Initial_LCD(void);
inline void Write_Instruction(unsigned char cmd);
inline void Write_Data(unsigned char dat);
int main(int argc, char *argv[]){ int fd, i, rc, pin, dest_addr, id, retval, flag = 0; char *current, action, port; unsigned long readval, writeval; unsigned char temp = 0; if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1){ printf("Error opening /dev/mem\n"); exit(1); } /* Map one page */ map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, MEM_LCD_ADDR & ~MAP_MASK); if(map_base == (void *) -1){ printf("Error mapping memory\n"); close(fd); exit(1); } printf("PHY ADDR:0x%x, map_base:0x%x\n", MEM_LCD_ADDR, map_base); Initial_LCD();
while(1)
{
Display_Grid(0xff,0xff,0xff,0xff);
sleep(DIS_DELAY);
Display_Picture(pic1);
sleep(DIS_DELAY);
Display_Picture(pic2);
sleep(DIS_DELAY);
Display_Gray();
sleep(DIS_DELAY);
Display_Grid(0xff,0xff,0x00,0x00);
sleep(DIS_DELAY);
Display_Grid(0x00,0x00,0xff,0xff);
sleep(DIS_DELAY);
Display_Grid(0x00,0xff,0x00,0xff);
sleep(DIS_DELAY);
Display_Grid(0xff,0x00,0xff,0x00);
sleep(DIS_DELAY);
Display_Grid(0xff,0x00,0x00,0xff);
sleep(DIS_DELAY);
Display_Grid(0x00,0xff,0xff,0x00);
sleep(DIS_DELAY);
}
/* Unmap previously mapped page */ if(munmap(map_base, MAP_SIZE) == -1){ printf("Error unmapping memory\n"); close(fd); exit(1); } close(fd); exit(retval);}
inline void Write_Data(unsigned char dat)
{ *(unsigned char *)(map_base+1) = dat;}
inline void Write_Instruction(unsigned char cmd)
{
*(unsigned char *)(map_base) = cmd;}
void Initial_LCD(void)
{
Write_Instruction(0x30);
Write_Instruction(0x94);
Write_Instruction(0xd1);
Write_Instruction(0x20);
Write_Data(0x08);
sleep(1);
Write_Instruction(0x20);
Write_Data(0x0b);
Write_Instruction(0x81); //Contrast adjusting
Write_Data(0x0f); //0x36
Write_Data(0x05); //0x04
Write_Instruction(0xca);
Write_Data(0x00);
Write_Data(0x27);
Write_Data(0x00);
Write_Instruction(0xa6);
Write_Instruction(0xbb);
Write_Data(0x02);
Write_Instruction(0xbc);
Write_Data(0x00);
Write_Data(0x00);
Write_Data(0x02);
Write_Instruction(0x75);
Write_Data(0x00);
Write_Data(0x9f);
Write_Instruction(0x15);
Write_Data(0x00);
Write_Data(0x35);
Write_Instruction(0x31);
Write_Instruction(0x32);
Write_Data(0x05);
Write_Data(0x01);
Write_Data(0x01);
Write_Instruction(0x22);
Write_Data(0x04);
Write_Data(0x1f);
Write_Data(0x02);
Write_Instruction(0x20);
Write_Data(0x1f);
Write_Data(0x1f);
Write_Data(0x1f);
Write_Data(0x1f);
Write_Data(0x1f);
Write_Data(0x1f);
Write_Data(0x1f);
Write_Data(0x1f);
Write_Data(0x1f);
Write_Data(0x1f);
Write_Data(0x1f);
Write_Data(0x1f);
Write_Data(0x1f);
Write_Data(0x1f);
Write_Data(0x1f);
Write_Data(0x1f);
Write_Instruction(0x21);
Write_Data(0x00);
Write_Data(0x00);
Write_Data(0x04);
Write_Data(0x04);
Write_Data(0x08);
Write_Data(0x08);
Write_Data(0x0c);
Write_Data(0x0c);
Write_Data(0x10);
Write_Data(0x10);
Write_Data(0x14);
Write_Data(0x14);
Write_Data(0x18);
Write_Data(0x18);
Write_Data(0x1f);
Write_Data(0x1f);
Write_Instruction(0x34);
Write_Instruction(0x30);
Write_Instruction(0xaf);
}
void Display_Grid(unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4)
{
register unsigned char i,j,k,l;
Write_Instruction(0x15);
Write_Data(0x00);
Write_Data(0x35);
Write_Instruction(0x75);
Write_Data(0x00);
Write_Data(0x9f);
Write_Instruction(0x5c);
for(k=0;k<0x14;k++)
{
for(i=0;i<0x04;i++)
{
for(j=0;j<0x14;j++)
{
for(l=0;l<0x4;l++)
Write_Data(dat1);
for(l=0;l<0x4;l++)
Write_Data(dat2);
}
Write_Data(dat2);
Write_Data(dat2);
}
for(i=0;i<0x04;i++)
{
for(j=0;j<0x14;j++)
{
for(l=0;l<0x4;l++)
Write_Data(dat3);
for(l=0;l<0x4;l++)
Write_Data(dat4);
}
Write_Data(dat4);
Write_Data(dat4);
}
}
return;
}
void Display_Gray(void)
{
register unsigned char i,j,k;
Write_Instruction(0x15);
Write_Data(0x00);
Write_Data(0x35);
Write_Instruction(0x75);
Write_Data(0x00);
Write_Data(0x9f);
Write_Instruction(0x5c);
for(k=0;k<0x04;k++)
{
for(i=0;i<0x0a;i++)
{
for(j=0;j<0xa2;j++)
Write_Data(0x00);
}
for(i=0;i<0x0a;i++)
{
for(j=0;j<0xa2;j++)
Write_Data(0x4f);
}
for(i=0;i<0x0a;i++)
{
for(j=0;j<0xa2;j++)
Write_Data(0xaf);
}
for(i=0;i<0x0a;i++)
{
for(j=0;j<0xa2;j++)
Write_Data(0xff);
}
}
return;
}
void Display_Picture(unsigned char pic[])
{
unsigned char i,j,k,tmp,temp;
Write_Instruction(0x15);
Write_Data(0x00);
Write_Data(0x35);
Write_Instruction(0x75);
Write_Data(0x00);
Write_Data(0x9f);
Write_Instruction(0x5c);
for(k=0;k<0xa0;k++)
{
for(i=0;i<0x14;i++)
{
temp=pic[k*20+i];
for(j=0x00;j<0x08;j++)
{
tmp=temp&0x80;
if(tmp==0x80)
Write_Data(0x00);
else
Write_Data(0xf8);
temp=temp<<1;
}
}
Write_Data(0xf8);
Write_Data(0xf8);
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -