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

📄 main.c

📁 RT12232在凌阳SPEC061板上的实验程序
💻 C
字号:
/*******************************************/
/*   RT12232F液晶基于凌阳SPEC061A的驱动程序 */
/*  作者:kyflash 华南理工大学电信学院03级  */
/*   2005-12-30     版本 1.0               */
/********************************************/
//说明:由于061A按字操作的,所以位操作比较麻烦,
//      为了保证程序容易改动以适应不同情况引脚分配,
//      程序较为烦琐,建议根据实际分配位操作简化

#define delay_time  100
//看门狗清零
#define P_Watchdog_Clear		(volatile unsigned int *)0x7012 
#define		C_WDTCLR				0x0001	
//定义液晶接口,使用A端口
#define  LCD_PORT_DATA             (volatile unsigned int *)0x7000   
#define  LCD_PORT_BUFFER  			(volatile unsigned int *)0x7001
#define  LCD_PORT_DIR 				(volatile unsigned int *)0x7002
#define  LCD_PORT_ATTR		    	(volatile unsigned int *)0x7003
/*
//如果选择使用B端口则如下定义:
#define  LCD_PORT_DATA              (volatile unsigned int *)0x7005   
#define  LCD_PORT_BUFFER  			(volatile unsigned int *)0x7006
#define  LCD_PORT_DIR 				(volatile unsigned int *)0x7007
#define  LCD_PORT_ATTR		    	(volatile unsigned int *)0x7008 
  */
 
//定义液晶控制位
#define RS  4
#define RW  5
#define E   6
//定义液晶数据口起始相对位置
#define LCD_DATA  8   
//选择从端口A/B的P8开始作为液晶数据口

/***********************************/
/*  读取液晶忙状态                */
/***********************************/
char  read_busy(void)
{
  unsigned char busy ;
  *LCD_PORT_ATTR&=~(0xFF<<LCD_DATA);//设置为上拉输入状态以便读取数据
  *LCD_PORT_DATA|=(0xFF<<LCD_DATA);
  *LCD_PORT_DIR&=~(0xFF<<LCD_DATA);
do
{ *LCD_PORT_DATA|=(1<<RW);//RW置1
  *LCD_PORT_DATA&=~(1<<RS);//RS=0,写数据
  *LCD_PORT_DATA|=(1<<E);
  busy=((*LCD_PORT_DATA)>>LCD_DATA);//只读取液晶数据口数据:8bit
  *P_Watchdog_Clear=C_WDTCLR ;//为了保险起见,这里最好喂狗
  }
  while(busy&0x80);
 }
 
 /***********************************/
/*  往液晶写字节函数               */
/***********************************/
 void write_data(unsigned char data)
{
  read_busy();
  *LCD_PORT_ATTR|=(0xff<<LCD_DATA);//设置为高电平输出状态
  *LCD_PORT_DIR|=(0xff<<LCD_DATA);
  *LCD_PORT_DATA=(data<<LCD_DATA);//这条指令会影响到该端口非液晶接口位的数据变化
                                   //实际使用中如果其他口有另外用途则需要加以处理
   *LCD_PORT_DATA|=(1<<RS);//RS置1
   *LCD_PORT_DATA&=~(1<<RW);//RW=0,写数据
   *LCD_PORT_DATA|=(1<<E);
   asm("nop\n");//空操作,延时,可以去掉
   *LCD_PORT_DATA&=~(1<<E);
 }

/***********************************/
/*  往液晶写命令函数               */
/***********************************/
void write_command(unsigned char  command)
{
  read_busy();
  *LCD_PORT_ATTR|=(0xff<<LCD_DATA);//设置为高电平输出状态
  *LCD_PORT_DIR|=(0xff<<LCD_DATA);
  *LCD_PORT_DATA=(command<<LCD_DATA);//该指令同样会影响端口其他位
  *LCD_PORT_DATA&=~(1<<RS);//RS置0
  *LCD_PORT_DATA&=~(1<<RW);//RW=0,写命令
  *LCD_PORT_DATA|=(1<<E);
  asm("nop\n");
  *LCD_PORT_DATA&=~(1<<E);
 }

/***********************************/
/*  读取液晶内部数据函数           */
/***********************************/
char read_data(void)
{
  char data;
  read_busy();
  *LCD_PORT_ATTR&=~(0xFF<<LCD_DATA);//设置为上拉输入状态以便读取数据
  *LCD_PORT_DATA|=(0xFF<<LCD_DATA);
  *LCD_PORT_DIR&=~(0xFF<<LCD_DATA);
  *LCD_PORT_DATA|=(1<<RS);//RS置1
  *LCD_PORT_DATA|=(1<<RW);//RW=1,读数据
  * LCD_PORT_DATA|=(1<<E);
  asm("nop\n");
  data=*LCD_PORT_DATA; 
   return data;
 }

void delayXms(int x)
{
unsigned char i;
while(x--)
{for(i=0;i<200;i++)*P_Watchdog_Clear=C_WDTCLR ;
}
}


/***********************************/
/*  往液晶写字符串函数             */
/*   由于本液晶带字库,           */
/*  从而可以利用该函数直接写汉字  */                             
/***********************************/
void lcd_print(unsigned char *temp)
{ 
while((*temp)!='\0' )
  {
  write_data(*temp);
  delayXms(delay_time);//加上延时使具有逐个显示效果
  *P_Watchdog_Clear=C_WDTCLR ;//视所使用的系统频率来决定这里是否需要喂狗
  temp++;
  }
 }
 
 void write_string(unsigned char *temp)
{ 
while((*temp)!='\0' )
  {
  write_data(*temp);
   *P_Watchdog_Clear=C_WDTCLR ;//视所使用的系统频率来决定这里是否需要喂狗
  temp++;
  }
 }
 
 /***********************************/
/*   清除屏幕函数                   */
/* 注意只能整屏幕清除               */
/***********************************/
 void clear(void)
 { write_command(0x01);
 }  
 
 /***********************************/
/*  液晶开显示                     */
/***********************************/
void disp_on(void)
{write_data(0x0d);
}

////反白显示开关////
void reverse(unsigned char black)
{ 
 black&=0x07;
 black|=0x04;
 write_command(0x34);
 write_command(black);
 write_command(0x30);
 }
  
/***********************************/
/*  液晶初始化函数                 */
/***********************************/ 
void lcd_initial(void)
{    
       *LCD_PORT_ATTR|=(1<<RS);//RS设置
       *LCD_PORT_DATA|=(1<<RS);
       *LCD_PORT_DIR|=(1<<RS);
        
        *LCD_PORT_ATTR|=(1<<RW);//RW设置
        *LCD_PORT_DATA|=(1<<RW);
        *LCD_PORT_DIR|=(1<<RW);
               
       *LCD_PORT_ATTR|=(1<<E);//E设置
       *LCD_PORT_DATA|=(1<<E);
       *LCD_PORT_DIR|=(1<<E);
                  
        write_command(0x30);//功能设定:8位数据,基本指令30
		//write_command(0x34);//扩充指令
		//write_command(0x03);//允许卷动
        write_command(0x06);//点设定:画面右移
        write_command(0x0c);//lcd开,光标关
        write_command(0x01);//清屏
        write_command(0x02);//地址归位
        
        lcd_print("凌阳单片机演示!");
        *P_Watchdog_Clear=C_WDTCLR ;
        write_command(0x90);
        lcd_print("Welcome to use");
        delayXms(500);
	}

 main()
{
  delayXms(500);//等待液晶内部初始化
  lcd_initial();
  while(1)
  {
  clear();
  write_command(0x81);
  lcd_print("台湾凌阳科技");
  write_command(0x90);
 lcd_print("SCUT Elec&Info");
  clear();
  write_command(0x81);
  write_string("华南理工大学");
  write_command(0x90);
  reverse(0x01);
   write_string("无线电爱好者协会");
  delayXms(500);
  clear();
  write_command(0x80);
  write_string("welcome.......");
  
 }
}

⌨️ 快捷键说明

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