📄 main.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 + -