📄 lcddisp.c
字号:
// edit by chendong ,2004-3-10
#include "vd.h"
#include "string.h"
#define LCD_ADDR_BASE 0x3fc4000
#define LCD_ADDR_WI (*(volatile unsigned *)(LCD_ADDR_BASE)) //writing pointer for instruction
#define LCD_ADDR_WD (*(volatile unsigned *)(LCD_ADDR_BASE+0x100)) //writing pointer for data
#define LCD_ADDR_RI (*(volatile unsigned *)(LCD_ADDR_BASE+0x200)) //reading pointer for instruction
#define LCD_ADDR_RD (*(volatile unsigned *)(LCD_ADDR_BASE+0x300)) //reading pointer for data
void lcd_init(void);
void lcd_clear(void);
void lcd_delay(void); //instand of lcd_testbusy() ,also used for 1200ns delay
void lcd_locate(B32 x,B32 y); //x for line [0..9],y for row [0..1]
void lcd_print(char data[],B32 length); //length is the length of int[]
B32 ltoa(B32 value,char data[],B32 radix); //transfer value to string,radix=[2..36]
void lcd_delay(void)
{
B32 temp;
for(temp=0;temp<500;temp++);
}
void lcd_init(void)
{
B32 temp;
temp=EXTACON0_C;
temp=temp&0x0000ffff;
temp=temp|0x0e410000;
EXTACON0_C=temp; //set EXTACON0 mode--tACS1=0cycle tACC1=7cycle tCOS1=1cycle tCOH1=1cycle
//Initialization start
//rIOPDATA=0x80;
for(temp=0;temp<2000000;temp++); //delay 40ms
LCD_ADDR_WI=0x0030; //function set--000011x0xx <==RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
for(temp=0;temp<500;temp++); //delay 100us
LCD_ADDR_WI=0x0030; //function set--000011x0xx (000011x0xx)
for(temp=0;temp<185;temp++); //delay 37us
LCD_ADDR_WI=0x000f; //disp on/off control--0000001dcb (0000001111)
for(temp=0;temp<500;temp++); //delay 100us
LCD_ADDR_WI=0x0001; //display clear--0000000001 (0000000001)
for(temp=0;temp<50000;temp++); //delay 10ms
LCD_ADDR_WI=0x0006; //entry mode set--00000001I/Ds (0000000110)
//rIOPDATA=0x00;
//Initialization end
}
void lcd_clear(void)
{
B32 temp;
lcd_delay();
LCD_ADDR_WI=0x01; //display clear--0000000001 (0000000001)
for(temp=0;temp<50000;temp++); //to clear 1.2ms needed
}
void lcd_locate(B32 x,B32 y)
{
if(x<10&&y<2) //is the x and y valid
{
lcd_delay();
LCD_ADDR_WI=0x80+0x10*y+x;
}
//firstline 80h~89h
//secondline 90h~99h
}
void lcd_print(char data[] ,B32 length)
{
B32 i;
for(i=0;i<length;i++)
{
lcd_delay();
LCD_ADDR_WD=(B32)data[i]; //汉字的显示先写入高字节,再写入低字节, 注意下面的说明
}
}
//应用示例
/*
B32 temp;
char data[22]; //max 10 chinese charaters in a line
lcd_init();
strcpy(data,"西安电子科技大学");
lcd_locate(1,0);
lcd_print(data,16);
for(temp=0;temp<5000000;temp++);
lcd_clear();
strcpy(data,"宽带无线重点实验室");
lcd_locate(0,0);
lcd_print(data,18);
strcpy(data,"移动自组织网节点平台");
lcd_locate(0,1);
lcd_print(data,20);
*/
//说明
/*
//变量及函数说明
液晶总计有4个地址,分别用于指令的读写和数据的读写。
LCD_ADDR_BASE 为液晶的基地址,也就是写指令地址
LCD_ADDR_WI 液晶写指令地址指针
LCD_ADDR_WD 液晶写数据地址指针
LCD_ADDR_RI 液晶读指令地址指针
LCD_ADDR_RD 液晶读数据地址指针
使用方法: LCD_ADDR_WI=0x0C 将指令0x0c写入液晶
int lcd_testbusy(void); 液晶忙指示位测试程序,0表示不忙,1表示忙;
该函数并不使用,因为既是检测到不忙也要延时1200ns,才可以在进行读写操作(见ST7920手册)
void lcd_init(void); 液晶初始化函数,用于在上电复位后对液晶初始化(见手册)
void lcd_clear(void); 液晶清除显示函数,操作后光标自动回到屏幕左上角
void lcd_delay(void); 由于不使用lcd_testbusy()函数,所以使用此函数加以延迟
void lcd_locate(int x,int y); 显示的定位函数,针对16×16的汉字定位,无法定位于16×8的奇数位置
x为显示定位的列数,取值范围【0..9】,y为行数,取值范围【0..1】
第一行DDRAM地址为80H~89H,第二行地址为90H~99H 液晶为160×32 即2行10列的汉字
void lcd_print(char data[],int length); 写显示数据函数
data[] 为欲写字符串数组名,一个汉字被存在占用两个char型变量空间,先存高字节,后存低字节
length为欲写字个数 写的字串应不超出一行的显示范围
length 计算方法为一个16×16的汉字计为2,一个16×8的字母或符号计为1。将其和记为length
如:
char data[22]="信息科学研究所 101室"; //101前有一空格(见下”注意“)
lcd_locate(0,0);
lcd_print(data,20);
显示结果为:在液晶的第一行显示:信息科学研究所 101室
如果将20改为10,则:
显示结果为:在液晶的第一行显示:信息科学研
如将20改为17,则:
显示结果为:在液晶的第一行显示:信息科学研究所 10
注意:由于该液晶显示16×16汉字时,必须将其显示在偶对齐位置(见手册),故在101前加一空格,令‘室’字偶对齐
*/
B32 ltoa(B32 value,char data[],B32 radix)
{
char tempdata[255];
B32 i=0,j=0;
strcpy(data,""); //clear the string
if(radix>=2&&radix<=16)
{
while(1)
{
if(value%radix<10)
tempdata[i]=(char)(value%radix+0x30);
else
tempdata[i]=(char)(value%radix+0x37);
value=value/radix;
i++;
if(value==0||i==253) break;
}
for(j=0;j<i;j++)
{
data[j]=tempdata[i-j-1];
}
data[i]='\0';
}
else
while(i<20) data[i++]='x';
return i;
}
//lcd_locate(0,0);
//lcd_print(data,ltoa(temp,data,10));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -