📄 01.c
字号:
#include <iom8.h>
#include <inavr.h>
/*
日期 2008-03-02
目的 使用M8操作SO12864液晶屏
频率 外部4MHz
采用串口发送方式
*/
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
#define nop() asm("nop")
#define cs1 PORTB_Bit1
#define rst PORTB_Bit2
#define a0 PORTB_Bit3
#define sclk PORTB_Bit4
#define di PORTB_Bit5
void lcd_init(void);
void M8_init(void);
void lcd_rst(void);
void lcd_openclose(uchar);
void lcd_setpage(uchar);
void lcd_setrow(uchar);
void lcd_setcol(uchar);
void lcd_colrev(uchar);
void lcd_rowrev(uchar);
void lcd_setrat(uchar);
void lcd_setvol(uchar);
void lcd_nomrev(uchar);
void lcd_init(void);
uchar __flash niu[]={/*-- 文字: 武 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10,0x10,0x14,0x14,0x14,0xD4,0x14,0x14,0x10,0x7F,0x90,0x12,0x14,0x10,0x10,0x00,
/*-- 文字: 汉 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10,0x60,0x01,0x86,0x60,0x04,0x1C,0xE4,0x04,0x04,0x04,0xE4,0x1C,0x04,0x00,0x00,
/*-- 文字: 理 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x44,0x44,0xFC,0x44,0x44,0x00,0xFE,0x92,0x92,0xFE,0x92,0x92,0x92,0xFE,0x00,0x00,
/*-- 文字: 工 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,
/*-- 文字: 大 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
/*-- 文字: 学 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x00,
0x40,0x40,0x7F,0x20,0x20,0x1F,0x11,0x11,0x01,0x00,0x07,0x18,0x20,0x40,0xF0,0x00,
0x04,0x04,0x7E,0x01,0x40,0x20,0x20,0x10,0x0B,0x04,0x0B,0x10,0x30,0x60,0x20,0x00,
0x10,0x10,0x0F,0x08,0x48,0x40,0x45,0x44,0x44,0x7F,0x44,0x44,0x44,0x45,0x40,0x00,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00,
0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x00};
void delay(uchar j)
{
while(j--)
;
}
void data_send(unsigned char dat)
{
unsigned char s,temp;
int i;
sclk=0;
s=dat;
for(i=8;i>0;i--)
{
sclk=0;
delay(1);
temp=s & 0x80;
if(temp)
{di=1;}
else
{di=0;}
sclk=1;
s=s<<1;
}
}
/*************************************************/
//写命令,串行模式
/*************************************************/
void w_com(unsigned char x)
{
a0=0;
cs1=0;
data_send(x);
}
/*************************************************/
//写数据,串行模式
/*************************************************/
void wdata(unsigned char dat)
{
a0=1;
cs1=0;
data_send(dat);
}
void display_map(unsigned char __flash *p)//P是图片数据的首地址
{
uchar seg,page;
for(page=0;page<2;page++) //写页地址共 8 页 0xb0----0xb8
{
lcd_setpage(page);
w_com(0x10); //列地址,高低字节两次写入,从第 0 列开始
w_com(0x00);
for(seg=0;seg<96;seg++)//写 128 列
{ wdata(*p++); }
}
}
/*************************************************
mega8初始化 主要是进行端口的设置
**************************************************/
void M8_init(void)
{
DDRB = 0xff;
PORTB = 0xff;
PORTC = 0xFF;
DDRC = 0xFF;//00111100
DDRD = 0xFF;
PORTD = 0xFF;
}
/*
用于将SO128*64液晶屏复位
*/
void lcd_rst(void)
{
rst=0;
delay(10);
rst=1;
}
/*
lcd打开还是关断 1:打开 0:关断
*/
void lcd_openclose(uchar i)
{
w_com(0xae|(i&0x01));
}
/*
用于设置页面,0-8,其中第8页只有一行
*/
void lcd_setpage(uchar i)
{
w_com((i&0x0f)|0xb0);
}
/*
用于设置起始行,从0到63,不考虑页面
*/
void lcd_setrow(uchar row)
{
w_com((row&0x3f)|0x40);
}
/*
用于设置开始列,从0-131,其中127后是不能显示的
分高低两个字节写入
*/
void lcd_setcol(uchar i)
{
w_com((i>>4)|0x10);
w_com(i&0x0f);
}
/*
列顺序翻转,左右翻转0:正常 1:翻转
*/
void lcd_colrev(uchar i)
{
w_com(0xa0|(i&0x01));
}
/*
行顺序翻转,上下翻转 0:正常 1;翻转
*/
void lcd_rowrev(uchar i)
{
w_com(0xc0|((i<<3)&0x08));
}
/*
设置对比度 0-7 5V电压下 设置为4比较好
*/
void lcd_setrat(uchar i)
{
w_com(0x20|(i&0x07));
}
/*
设置亮度 0-64;5V电压下设置为0X20比较适中 0x20=32
*/
void lcd_setvol(uchar vol)
{
w_com(0x81);
w_com(vol);
}
/*
黑白翻转 0正常 1翻转
*/
void lcd_nomrev(uchar nomrev)
{
w_com(0xa6|(nomrev&0x01));
}
/*
*/
void lcd_init(void)
{
lcd_rst();
lcd_openclose(1);
lcd_setpage(0);
lcd_setrow(0);
lcd_setcol(0);
lcd_nomrev(0);
lcd_rowrev(1);
lcd_colrev(0);
lcd_setvol(32);
lcd_setrat(4);
w_com(0x2f);//电源打开
/*
rst=0;
delay(100);
rst=1;
w_com(0xaf); //LCD打开
w_com(0x40); //设置开始行,从0行开始
//w_com(0xa0); //正常顺序
w_com(0xa1); //左右翻转
w_com(0xa6); // 正常颜色
//w_com(0xa7); //黑白翻转
w_com(0xa4); //CLEAR
w_com(0xa2); //1/9BIAS 1/9偏置电压
w_com(0xc0); //正常显示
//w_com(0xc8); //上下翻转
w_com(0x2f); //POWER CONTROL 电源打开
w_com(0x24); //RESISTER RATIO 对比度调节 000B-111B
w_com(0x81); //VOLUM MODE SET 进入亮度调节
w_com(0x24); //RESISTER RATIO 亮度,000001B-111111B
*/
}
/*************************************************
主程序
*************************************************/
void main(void)
{
unsigned char seg;
unsigned char page;
M8_init();
lcd_init();
for(page=0xb0;page<0xb9;page++) //写页地址共 8 页 0xb0----0xb8
{
lcd_setpage(page);
w_com(0x10); //列地址,高低字节两次写入,从第 0 列开始
w_com(0x00);
for(seg=0;seg<133;seg++)//写 128 列
{ wdata(0x00); }
}
//*********************************************************************
display_map(niu); //显示一副 SCH图案
while(1)
;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -