main.c

来自「开发板2407带的程序用C语言编写的」· C语言 代码 · 共 486 行

C
486
字号
/*Main.c*/ 
/*sed1520液晶测试程序*/
#include "global.c" 
void SystemInit();
void Init_Lcd(void);
void KickDog();  
void Init_Lcd(void);
void Clr_Lcd(void);
void Judge1_Ready(void);
void Lcd_Delay(void); 
void Lcd_Delay1(void);
void Write1_Code(void);
void Write2_Code(void);
void Write1_Data(void);
void Write2_Data(void);
void ShowChar(unsigned char,unsigned char,unsigned char);
void ShowHZ(unsigned char,unsigned char,unsigned int);
void Show_Test();

unsigned int temp1,temp2;
//unsigned long code_addr1,code_addr2,data_addr1,data_addr2;  
unsigned long ch1[][16]={{0x1F,0x10,0x00,0x1F,0x00,0x10,0x1F,0x00,0xC0,0x3C,0xE0,0x00,0xE0,0x3C,0xC0,0x00},  /*W*/
                         {0x10,0x1F,0x11,0x11,0x17,0x10,0x08,0x00,0x04,0xFC,0x04,0x04,0xC4,0x04,0x18,0x00},  /*E*/
                         {0x10,0x1F,0x10,0x00,0x00,0x00,0x00,0x00,0x04,0xFC,0x04,0x04,0x04,0x04,0x0C,0x00},  /*L*/
                         {0x03,0x0C,0x10,0x10,0x10,0x10,0x1C,0x00,0xE0,0x18,0x04,0x04,0x04,0x08,0x10,0x0},   /*C*/
                         {0x07,0x08,0x10,0x10,0x10,0x08,0x07,0x00,0xF0,0x08,0x04,0x04,0x04,0x08,0xF0,0x00},  /*O*/
                         {0x10,0x1F,0x1F,0x00,0x1F,0x1F,0x10,0x00,0x04,0xFC,0x00,0xFC,0x00,0xFC,0x04,0x00},  /*M*/
                         {0x10,0x1F,0x11,0x11,0x17,0x10,0x08,0x00,0x04,0xFC,0x04,0x04,0xC4,0x04,0x18,0x00}   /*E*/
                        };
unsigned long ch2[][32]={{0x28,0x24,0x22,0x21,0x26,0x38,0x04,0x18,0xF0,0x17,0x10,0x10,0x14,0x18,0x10,0x00,0x04,0x08,0x32,0xC2,0xC2,0x34,0x04,0x08,0x30,0xC0,0x60,0x18,0x0C,0x06,0x04,0x00},  /*欢*/
                         {0x02,0x82,0x73,0x20,0x00,0x3F,0x20,0x40,0x40,0x3F,0x20,0x20,0x20,0x3F,0x00,0x00,0x02,0x04,0xF8,0x04,0x02,0xE2,0x42,0x82,0x02,0xFA,0x02,0x42,0x22,0xC2,0x02,0x00},  /*迎*/
                         {0x01,0x02,0x0F,0x34,0xC2,0x04,0x19,0xF0,0x50,0x17,0x10,0x11,0x14,0x38,0x10,0x00,0x00,0x00,0xFE,0x00,0x08,0x30,0xC0,0x84,0x02,0xFC,0x00,0x00,0xC0,0x38,0x10,0x00}   /*你*/
                        };
                        
                        
                        
                        
                        
//4000和2000交换                        

main()
{  

   SystemInit();         	//系统初始化
   
   MCRA=MCRA & 0xC0FF; 	    //IOPB0-6设为IO口模式
   PBDATDIR=0xFFC2;   	    //所有LED=0 
   PBDATDIR=PBDATDIR |0x0004;  //第一个灯亮   
    
   Init_Lcd();
   Show_Test(); 
   while(1);
   
}

void SystemInit() 
{  
 
	asm(" SETC	INTM ");	/* 关闭总中断 */
	asm(" CLRC  SXM  ");	/* 禁止符号位扩展 */ 
	asm(" CLRC  CNF  ");    /* B0块映射为 on-chip DARAM*/
	asm(" CLRC  OVM  ");    /* 累加器结果正常溢出*/
	SCSR1=0x83FE;         	/* 系统时钟CLKOUT=20*2=40M */
							/* 打开ADC,EVA,EVB,CAN和SCI的时钟,系统时钟CLKOUT=40M */
	WDCR=0x006F;			/* 禁止看门狗,看门狗时钟64分频 */ 
	KickDog();    			/* 初始化看门狗 */  
    IFR=0xFFFF;				/* 清除中断标志 */
    IMR=0x0000;				/* 打开中断2*/      
    
}  

void Lcd_Delay()
{
unsigned int i=1;
unsigned int j=10;
while(i--) 
{
 while(j--){;}
}
} 

void Lcd_Delay1()
{
unsigned int i=1;
unsigned int j=10000;
while(i--) 
{
 while(j--){;}
}
}
  

void Init_Lcd()
{ 
 data3=0x0E2;        /*RESET*/
 data3=0x0E2;
 Write1_Code();
 Write2_Code();
 data3=0x0AF;        //关显示
 Write1_Code();
 Write2_Code();
 data3=0x0A4;       //退出休闲模式
 Write1_Code();
 Write2_Code();
 data3=0x0A9;       //占空比选择
 Write1_Code();
 Write2_Code();
 data3=0x0A1;       //ADC排序选择
 Write1_Code();
 Write2_Code();
 data3=0x0EE;       //关闭修改状态
 Write1_Code();
 Write2_Code();
 data3=0x000;       //起始列选择
 Write1_Code();
 Write2_Code();
 data3=0x0C0;      //起始行设置
 Write1_Code();
 Write2_Code();
 data3=0x0AF;      //开显示
 Write1_Code();
 Write2_Code();
 Clr_Lcd();
}

void Clr_Lcd()
{
  int i,j,p;
 
  p=0x0B8;
  data3=p;             //页设置
  Write1_Code();
  Write2_Code();
  for(j=4;j>0;j--)
  {
   data3=0x0;         //起始列选择
   Write1_Code();
   Write2_Code();
   for(i=80;i>0;i--)
   {
    data1=0x0;
    Write2_Data();
    Write1_Data();
   }
   
   data3=++p;        //换页
   Write1_Code();
   Write2_Code();
  } 
  Lcd_Delay();
  
  p=0x0B8;
  data3=p;             //页设置
  Write1_Code();
  Write2_Code();
  for(j=4;j>0;j--)
  {
   data3=0x0;       //起始列选择
   Write1_Code();
   Write2_Code();
   for(i=80;i>0;i--)
   {
    data1=0x00;
    Write1_Data();
    Write2_Data();
    //Lcd_Delay1();
   }
   data3=++p;
   Write1_Code();
   Write2_Code();
  } 
  Lcd_Delay();  
   
  
}

void Show_Test()
{
 int i,j,k=0;       //k用于抗干扰
 data3=0x0AF;      //开显示
 Write1_Code();
 Write2_Code(); 
 
 /*先写字符*/
 data3=0x0B9;     //页设置
 Write2_Code();
 
 data3=0x0Ba;     //页设置,解决抗干扰问题
 Write1_Code();
 data3=0x0;      //起始列设置,解决抗干扰问题
 Write1_Code();     
 
 k=0x13;
 data3=0x13;       //起始列选择,ADC=1,起始列从19列开始
 Write2_Code();
 for(i=0;i<7;i++)     /*写字符上半部分,7个字符,将字符写在右屏*/
  {
  data3=0x0;     //列设置,解决抗干扰问题
  Write1_Code();
  data3=k;
  Write2_Code();
  for(j=0;j<8;j++)
  {

   data1=ch1[i][j];
   Write2_Data();
   k++;
  }
  }
  
 data3=0x0B8;     //页设置,换页写时需注意调整列来书写
 Write2_Code();
 k=0x13;
 data3=0x13;       //起始列选择,ADC=1,起始列从19列开始
 Write2_Code();
 for(i=0;i<7;i++)    /*写字符下半部分,将字符写在左屏*/
 {
  data3=0x0;     //列设置,解决抗干扰问题
  Write1_Code();
  data3=k;
  Write2_Code();
 for(j=0;j<8;j++)
  {
   
   data1=ch1[i][j+8];
   Write2_Data();
   k++;
   
  }
 }
 
 data3=0x0B9;     //页设置
 Write1_Code();
 
 data3=0x0Ba;     //页设置,解决抗干扰问题
 Write2_Code();
 data3=0x0;      //起始列设置,解决抗干扰问题
 Write2_Code(); 
 
 k=0x13;
 data3=0x13;       //起始列选择,ADC=1,起始列从19列开始
 Write1_Code();
 for(i=0;i<7;i++)     /*写字符上半部分,7个字符,将字符写在左屏*/
  {
  data3=0x0;     //列设置,解决抗干扰问题
  Write2_Code();
  data3=k;
  Write1_Code();
  for(j=0;j<8;j++)
  {
   
   data1=ch1[i][j];
   Write1_Data();
   k++;
  }
  }
 data3=0x0B8;     //页设置,换页写时需注意调整列来书写
 Write1_Code();
 k=0x13;
 data3=0x13;       //起始列选择,ADC=1,起始列从19列开始
 Write1_Code();
 for(i=0;i<7;i++)    /*写字符下半部分,将字符写在左屏*/
 {
  data3=0x0;     //列设置,解决抗干扰问题
  Write2_Code();
  data3=k;
  Write1_Code();
 for(j=0;j<8;j++)
  {
   
   data1=ch1[i][j+8];
   Write1_Data();
   k++;
  }
 }
 
 
  
 /*以下为显示汉字*/
 data3=0x0Bb;     //页设置
 Write2_Code(); 
 
 data3=0x0B8;     //页设置,解决抗干扰问题
 Write1_Code(); 
 data3=0x0;      //起始列设置,解决抗干扰问题
 Write1_Code(); 
 
 k=0x13;
 data3=0x13;      //起始列选择,ADC=1,起始列从19列开始
 Write2_Code();
 for(i=0;i<3;i++)
  {
  data3=0x0;     //列设置,解决抗干扰问题
  Write1_Code();
  data3=k;
  Write2_Code();
  for(j=0;j<8;j++)    /*写汉字左上部分,将汉字写在右屏*/
  {
   data1=ch2[i][j];
   Write2_Data();
   k++;
   }
   for(j=0;j<8;j++)  /*写汉字右上部分*/
   {
    data1=ch2[i][j+8];
    Write2_Data();
    k++;
   }
   
  } 
 data3=0x0Ba;     //页设置,换页写时需注意调整列来书写
 Write2_Code();
 
 data3=0x0B8;     //页设置,解决抗干扰问题
 Write1_Code(); 
 data3=0x0;      //起始列设置,解决抗干扰问题
 Write1_Code();
 
 k=0x13;
 data3=0x13;       //起始列选择,ADC=1,起始列从19列开始
 Write2_Code();
 for(i=0;i<3;i++)
 {
  data3=0x0;     //列设置,解决抗干扰问题
  Write1_Code();
  data3=k;
  Write2_Code(); 
  for(j=0;j<8;j++)    /*写汉字左下部分*/
  {
   data1=ch2[i][j+16];
   Write2_Data();
   k++;
   }
  for(j=0;j<8;j++)    /*写汉字右下部分*/
  {
   data1=ch2[i][j+24];
   Write2_Data(); 
   k++;  
  }
 
 }
 
 data3=0x0Bb;     //页设置
 Write1_Code();
 
 data3=0x0B8;     //页设置,解决抗干扰问题
 Write2_Code();  
 data3=0x0;     //列设置,解决抗干扰问题
 Write2_Code();
 
 k=0x13;
 data3=0x13;      //起始列选择,ADC=1,起始列从19列开始
 Write1_Code();
 for(i=0;i<3;i++)     /*3个汉字,将汉字写在左屏*/
  {
   data3=0x0;     //列设置,解决抗干扰问题
   Write2_Code();
   data3=k;
   Write1_Code(); 
  for(j=0;j<8;j++)    /*写汉字左上部分*/
  {
   data1=ch2[i][j];
   Write1_Data(); 
   k++;
   }
  for(j=0;j<8;j++)  /*写汉字右上部分*/
  {
    data1=ch2[i][j+8];
   Write1_Data();
   k++;
  }
   
  } 
 data3=0x0Ba;     //页设置,换页写时需注意调整列来书写
 Write1_Code();  
 
 data3=0x0B8;     //页设置,解决抗干扰问题
 Write2_Code();  
 data3=0x0;      //列设置,解决抗干扰问题
 Write2_Code();
 
 k=0x13;
 data3=0x13;       //起始列选择,ADC=1,起始列从19列开始
 Write1_Code();
 for(i=0;i<3;i++)
 {
    data3=0x0;     //列设置,解决抗干扰问题
    Write2_Code();
    data3=k;
    Write1_Code();
   for(j=0;j<8;j++)    /*写汉字左下部分*/
   {
   data1=ch2[i][j+16];
   Write1_Data();
   k++;
   }
   for(j=0;j<8;j++)    /*写汉字右下部分*/
   { 
   data1=ch2[i][j+24];
   Write1_Data();
   k++;   
   }
 }  
 
 Lcd_Delay();
}

void Judge1_Ready()
{
 do
 {
 asm(" IN 4000h,_temp1 ");
 asm(" IN 2000h,_temp2 ");
 temp1=temp1|0x080;
 temp2=temp2|0x080;
 temp1=temp1>>7;
 temp2=temp2>>7;
 }while((temp1!=0)&&(temp2!=0)); 
}



void Write1_Code()
{
 //Judge1_Ready();
 Lcd_Delay();
 //PEDATDIR=PEDATDIR | 0x4000;修改
 //PEDATDIR=PEDATDIR & 0xFFBF;修改
 PEDATDIR=PEDATDIR | 0x2000;
 PEDATDIR=PEDATDIR & 0xFFDF;//Code
 asm(" ldp #010h ");
 asm(" OUT 061h,4000h ");  //4000h,E1
 asm(" nop ");
 asm(" nop ");
 asm(" nop ");
 asm(" nop ");
}

void Write2_Code()
{
 //Judge1_Ready();
 Lcd_Delay(); 
 //PEDATDIR=PEDATDIR | 0x4000;修改
 //PEDATDIR=PEDATDIR & 0xFFBF;修改
 PEDATDIR=PEDATDIR | 0x2000;
 PEDATDIR=PEDATDIR & 0xFFDF;//Code
 asm(" ldp #010h ");
 asm(" OUT 061h,2000h ");  //2000h,E2
 asm(" nop ");
 asm(" nop ");
 asm(" nop ");
 asm(" nop ");
}

void Write1_Data()
{
 //Judge1_Ready();
 Lcd_Delay();
 PEDATDIR=PEDATDIR | 0x2020;
 asm(" ldp #010h ");
 //while(1)
 asm(" OUT 060h,4000h ");
 asm(" nop ");
 asm(" nop ");
 asm(" nop ");
 asm(" nop ");
}

void Write2_Data()
{
 //Judge1_Ready();
 Lcd_Delay();
 PEDATDIR=PEDATDIR | 0x2020;
 asm(" ldp #010h ");
 asm(" OUT 060h,2000h "); 
 asm(" nop ");
 asm(" nop ");
 asm(" nop ");
 asm(" nop ");
}

void KickDog()				/*踢除看门狗 */
{
	WDKEY=0x5555;
	WDKEY=0xAAAA;
}

⌨️ 快捷键说明

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