📄 main.c
字号:
/****************************************Copyright (c)**************************************************/
#include "config.h"
#define uchar unsigned char
#define uint unsigned int
//新板io口
#define E1 0,23 //块1 左边
#define E2 0,16 //块2 右边
#define RW 1,24 //读写控制端 0为写 1为读
#define A0 1,25 //A0为1时是数据,0时为指令数据
#define ULED 0,31
/* //开发板io口
#define E1 0,4 //块1 左边
#define E2 0,30 //块2 右边
#define RW 0,22 //读写控制端 0为写 1为读
#define A0 0,21 //A0为1时是数据,0时为指令数据
*/
#define DATA PORTB //数据
void Io_SetG(uchar group,uchar pin) //单个IO口置位函数
{
unsigned int io_data=1;
io_data=io_data<<pin;
if (group==0)
IO0SET=io_data; //IOSET0为IO线上置位寄存器,1有效,0无
else
IO1SET=io_data;
}
void Io_ClrG(uchar group,uchar pin) //单个IO口置位函数
{
unsigned int io_data=1;
io_data=io_data<<pin;
if (group==0)
IO0CLR=io_data; //IOSET0为IO线上置位寄存器,1有效,0无
else
IO1CLR=io_data;
}
void OUT_DATA(unsigned char data)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(data&1) {Io_SetG(1,i+16);} //把相应的IO口置位或者清零
else {Io_ClrG(1,i+16);}
data=data>>1;
}
}
//延时
void delay(unsigned int i)
{
unsigned int k=6000;
while(i>0)
{
i--;
}
while(k>1)k--;
}
void delayms (unsigned int i) { /* Delay function */
unsigned int n;
while(i>1)
{
for(n=65535;n>1;n--);
i--;
}
}
//左页
//发送数据
void OUTMD(unsigned char i)
{
Io_SetG(A0); //A0_1; //写数据
delay(5);
Io_SetG(E1); //E1_1;
delay(10);
OUT_DATA(i);//DATA=i;
delay(5);
Io_ClrG(E1); //E1_0;
}
//左页
//发送命令
void OUTMI(unsigned char i)
{
Io_ClrG(A0); //A0_0; //写指令
delay(5);
Io_SetG(E1); //E1_1;
delay(10);
OUT_DATA(i); //DATA=i;
delay(5);
Io_ClrG(E1); //E1_0;
}
//右页
//发送数据
void OUTSD(unsigned char i)
{
Io_SetG(A0); //A0_1; //写数据
delay(5);
Io_SetG(E2); //E2_1;
delay(10);
OUT_DATA(i); //DATA=i;
delay(5);
Io_ClrG(E2); //E2_0;
}
//右页
//发送命令
void OUTSI(unsigned char i)
{
Io_ClrG(A0); //A0_0; //写指令
delay(5);
Io_SetG(E2); //E2_1;
delay(10);
OUT_DATA(i); //DATA=i;
delay(5);
Io_ClrG(E2); //E2_0;
}
//初始化
void lcdini(void)
{
Io_ClrG(RW); //RW_0;
OUTMI(0XE2);
delay(1);
OUTSI(0XE2);//复位
delay(1);
OUTMI(0XAE);
delay(1);
OUTSI(0XAE);//POWER SAVE
delay(1);
OUTMI(0XA4);
delay(1);
OUTSI(0XA4);//动态驱动
delay(1);
OUTMI(0XA9);
delay(1);
OUTSI(0XA9);//1/32占空比
delay(1);
OUTMI(0XA0);
delay(1);
OUTSI(0XA0);//时钟线输出
delay(1);
OUTMI(0XEE);
delay(1);
OUTSI(0XEE);//写模式
delay(1);
OUTMI(0X00);
OUTMI(0XC0);
OUTSI(0X00);
OUTSI(0XC0);
OUTMI(0XAF);
OUTSI(0XAF);
}
/*
函数说明:同时设置主从显示页为0-3页。(内函数,私有,用户不直接调用)
------------------------------------------------------------------------
*/
void SetPage(uchar page0,uchar page1)
{
OUTMI(0xB8|page1);OUTSI(0xB8|page0);
}
/*
--------------------------------------------------------------------------------
函数说明:同时设置主从列地址为0-121。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
*/
void SetAddress(uchar address0,uchar address1)
{
OUTMI(address1);OUTSI(address0);
}
/*
--------------------------------------------------------------------------------
调用方式:void PutChar0(uchar ch)
函数说明:在右页当前地址画一个字节8个点。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
-*/
void PutCharR(uchar ch)
{
OUTSD(ch);
}
/*
--------------------------------------------------------------------------------
调用方式:void PutChar1(uchar ch)
函数说明:在左页当前地址画一个字节8个点。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
-*/
void PutCharL(uchar ch)
{
OUTMD(ch);
}
/*
--------------------------------------------------------------------------------
调用方式:void DrawBmp(bit layer,uchar width,uchar *bmp)
函数说明:画一个图,layer表示上下层,width是图形的宽,高都是16,bmp是
图形指针
使用zimo3软件,纵向取模,字节倒序/240字节
--------------------------------------------------------------------------------
-*/
void DrawBmp(unsigned layer,uchar width,unsigned char const *bmp)
{
uchar x,address,i=0; //address表示显存的物理地址
//uchar page=0; //page表示上下两页
uchar window=0; //window表示左右两页
//putcharR //右边
//putcharL //左边
for (x=width;x>1;x--)
{
if (i>60) {window=1;address=i%61;}
else address=i;
if(layer==0) //显示一行八个字
{
SetPage(0,0);
SetAddress(address,address);
if(window==1)PutCharR(bmp[i]);
else PutCharL(bmp[i]);
SetPage(1,1);
SetAddress(address,address);
if(window==1)PutCharR(bmp[i+width]);
else PutCharL(bmp[i+width]);
}
else
{ //显示第二行八个汉字
SetPage(2,2);
SetAddress(address,address);
if(window==1)PutCharR(bmp[i]);
else PutCharL(bmp[i]);
SetPage(3,3);
SetAddress(address,address);
if(window==1)PutCharR(bmp[i+width]);
else PutCharL(bmp[i+width]);
}
i++;
}
}
/*
--------------------------------------------------------------------------------
调用方式:void clrscr(void)
函数说明:清屏
--------------------------------------------------------------------------------
-*/
void clrscr(void)
{
uchar i;
uchar page;
for (page=0;page<4;page++)
{
SetPage(page,page);
SetAddress(0,0);
for (i=0;i<61;i++)
{PutCharR(0);PutCharL(0);}
}
}
//-----------------------------------------------------------
//图片显示
//采用字模2生成或字模3生成的都可以.
//-----------------------------------------------------------
void DrawBmp1(uint x_add, uchar width,unsigned char const *bmp)
{
uchar x,address,i=0; //address表示显存的物理地址
//uchar page=0; //page表示上下两页
uchar window=0; //window表示左右两页
//putcharR //右边
//putcharL //左边
for (x=width;x>1;x--)
{
if (x_add>60) {window=1;address=x_add%61;}
else address=x_add;
SetPage(0,0);
SetAddress(address,address);
if(window==1)PutCharR(bmp[i]);
else PutCharL(bmp[i]);
SetPage(1,1);
SetAddress(address,address);
if(window==1)PutCharR(bmp[i+width]);
else PutCharL(bmp[i+width]);
SetPage(2,2);
SetAddress(address,address);
if(window==1)PutCharR(bmp[i+width+width]);
else PutCharL(bmp[i+width+width]);
SetPage(3,3);
SetAddress(address,address);
if(window==1)PutCharR(bmp[i+width+width+width]);
else PutCharL(bmp[i+width+width+width]);
i++;
x_add++;
}
}
//---------------------------------------------------------------
//---------------------------------------------------------------
//采用zimo2 显示汉字,以汉字的显示方式
//void Draw_word(uchar d_where,uint x_add,bit layer,uchar width)
//d_where表示在码表中第几个汉字,x_add横坐标位置,layer显示的层, width显示的宽度。
//---------------------------------------------------------------
void Draw_word(uchar d_where,uint x_add,uchar layer,uchar width)
{
uchar x,address; //address表示显存的物理地址
//uchar page=0; //page表示上下两页
uchar window=0; //window表示左右两页
//putcharR //右边
//putcharL //左边
d_where=d_where*32;
for (x=width;x>1;x--)
{
if (x_add>60) {window=1;address=x_add%61;}
else address=x_add;
if(layer==0) //显示一行八个字
{
SetPage(0,0);
SetAddress(address,address);
if(window==1)PutCharR(bmp001[d_where]);//右边
else PutCharL(bmp001[d_where]);//左边
SetPage(1,1);
SetAddress(address,address);
if(window==1)PutCharR(bmp001[d_where+width]);
else PutCharL(bmp001[d_where+width]);
}
else
{ //显示第二行八个汉字
SetPage(2,2);
SetAddress(address,address);
if(window==1)PutCharR(bmp001[d_where]);//右边
else PutCharL(bmp001[d_where]);//左边
SetPage(3,3);
SetAddress(address,address);
if(window==1)PutCharR(bmp001[d_where+width]);
else PutCharL(bmp001[d_where+width]);
}
x_add++;
d_where++;
}
}
//------------------------------------------------------------------
//字模2显示一个汉字
//纵向取模,字节倒序
/*void disp_one(bit top_low,bit widows,uchar address,uchar width,uchar*bmp)
{
if(top_low==0)
{
SetPage(0,0);
SetAddress(address,address);
if(window==1)PutCharR(bmp001[next][i]);
else PutCharL(bmp001[next][i]);
SetPage(1,1);
SetAddress(address,address);
if(window==1)PutCharR(bmp001[next][i+width]);
else PutCharL(bmp001[next][i+width]);
}
else
{
SetPage(0,0);
SetAddress(address,address);
if(window==1)PutCharR(bmp001[next][i]);
else PutCharL(bmp001[next][i]);
SetPage(1,1);
SetAddress(address,address);
if(window==1)PutCharR(bmp001[next][i+width]);
else PutCharL(bmp001[next][i+width]);
}
} */
//液晶显示规则
// M(左) S(右)
// page page
// 0 | 0
// 1 | 1
// 2 | 2
// 3 | 3
void delay1s(unsigned char i)
{
while(i>1)
{
i--;
delay(65530);
}
}
//显示动态的等待图标
void wait1(unsigned char i)
{
clrscr(); //
DrawBmp1(0,60,Bmptc); //
for(;i>1;i--)
{delay1s(2);
DrawBmp1(76,19,Bmpt1); //
delay1s(2);
DrawBmp1(76,19,Bmpt2); //
delay1s(2);
// DrawBmp1(0,60,Bmptc); //
DrawBmp1(76,19,Bmpt3); //
delay1s(2);
// DrawBmp1(0,60,Bmptc); //
DrawBmp1(76,19,Bmpt4); //
delay1s(2);
// DrawBmp1(0,60,Bmptc); //
DrawBmp1(76,19,Bmpt5); //
delay1s(2);
// DrawBmp1(0,60,Bmptc); //
DrawBmp1(76,19,Bmpt6); //
delay1s(2);
// DrawBmp1(0,60,Bmptc); //
DrawBmp1(76,19,Bmpt7); //
}
}
void init_port(void)
{
//port initialized
IO1DIR|=0x00FF0000|(1<<24)|(1<<25);
IO0DIR|=(1<<16)|(1<<23)|0x80000000;
}
//演示程序
int main()
{
//unsigned int i;
init_port();
//while(1)
// {
// for(i=1;i<=128;i<<=1 )
// {
// OUT_DATA(i);
// delayms(10);
// }
//for (j = 0x010000; j < 0x800000; j <<= 1) { /* Blink LED 0,1,2,3,4,5,6 */
// IOSET1 = j; /* Turn on LED */
// delayms (10); /* call wait function */
// IOCLR1 = j; /* Turn off LED */
// }
// }
lcdini(); //reset
clrscr(); //clr
Draw_word(0,0,0,16); // Draw_word(uchar d_where,uint x_add,uchar layer,uchar width)
Draw_word(1,16,0,16);
Draw_word(2,32,0,16);
Draw_word(3,48,0,16); //d_where表示在码表中第几个汉字,x_add横坐标位置,layer显示的层, width显示的宽度。
Draw_word(4,64,0,16); //
Draw_word(5,80,0,16);
/* Draw_word(4,64,0,16); //
Draw_word(5,80,0,16); //
Draw_word(6,96,0,16); //
clrscr(); //
DrawBmp(0,112,ARMKIT_bmp);
DrawBmp(1,119,Bmp002); //
clrscr(); //
delay1s(3);
DrawBmp1(0,122,Bmp012); //LOGO
while(1)
{
delay1s(3);
clrscr(); //
DrawBmp1(10,101,Bmp07); //
delay1s(8);
clrscr(); //
wait1(3);
DrawBmp1(0,122,Bmp04); //
delay1s(8);
clrscr(); //
wait1(3);
DrawBmp1(0,122,Bmp03); //超前科技
delay1s(8);
clrscr(); //
wait1(3);
clrscr(); //
DrawBmp1(10,101,Bmp05); //
delay1s(8);
clrscr(); //
wait1(3);
clrscr(); //
DrawBmp1(10,101,Bmp06); //
delay1s(8);
clrscr(); //
wait1(3);
clrscr(); //
DrawBmp1(10,101,Bmp08); //
delay1s(8);
clrscr(); //
wait1(3);
clrscr(); //
DrawBmp1(0,122,Bmp01); //这仿真器真不错,用过都说好.
wait1(8);
} */
for(;;)
{
Io_SetG(ULED);
/* Io_SetG(E1);
Io_SetG(E2);
for(i=16;i<24;i++)
Io_SetG(1,i);
*/ delay1s(200);
Io_ClrG(ULED);
/* Io_ClrG(E1);
Io_ClrG(E2);
for(i=16;i<24;i++)
Io_ClrG(1,i);
*/ delay1s(50);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -