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

📄 186.c

📁 mega16做处理芯片
💻 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 + -