📄 main.c
字号:
//选择6800总线。MS=1,按键3 M80/68#=0
#include "global.c"
unsigned char char1[1][32]={{0x40,0x3C,0x10,0xFF,0x10,0xD0,0x20,0x18,0xCF,0x38,0x08,0xF8,0x08,0xF8,0x00,0x00,
0x04,0x04,0x02,0x7F,0x01,0x44,0x22,0x11,0x08,0x04,0x43,0x80,0x40,0x3F,0x00,0x00}};//物
#define uchar unsigned char
#define uint unsigned int
#define Setres PADATDIR = PADATDIR | 0xFF80
#define Clrres PADATDIR = PADATDIR & 0xFF7F
#define SetDC PADATDIR = PADATDIR | 0xFF08
#define ClrDC PADATDIR = PADATDIR & 0xFFF7
#define SetRW PADATDIR = PADATDIR | 0xFF10
#define ClrRW PADATDIR = PADATDIR & 0xFFEF
#define SetE PADATDIR = PADATDIR | 0xFF20
#define ClrE PADATDIR = PADATDIR & 0xFFDF
void KickDog();
uchar picture[];
uchar high;
uchar low;
void delay(uint number)
{
uint j;
for(j = 0;j < number;j++);
}
//系统初始化子程序
void initial()
{
asm(" SETC INTM "); /* 关闭总中断 */
asm(" CLRC SXM "); /* 禁止符号位扩展 */
asm(" CLRC CNF "); /* B0块映射为 on-chip DARAM*/
asm(" CLRC OVM "); /* 累加器结果正常溢出*/
SCSR1=0x02FC; /* 系统时钟CLKOUT=20*2=40M */
WDCR=0x006F; /* 禁止看门狗,看门狗时钟64分频 */
KickDog(); /* 初始化看门狗 */
IMR=0x00; //中断禁止
IFR=0xffff; //清除全部中断标志,写1清0
}
void LCDPIN(void)
{
PBDATDIR = PBDATDIR & 0x00FF;
}
void LCDPOUT(void)
{
PBDATDIR = PBDATDIR | 0xFF00;
}
//查忙
void LCDSTA()
{
uint Temp = 0x0080;
LCDPIN(); //IOPB口为输入口
delay(200);
ClrDC;
SetRW; //cs=0,e=0,r/w=1,d/c=o.读液晶状态
while(Temp)
{
ClrE;
delay(50);
Temp = PBDATDIR;
Temp = Temp & 0x0080;
SetE;
delay(50);
}
}
//写指令:
void write_command(int command)
{
LCDSTA();
delay(100);
LCDPOUT();
ClrRW; //cs=0,e=0,r/w=0,d/c=0.以便写入命令
ClrDC;
delay(50);
ClrE;
PBDATDIR=(PBDATDIR & 0xff00) | command; //命令字送入数据线上\
delay(50);
SetE; //e=1.写使能
//PADATDIR=PADATDIR|0x0040; //cs=1
}
//写入数据:
void write_data(int data_aa)
{
LCDSTA();
delay(100);
LCDPOUT(); //IOPB口为输出口
delay(200);
SetDC; //cs=0,e=0,r/w=0,d/c=1.以便写入数据
ClrRW;
delay(50);
ClrE;
PBDATDIR=(PBDATDIR & 0xff00) | data_aa; //显示RAM中的数据送入数据线上
delay(50);
SetE; //e=1.写使能
//PADATDIR=PADATDIR|0x0040; //cs=1
}
//开显示子程序
void DISP()
{
uint Temp = 0x0020;
LCDSTA();
delay(200);
LCDPIN();
write_command(0xaf); //送出控制命令
delay(1000);
SetRW; //cs=0,e=0,r/w=1,d/c=o.读液晶状态
ClrDC;
while(Temp)
{
ClrE;
delay(50);
Temp = PBDATDIR;
Temp = Temp & 0x0020;
SetE;
delay(50); //如果液晶没被打开,则继续打开
}
}
//关显示子程序
void DISP_OFF()
{
uint Temp = 0x0000;
LCDSTA();
delay(200);
write_command(0xae); //送出控制命令
delay(1000);
SetRW;
ClrDC; //cs=0,e=0,r/w=1,d/c=o.读液晶状态
while(Temp==0)
{
ClrE;
delay(50);
Temp = PBDATDIR;
Temp = Temp & 0x0020;
SetE;
delay(50); //如果液晶没被打开,则继续打开
}
}
//清屏子程序
void CLEAR()
{
int page,j;
for(page=0;page<8;page++)
{
write_command(0xB0+page); //set page address
write_command(0x00); //set low address
write_command(0x10); //set higher address
for(j=0;j<128;j++)
{
write_data(0x00); //送数据到显存
delay(200);
}
}
}
//全屏显示子程序
void ALL_SCREEN(int display_data)
{
int page,j;
for(page=0;page<8;page++)
{
write_command(0xB0+page); //set page address
write_command(0x00); //set low address
write_command(0x10); //set higher address
for(j=0;j<128;j++)
{
write_data(display_data); //送数据到显存
delay(200);
}
}
}
//OLED初始化
void OLED_INIT()
{
Clrres;
delay(1000);
Setres;
delay(1000);
DISP_OFF(); //关显示
delay(1000);
write_command(0xad);
delay(1000);
write_command(0x8a);
delay(1000);
write_command(0xa8); //占空比1/64
delay(1000);
write_command(0x3f);
delay(1000);
write_command(0xd3); //设置行地址偏置
delay(1000);
write_command(0x00); //为0 滚动
delay(1000);
write_command(0x40); //Set Display Start Line
delay(1000);
write_command(0xa0); //Set Segment Re-map
delay(1000);
write_command(0xc8); //Set COM Output Scan Direction,反向扫描
delay(1000);
write_command(0xa6); //Set Normal Display
delay(1000);
write_command(0xa4); //正常模式
delay(1000);
write_command(0x81); //设置对比度
delay(1000);
write_command(0x80); //128级对比度
delay(1000);
write_command(0xd5); //Set Clock Divide
delay(1000);
write_command(0x60); //
delay(1000);
write_command(0xd8); //Set Area Color Mode ON / OFF
delay(1000);
write_command(0x00); //
delay(1000);
write_command(0xd9); //Set Pre-Charge Period
delay(1000);
write_command(0x84); //
delay(1000);
write_command(0xda); //配置列驱动方向
delay(1000);
write_command(0x12); //
delay(1000);
write_command(0xaf); //开OLED显示功能
delay(1000);
}
//显示一幅图画:
void oled_display(int picture[]) //picture[]是一幅图片的数据
{
int page,j;
for(page=0;page<8;page++)
{
write_command(0xB0+page); //set page address
write_command(0x00); //set low address
write_command(0x10); //set higher address
for(j=0;j<128;j++)
{
write_data(picture[j+page*128]); //送数据到显存
delay(200);
}
}
}
//显示16*16汉字
void word_1616(uchar p,uchar h,uchar l,uchar a)//write chinese word of1616
{
uchar i,j,k,m=0;
k=p+2;
for(i=p;i<k;i++)
{
write_command(0xB0+p); //set page address
write_command(0x00+l); //列地址为0xhl
write_command(0x10+h);
for(j=0;j<16;j++)
{
write_data(char1[a][j+m*16]);
delay(200);
}
m++;
}
}
//显示24*24汉字
/*void word_2424(uchar high,uchar low,uchar n) //high是地址字节的高四位 low是地址字节的低四位 n是汉字数组中
//的哪个汉字
{
uchar i,j,m=0;
for(i=1;i<4;i++) //page number
{
write_command(0xB0+i); //set page address
write_command(0x00+low); //set low address
write_command(0x10+high); //set high address
for(j=0;j<24;j++)
{
write_data(word2424[n][j+m*24]);
}
m++;
}
}*/
//主程序
main()
{
initial(); //系统初始化
MCRA=MCRA & 0x0007; //IOPB0-7设置为IO口模式,IOPA3-7设置为IO口模式
PADATDIR = (PADATDIR | 0x4000) & 0xFFBF;//cs=0,IOPA6=0
OLED_INIT(); //OLED初始化
while(1)
{
ALL_SCREEN(0xff);
delay(5000);
ALL_SCREEN(0xff);
delay(5000);
word_1616(1,0,0,1);
delay(5000);
word_1616(1,0,0,1);
delay(5000);
}
}
void KickDog() /*踢除看门狗 */
{
WDKEY=0x5555;
WDKEY=0xAAAA;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -