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

📄 fm12864.c

📁 FM12864液晶显示程序驱动
💻 C
字号:
/********************************************************
    RS 数据与指令选择(1为送数据,0为送指令)  
    RW:读写控制(RW=1 E=1数据被读到DB0~DB7,
        RW=0 E=1->0 DB0~DB7数据被写到IR或DR)   
    E 使能  RST  复位
*********************************************************/   
#include"mega16.h"
#include"delay.h" 
#include"stdlib.h"  
#define RS       PORTB.0                              //0x10 光标左移
#define RW       PORTB.1                              //0x14 光标右移
#define E        PORTB.2                              //0x18 屏幕左移
#define RST_ON       PORTB.3=0    //RST               //0x1C 屏幕右移
#define RST_OFF      PORTB.3=1                        //
#define FM_DATA_OUT   PORTC                           //
#define FM_DATA_IN    PINC                            //
#define WRITE_FM    DDRC=0XFF                         //
#define READ_FM    DDRC=0X00                          //   
unsigned char chinese[]={"电子创新实验室"}; 
unsigned char chinese1[]={"时间"}; 
////////////////////////送数据///////////////////////////
void Send_Data(unsigned char Da){
RS=1;
RW=0; 
FM_DATA_OUT=Da;
E=1;
delay_us(20);
E=0;
RW=1;
RS=0;  
delay_us(90);//大部分指令用时70多微秒,没有进行忙碌标志检测
} 
//////////////////////送命令//////////////////////////
void Send_Com(unsigned char Com){
RS=0;
RW=0; 
FM_DATA_OUT=Com;
E=1;
delay_us(20);
E=0;
RW=1;
RS=1;
delay_us(90);
} 
/////////////////////////(图形模式下)清屏////////////////////////////
void Clear(){  
char i,j;
for(j=0;j<64;j++){
   if(j<32){ 
     Send_Com(0x80+j); //清除上半屏
     Send_Com(0x80);
       }
     else {
        Send_Com(0x80+j-32);  //清除下半屏
        Send_Com(0x88);
          }
   for(i=0;i<16;i++)
        Send_Data(0x00);
   }
}
//////////////////////////左右滚动当前行/////////////////////// fl=0向右滚,否则想左滚
 void Run(char fl,unsigned char n){                          //n为滚动的次数   
 unsigned char i;
 for(i=0;i<n;i++){
  if(fl)Send_Com(0X18);
  else Send_Com(0X1c); 
   delay_ms(500);
  }
 } 
/////////////////////////中文显示//////////////////////
/////X0为横坐标(0=<X0<=7)Y0为纵坐标(0=<Y0<=3) ////////
void Show_Text(unsigned char X0,unsigned char Y0,unsigned char *Text){
 Send_Com((0x80+0X10*(Y0%2)+8*(Y0>>1))|X0); //设定显示坐标,此液晶4行不是按顺序进行的
 while(*Text>0){                           //(是第0行完到第2行再到第1行最后到第3行)
   Send_Data(*Text);                       //故用上式进行变换
   Text++;                      
   delay_us(100);
   }
} 
////////////////////显示数字///////////////////////// 
void FM_Num(unsigned char X0,unsigned char Y0,long da){
unsigned char *P="12345678";
ltoa(da,P);//库函数,转换长整型为字符串型
 Show_Text(X0,Y0,P);
} 
///////////////////位图显示//////////////////////
void Show_BMP(flash unsigned char *P){ 
int i,Y=0;
Send_Com(0x80);                   //行坐标
Send_Com(0x80);                    //列坐标
for(i=0;i<512;i++){
if(i<256){
     if(i%8==0){
           Send_Com(0x80+(Y++));Send_Com(0x80);} }
else if(i%8==0){
           Send_Com(0x80+(Y++));Send_Com(0x88);} 
 Send_Data(P[i]);              
 Send_Data(P[i+1]); 
if(Y==32)Y=0;
 }
} 
void INIT_FM(void){ 
DDRB|=0xFF; 
WRITE_FM;
RST_ON;
delay_us(10);
RST_OFF; 
Send_Com(0x30);  //功能设定
Send_Com(0x01);  //清屏显示
Send_Com(0x02);  // 地址返回原点,不改变DDRAM内容
Send_Com(0x06);  // 设定输入模式,光标加,屏幕不移动
Send_Com(0x0c);  //显示开 光标关
} 
////////////////////////////////////////////////////////////
main(){
int i=0;
INIT_FM();
Send_Com(0x30);  //扩充指令集
delay_us(300);   //此处延时必须且在这不少于300us  
while(1)
{
for(i=0;i<=20;++i)
{
Show_Text(0,0,chinese);
Show_Text(0,1,chinese1);              
FM_Num(2,1,i); 
if(i>19)
{
 i=-1;
 INIT_FM();
 delay_ms(50);
}
delay_ms(100);
}
}
//Send_Com(0x34); //关闭图形模式
//Clear(); 
/*Send_Com(0x80);                   //行坐标
Send_Com(0x80);                    //列坐标
for(i=0;i<512;i++){
if(i<256){
     if(i%8==0){
           Send_Com(0x80+(Y++));Send_Com(0x80);} }
else if(i%8==0){
           Send_Com(0x80+(Y++));Send_Com(0x88);} 
 Send_Data(0xff);              
 Send_Data(0xff); 
 if(Y==32)Y=0;
} */
//Send_Com(0x36);                  //打开图形模式
}

⌨️ 快捷键说明

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