📄 186.c
字号:
#include<iom16v.h>
#include<macros.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
//#define SPI_CS PB4
#define SetCS PORTB|=(1<<PB4)
#define ClrCS PORTB&=~(1<<PB4)
//1602
#define SetRS PORTD|=(1<<PD7)
#define ClrRS PORTD&=~(1<<PD7)
#define SetRW PORTD|=(1<<PD6)
#define ClrRW PORTD&=~(1<<PD6)
#define SetE PORTD|=(1<<PD5)
#define ClrE PORTD&=~(1<<PD5)
uchar s[4],b[4]; //把数字转换成字符串
unsigned int d[4];
uchar ReadStatusLCM(void);//读状态
void WriteDataLCM(uchar WDLCM);//写数据
void WriteCommandLCM(uchar WCLCM,uchar c);//写指令
void LCMInit(void);//初始化
void DisplayOneChar(uchar X,uchar Y,uchar DData);//在指定位置显示单个字符
void DisplayListChar(uchar X,uchar Y,uchar *DData);//在指定位置显示字符串
//*******************/延时函数
void delay_1ms(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
{
for(j=1;j<(1*143-2);j++) //晶振改变时修改
{;}
}
}
//*****************读状态,忙则循环,不忙则返回Data
uchar ReadStatusLCM(void)
{
uchar Data;
DDRA=0xff; //设置指令
PORTA=0xff;
DDRD=0xff;//1,输出,置数 0,输入,读数
ClrRS;
SetRW;
SetE; //执行指令
SetE;
DDRA=0x00; //读忙标志,忙则循环
Data=PINA;
while(Data&0x80)
Data=PINA;
return(Data);
}
//**************************写指令
void WriteCommandLCM(uchar WCLCM,uchar c)
{
if(c==1) //标志为0不忙检测,标志为1检测
ReadStatusLCM();
DDRA=0xff; //设置指令
PORTA=WCLCM;
DDRD=0xff;//1,输出,置数 0,输入,读数
ClrRS;
ClrRW;
SetE;
SetE;
ClrE;
}
//**************************初始化
void LCMInit(void)
{
DDRA=0xff;
PORTA=0x00;
WriteCommandLCM(0x38,0);//三次显示设置 ,不需忙检
delay_1ms(5); //四位总线,双行显示,5*7点阵
WriteCommandLCM(0x38,0);
delay_1ms(5);
WriteCommandLCM(0x38,0);
delay_1ms(5);
WriteCommandLCM(0x38,1);//显示模式设置,以后都须忙检
WriteCommandLCM(0x08,1);//关闭显示
WriteCommandLCM(0x01,1);//清屏
WriteCommandLCM(0x06,1);//光标右移,字符不移
WriteCommandLCM(0x0c,1);//显示开,有光标,有闪烁
}
//***************************写数据
void WriteDataLCM(uchar WDLCM)
{
ReadStatusLCM(); //忙检测
DDRA=0xff; //设置指令
PORTA=WDLCM;
DDRD=0xff;//1,输出,置数 0,输入,读数
SetRS;
ClrRW;
SetE;
SetE;
ClrE;
}
//****************************按指定位置显示一个字符
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
Y&=0x01;//Y不能>1
X&=0x0f;//X不能>15
if(Y)
X+=0x40;//显示第二行时地址码+0x40
X+=0x80;//计算指令码
WriteCommandLCM(X,0);//发送地址码不需忙检
WriteDataLCM(DData);
}
//*****************************在指定位置显示字符串
void DisplayListChar(uchar X,uchar Y,uchar *DData)
{
uchar pose=0;
Y&=0x01;//Y不能>1
X&=0x0f;//X不能>15
while(DData[pose]>0x20)
{
DisplayOneChar(X,Y,DData[pose]);//显示单个字符
pose++;
X++;
if(X>=0xF)
{X=0x00;
Y=0x01;
}
}
}
//***************主机初始化*******//
//设置端口方向,SPI控制寄存器
void SPI_MasterInit(void)
{
DDRB=(1<<PB5)|(1<<PB7)|(1<<PB4);//PB6:MISO自动为输入 PB7:SCK
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -