📄 main.c
字号:
//****************************************************************************************
//** 文件名:main.c
//** Copyright (c) 2003
//** 创建人:Himai (WYJ)
//** 日期:2003.10.26
//** 描述:此程序用于演示LCD模块
//**
//** 版本:1.0
//**************************************************************************************
#include "def.h"
#include "44b.h"
//**定义液晶屏的类型,如果是彩屏,定义它为8(比特),16灰度屏定义为4,否则定义它为1
#define lcdtype (4)
//**开辟一块大小合适的显示缓冲区,显然彩屏需要240×320×8(bits)也就是240×320÷4(32bits)
//**蓝屏需要240×320(bits)也就是240×320÷32字(32bits),灰度屏需要240×320÷8
INT32U buffer[240][320/(32/lcdtype)];
INT8U colornumber=2;
//****************************************************************************************
//**函数名:mydelay()
//**参 数:i,j
//**返回值:无
//**功 能:实现延迟等待
//**备 注:
//**************************************************************************************
void mydelay(unsigned int i,unsigned int j)
{
int m,n;
for (m=0;m<=i;m++)
{
for (n=0;n<j;n++);
}
}
//****************************************************************************************
//**函数名:lcdclr()
//**参 数:无
//**返回值:无
//**功 能:往缓冲区填写0,也就是黑色
//**备 注:
//**************************************************************************************
void lcdclr(void)
{
INT32U i;
INT32U *pDisp = (INT32U*)buffer;
for (i = 0; i < (320*240 / (32/lcdtype)); i++)
{
*pDisp++ =0;
}
}
//****************************************************************************************
//**函数名:drawpixal()
//**参 数:横坐标INT16 x, 纵坐标INT16 y, 颜色INT8U c
//**返回值:无
//**功 能:往指定的缓冲区填写指定的颜色
//**备 注:
//**************************************************************************************
void drawpixal (INT16 x, INT16 y, INT8U c)
{
//**如果是彩屏,那么颜色参数为8比特,填写方法如下:
if(lcdtype==8)
{
buffer[(y)][(x)/4]=((buffer[(y)][(x)/4] & (~(0xff000000>>((x)%4)*8)) )|( (c)<<((4-1-((x)%4))*8) ));
}
//**如果是灰屏,那么颜色参数为4比特,填写方法如下:
else if(lcdtype==4)
{
buffer[(y)][(x)/8]=((buffer[(y)][(x)/8] & (~(0xf0000000>>((x)%8)*4)) )|( (c)<<((7-((x)%8))*4) ));
}
//**如果是蓝屏,那么颜色参数为1比特,填写方法如下:
else
{
if((c&0x01)==1)
{
buffer[y][x/32]=((INT32U)0x01<<(31-x%32))|buffer[y][x/32];
}
else
{
buffer[y][x/32]=((INT32U)(~(0x01<<(31-x%32))))&buffer[y][x/32];
}
}
}
//*****************************************************************
//** 函数名:LcdInit(void)
//** 输 入: 无
//** 输 出: 无
//** 功能描述:初始化LCD控制器
//** 全局变量:
//*****************************************************************
void lcdinit ()
{
//** 根据不同的显示屏类型,定义不同的水平值、时钟值、扫描模式和显示模式
//** 这些参数的用途请参考S3CC40BX芯片相关LCD控制器部分的资料
unsigned int hozval,clkval,scan_mode,disp_mode;
if (lcdtype==8)
{
hozval= 119;
clkval= 4;
scan_mode=2;
disp_mode=3;
}
else if (lcdtype==4)
{
hozval= 79;
clkval= 8;
scan_mode=1;
disp_mode=2;
}
else
{
hozval= 79;
clkval= 8;
scan_mode=1;
disp_mode=0;
}
//** 根据不同的LCD类型初始化LCD控制寄存器,设置扫描模式和时钟
rLCDCON1=(0x1c)|(scan_mode<<5)|(0<<7)|(0x3<<8)|(0x3<<10)|(clkval<<12);
//** 根据不同的LCD类型初始化LCD控制寄存器,设置水平和垂直值
rLCDCON2=(239)|(hozval<<10)|(10<<21);
//** 根据不同的LCD类型初始化LCD控制寄存器,设置显示模式,
//** 并将显示缓冲区的首地址送到寄存器内,便于LCD控制器自动将缓冲区内数据传到lcd
rLCDSADDR1= (disp_mode<<27) | ( ((unsigned int)buffer>>22)<<21 ) | (((unsigned int)buffer>>1)&0x1fffff);
rLCDSADDR2= (((((unsigned int)buffer+(320*240)/(8/lcdtype))>>1))&0x1fffff) | (13<<21);
rLCDSADDR3= (320/(16/lcdtype)) | ( 0<<9 );
//** 设置颜色管理基数,对蓝屏不起作用,仅对彩屏有效
rREDLUT =0xfdb96420;
rGREENLUT=0xfdb96420;
rBLUELUT =0xfb40;
//** 设置颜色管理基数,对蓝屏不起作用,仅对灰屏有效
switch (lcdtype)
{
case 1:
break;
case 4:
rDITHMODE=0x12210;
rDP1_2 =0xa5a5;
rDP4_7 =0xba5da65;
rDP3_5 =0xa5a5f;
rDP2_3 =0xd6b;
rDP5_7 =0xeb7b5ed;
rDP3_4 =0x7dbe;
rDP4_5 =0x7ebdf;
rDP6_7 =0x7fdfbfe;
break;
case 8:
rDITHMODE=0x12210;
rDITHMODE=0x0;
rDP1_2 =0xa5a5;
rDP4_7 =0xba5da65;
rDP3_5 =0xa5a5f;
rDP2_3 =0xd6b;
rDP5_7 =0xeb7b5ed;
rDP3_4 =0x7dbe;
rDP4_5 =0x7ebdf;
rDP6_7 =0x7fdfbfe;
break;
default:
break;
}
//** 打开LCD显示,启动LCD自动扫描功能
rLCDCON1=(0x1d)|(scan_mode<<5)|(0<<7)|(0x3<<8)|(0x3<<10)|(clkval<<12);
rPDATD=0xbf;
//** 清屏
lcdclr();
}
//*****************************************************************
//** 函数名:drawcircle(void)
//** 输 入: 横坐标INT16U x,纵坐标INT16U y,颜色INT16U m
//** 输 出: 无
//** 功能描述:以(x,y)为圆心,30为半径画圆,并将四个角填入反色
//** 全局变量:
//*****************************************************************
void drawcircle(INT16U x,INT16U y,INT16U m)
{
int i,j;
//**区域为以(x-30,y-30)和(x+30,y+30)为对角点的矩形
for(i=x-30;i<=x+30;i++)
{
for(j=y-30;j<=y+30;j++)
{
//**如果该点距离圆心小于半径,那么填入正色
if(((i-x)*(i-x)+(j-y)*(j-y))<=900) drawpixal (i, j, m%colornumber);
//**否则填入反色
else drawpixal (i, j, colornumber-m%colornumber);
}
}
}
//*****************************************************************
//** 函数名:user_doing(void)
//** 输 入: 无
//** 输 出: 无
//** 功能描述:用户可以自行修改,此处共有8个圆心,根据i值判别圆心的位置
//** 全局变量:
//*****************************************************************
void user_doing(void)
{
INT16U i;
lcdclr();
for(i=0;i<2560;i++)
{
switch(i%8)
{
case 0:drawcircle(100,60,i);
break;
case 1:drawcircle(160,60,i);
break;
case 2:drawcircle(220,60,i);
break;
case 3:drawcircle(220,120,i);
break;
case 4:drawcircle(220,180,i);
break;
case 5:drawcircle(160,180,i);
break;
case 6:drawcircle(100,180,i);
break;
case 7:drawcircle(100,120,i);
break;
}
mydelay(400,800);
}
}
//*****************************************************************
//** 函数名:main(void)
//** 输 入: 无
//** 输 出: 无
//** 功能描述:主函数
//** 全局变量:
//*****************************************************************
void Main(void)
{
int i;
//** 初始化LCD
lcdinit();
for(i=0;i<lcdtype;i++)
{
colornumber=2*colornumber;
}
//**用户程序
user_doing();
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -