📄 1602driver.c
字号:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by: Chenmingji
** Created date: 2004-09-16
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** rs <--> p0.2
** rw <--> p0.3
** e <--> p0.4
** d0-d7<--> p1.16-p1.23
********************************************************************************************************/
#include "config.h"
//#include "1602driver.h"
/***************************/
/*** 管脚定义及宏定义 *****/
/***************************/
#define rs 1<<4
#define set_rs() IO0SET=rs;
#define clr_rs() IO0CLR=rs;
#define rw 1<<5
#define set_rw() IO0SET=rw;
#define clr_rw() IO0CLR=rw;
#define en 1<<6
#define set_e() IO0SET=en;
#define clr_e() IO0CLR=en;
#define d 0xff<<16
#define dd 0xff00ffff
/**************************/
/****** 函数声明 *********/
/**************************/
void delay_ms(uint8 time);
void read_state(void);
void write_command(uint8 command);
void write_data(uint8 data);
void goto_xy(uint8 x,uint8 y);
uint8 strlen(uint8 *str);
/**************************/
void lcd_init(void); //液晶初始化
void display_clear(void); //清屏
void display_a_char(uint8 x,uint8 y, uint8 it); //在第x列y行显示一个字符
void display_string(uint8 x,uint8 y,uint8 *str);//在第x列y行显示一个字符串
void display_num(uint8 x,uint8 y,float num); //在第x列y行显示数字,范围:10.0-999.9
void save_cgram(uint8 *cg,uint8 n); //将字模写进cgram里,cg指向字模地址,n代表字模所存cgram的位置
void display_cgram(uint8 x,uint8 y,uint8 n); //在第x列y行显示第n个位置所存的字模
/*****字符串定义*********/
/*uint8 string[]="string";
uint8 cg1[]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02};
uint8 cg2[]={0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00};
uint8 cg3[]={0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00};*/
/***************************/
/****** 函数定义 ***********/
/***************************/
/******延时函数*******/
void delay_ms(uint8 time)
{
uint16 i;
for(;time>0;time--)
for(i=200;i>0;i--);//for(i=3680;i>0;i--);
}
/******读状态********/
void read_state(void)
{
/* uint8 state;
IO1DIR=IO1DIRⅆ
clr_rs();
set_rw();
clr_e();
state=(IO1PIN&d)>>16;
set_e();
clr_e();
while(state&0x08);
*/
delay_ms(100);
}
/******写命令********/
void write_command(uint8 command)
{
read_state();
IO1DIR=IO1DIR|d;
clr_rs();
clr_rw();
clr_e();
IO1CLR=d;
IO1SET=command<<16;
set_e();
clr_e();
}
/******写数据*******/
void write_data(uint8 data)
{
read_state();
IO1DIR=IO1DIR|d;
set_rs();
clr_rw();
clr_e();
IO1CLR=d;
IO1SET=data<<16;
set_e();
clr_e();
}
/*****定位********/
void goto_xy(uint8 x,uint8 y)
{
uint8 xx,yy;
uint8 address;
xx=x&0x0f;
yy=y&0x01;
if(yy)
address=0xc0+xx;
else
address=0x80+xx;
write_command(address);
}
/***计算字符串长度***/
uint8 strlen(uint8 *str)
{
uint8 i;
i=0;
while(*str++)
{
i++;
}
return i;
}
/***********************************************/
/*****初始化********/
void lcd_init(void)
{
PINSEL0=PINSEL0&0xffffc0ff;
PINSEL2=PINSEL2&(~0x08);
IO0DIR=IO0DIR|rs
|rw
|en;
IO1DIR=IO1DIR|d;
delay_ms(100);
write_command(0x38);
write_command(0x38);
write_command(0x38);
write_command(0x38);
write_command(0x08);
write_command(0x01);
write_command(0x06);
write_command(0x0c);
write_command(0x01);
delay_ms(100);
}
/*****清屏*****/
void display_clear(void)
{
write_command(0x01);
}
/*****显示一个字符****/
void display_a_char(uint8 x,uint8 y, uint8 it)
{
goto_xy(x,y);
write_data(it);
}
/*****显示字符串*****/
void display_string(uint8 x,uint8 y,uint8 *str)
{
uint8 i,tmp;
i=strlen(str);
tmp=i+x;
if (tmp>16)
{
for(;x<16;x++)
{
display_a_char(x,y,*str++);
}
x=0;
y=y+1;
goto_xy(x,y);
delay_ms(100);
for(;tmp>16;tmp--)
{
display_a_char(x,y,*str++);
x++;
}
}
else
{
for(;i>0;i--)
{
display_a_char(x,y,*str++);
x++;
}
}
}
/*****显示数字******/
void display_num(uint8 x,uint8 y,float num)
{
uint8 tmp1,tmp2,tmp3,tmp4,tmp5;
uint16 tmp;
tmp=(uint16)(num*10);
tmp1=tmp/1000;
tmp2=(tmp/100)%10;
tmp3=(tmp/10)%10;
tmp4='.';
tmp5=tmp%10;
if(tmp1!=0)
{
display_a_char(x,y,tmp1+'0');
display_a_char(x+1,y,tmp2+'0');
}
if(tmp2!=0)
display_a_char(x+1,y,tmp2+'0');
display_a_char(x+2,y,tmp3+'0');
display_a_char(x+3,y,tmp4);
display_a_char(x+4,y,tmp5+'0');
}
/******将字模写进cgram****/
void save_cgram(uint8 *cg,uint8 n)
{
uint8 i,nn,command;
nn=n&(0x07);
command=0x40+(nn)*(0x08);
write_command(command);
delay_ms(100);
for(i=0;i<7;i++)
{
write_data(cg[i]);
delay_ms(100);
}
delay_ms(100);
}
/******从cgram读出字符****/
void display_cgram(uint8 x,uint8 y,uint8 n)
{
goto_xy(x,y);
delay_ms(100);
write_data(n);
delay_ms(100);
}
/***************************/
/***************************/
/***************************/
/*int main (void)
{
lcd_init();
save_cgram(cg1,0);
save_cgram(cg2,1);
save_cgram(cg3,2);
display_cgram(1,1,0);
display_cgram(2,1,1);
display_cgram(3,1,2);
return 0;
}*/
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -