⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mega8_lcd.c

📁 用于实现AVR单片机mega8对LCD显示屏的显示控制
💻 C
字号:
/******************************************************************/
#include <reg52.h>
#include <intrins.h>
/******************************************************************/
sbit a0 =P1^3;
sbit wr_rw=P1^5;
sbit cs1=P1^0;
sbit rd_EN=P1^4;
sbit rst=P1^6;
sbit c86=P1^1;//80,68 时序选择
sbit ps=P1^2;//串并口选择
//这两个信号只针对引出C86 和PS 的模块,用来设置时序,对固定时序的模块无效
sbit sclk=P2^6;
sbit di=P2^7;
unsigned char *p;
unsigned char *q;
unsigned char *s;
unsigned char flag;
#define nop() _nop_() /*定义空指令*/
/*************************************************/
//写命令,80 时序
/*************************************************/
void w_com80(unsigned char x)
{
a0=0;//命令
cs1=0;
rd_EN=1;//读无效
wr_rw=0;//写有效
nop();
P2=x;//送出数据
nop();
wr_rw=1;
}
/*************************************************/
//写数据,80 时序
/*************************************************/
void wdata80(unsigned char dat)
{
a0=1;//数据
cs1=0;
rd_EN=1;
wr_rw=0;//写
nop();
P2=dat;
nop();
wr_rw=1;
}
/*************************************************/
//写命令,68 时序
/*************************************************/
void w_com68(unsigned char x)
{
cs1=0;
a0=0;//命令
wr_rw=0;//写
rd_EN=1;//ENABLE
nop();
P2=x;
nop();
rd_EN=0;
}
/*************************************************/
//写数据,68 时序
/*************************************************/
void wdata68(unsigned char dat)
{
cs1=0;
a0=1; //数据
wr_rw=0;//写
rd_EN=1;
nop();
P2=dat;
nop();
rd_EN=0;
}
//串行模式发送数据
void data_send(unsigned char dat)
{
unsigned char s,temp;
int i;
sclk=0;
s=dat;
for(i=8;i>0;i--)
{sclk=0;
nop();
nop();
temp=s & 0x80;
if(temp)
{di=1;}
else {di=0;}
sclk=1;
s=s<<1;
}
}
/*************************************************/
//写命令,串行模式
/*************************************************/
void w_coms(unsigned char x)
{
a0=0;
cs1=0;
data_send(x);
}
/*************************************************/
//写数据,串行模式
/*************************************************/
void wdatas(unsigned char dat)
{
a0=1;
cs1=0;
data_send(dat);
}
/*************************************************/
//写命令,通过P3.0 和P3.1 选择用何种驱动程序
/*************************************************/
void w_com(unsigned char x)
{
unsigned char temp;
temp=P3&0X03;
switch(temp)
{
case 3:
c86=0;//80 时序
ps=1;//并口
w_com80(x);
break;
case 2:
c86=1;//68 时序
ps=1;//并口
w_com68(x);
break;
default:
c86=0;//串口模式下无效
ps=0;//串口方式
w_coms(x);
break;
}
}
/*************************************************/
//写数据
/*************************************************/
void wdata(unsigned char dat)
{
unsigned char temp;
temp=P3&0X03;
switch(temp)
{
case 3:
c86=0;
ps=1;
wdata80(dat);

case 2:
c86=1;
ps=1;
wdata68(dat);
break;
default:
c86=0;
ps=0;
wdatas(dat);
break;
}
}
void display_map(unsigned char *p)//P 是图片数据的首地址
{
unsigned char seg;
unsigned char page;
for(page=0xb0;page<0xb9;page++) //写页地址共8 页 0xb0----0xb8
{
w_com(page);
w_com(0x10); //列地址,高低字节两次写入,从第0 列开始
w_com(0x00);
for(seg=0;seg<128;seg++)//写128 列
{ wdata(*p++); }
}
}
/*************************************************/
/*主程序
/*************************************************/
void main(void)
{
rst=0;
nop();
nop();
rst=1;
w_com(0xaf); //ON DISPLAY
w_com(0x40); //STAR DISPLAY
w_com(0xa0); //ADC NORMAL
w_com(0xa6); //
w_com(0xa4); //CLEAR
w_com(0xa2); //1/9BIAS
w_com(0xc8); //COMMON OUTPUT DIRECTION
w_com(0x2f); //POWER CONTROL
w_com(0x24); //RESISTER RATIO
w_com(0x81); //VOLUM MODE SET
w_com(0x24); //RESISTER RATIO
//*********************************************************************
while(1) //START
{
display_map(&niu); //显示一副SCH 图案
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -