<reg51.h>
#define
uchar
unsigned
char
#define
uint
unsigned
int
uchar
xpos
,ypos
sbit
key=P2^0
sbit
rs=P3^0
sbit
rw=P3^1
sbit
e=P3^2
void
nop(){}
void
delay(uint
z)
//延时
{
uint
x,y
for(x=zx>0x--)
for(y=112y>0y--)
}
void
check()
//判忙
{
rs=0
rw=1
e=0
P1=0xff
e=1
nop()
nop()
while(P1&0x80){}
}
void
wrc(uchar
com)
//写指令
{
check()
rs=0
rw=0
e=1
P1=com
nop()
e=0
nop()
}
void
wrd(uchar
date)
//写数据
{
check()
rs=1
rw=0
e=1
P1=date
nop()
e=0
nop()
}
void
init()
//初始化
{
wrc(0x38)
wrc(0x01)
wrc(0x0c)
wrc(0x06)
}
void
lcdpos()
//内部数据地址指针定位
{
xpos&=0x01
ypos&=0x1f
if(xpos==0x00)
wrc(ypos|0x80)
else
wrc((ypos+0x40)|0x80)
}
void
lcdw(uchar
x,uchar
y,uchar
*s)
//在指定的坐标下写字符串
{
xpos=x
for(ypos=yypos<20ypos++)
{
lcdpos()
wrd(*s)
s++
}
}
void
main()
{
init()
cgram()
while(1)
{
lcdw(0,0,"##########
")
lcdw(1,1,"!!!!!!!!!!
")
lcdw(2,2,"&&&&&&&&&&
")
lcdw(3,3,"$$$$$$$$$$
")
}
}
LCD有哪些寄存器?各表示什么含义,控制什么功能?写出来的程序又如何验证是否正确?
其实,你只需要对LCD的打开、关闭,以及能把一个数据块显示在LCD上就行了
“常见字母、数字、符号、中文、自定义字符、图形,以及文字和图形混和显示;光标显示/隐藏(Cursor
on/off)、显示字符闪烁(Display
character
blink);画面清除(Display
clear)、光标归位(Return
home)”
这些功能,只需要在这个数据块上进行 *** 作,然后再送到LCD显示。
//端口定义 诺基亚5110显示屏
int LCD_CE=2
int LCD_RST=3
int SCLK=4
int SDIN=5
int LCD_DC=6
int inputPin=8 // 定义超声波信号接收接口
int outputPin=9// 定义超声波信号发出接口
/****************************************************************/
void setup()
{
pinMode(inputPin, INPUT)
pinMode(outputPin, OUTPUT)
}
//****************************定义ASCII字符**********************//
/**********************************
6 x 8 font
1 pixel space at left and bottom
index = ASCII - 32
***********************************/
const unsigned char font6x8[][6] =
{
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp
{ 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 }, // !
{ 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 }, // "
{ 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // #
{ 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $
{ 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 }, // %
{ 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 }, // &
{ 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 }, // '
{ 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 }, // (
{ 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 }, // )
{ 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 }, // *
{ 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 }, // +
{ 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 }, // ,
{ 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 }, // -
{ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 }, // .
{ 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 }, // /
{ 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0
{ 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1
{ 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2
{ 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3
{ 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4
{ 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5
{ 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6
{ 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7
{ 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8
{ 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9
{ 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 }, // :
{ 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 }, //
{ 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 }, // <
{ 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 }, // =
{ 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 }, // >
{ 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 }, // ?
{ 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E }, // @
{ 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C }, // A
{ 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B
{ 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C
{ 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D
{ 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E
{ 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F
{ 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G
{ 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H
{ 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I
{ 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J
{ 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K
{ 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L
{ 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M
{ 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N
{ 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O
{ 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P
{ 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q
{ 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R
{ 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 }, // S
{ 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T
{ 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U
{ 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V
{ 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W
{ 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 }, // X
{ 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y
{ 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z
{ 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [
{ 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55
{ 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ]
{ 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^
{ 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 }, // _
{ 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 }, // '
{ 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 }, // a
{ 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b
{ 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 }, // c
{ 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F }, // d
{ 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 }, // e
{ 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f
{ 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C }, // g
{ 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h
{ 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i
{ 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 }, // j
{ 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k
{ 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l
{ 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m
{ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n
{ 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 }, // o
{ 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 }, // p
{ 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC }, // q
{ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r
{ 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 }, // s
{ 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t
{ 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u
{ 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v
{ 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w
{ 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 }, // x
{ 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C }, // y
{ 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z
{ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 }// horiz lines
}
/************************LCD初始化函数********************************/
void LCD_init(void)
{
//先设置为输出
pinMode(SCLK,OUTPUT)
pinMode(SDIN,OUTPUT)
pinMode(LCD_DC,OUTPUT)
pinMode(LCD_CE,OUTPUT)
pinMode(LCD_RST,OUTPUT)
// 产生一个让LCD复位的低电平脉冲
digitalWrite( LCD_RST, LOW)
delayMicroseconds(1)
digitalWrite( LCD_RST, HIGH)
// 关闭LCD
digitalWrite( LCD_CE, LOW)
delayMicroseconds(1)
// 使能LCD
digitalWrite( LCD_CE, HIGH)//LCD_CE = 1
delayMicroseconds(1)
LCD_write_byte(0x21, 0)// 使用扩展命令设置LCD模式
LCD_write_byte(0xc8, 0)// 设置偏置电压
LCD_write_byte(0x06, 0)// 温度校正
LCD_write_byte(0x13, 0)// 1:48
LCD_write_byte(0x20, 0)// 使用基本命令
LCD_clear()// 清屏
LCD_write_byte(0x0c, 0)// 设定显示模式,正常显示
// 关闭LCD
digitalWrite( LCD_CE, LOW) //LCD_CE = 0
}
/************************LCD清屏函数*******************************/
void LCD_clear(void)
{
unsigned int i
LCD_write_byte(0x0c, 0)
LCD_write_byte(0x80, 0)
for (i=0i<504i++)
{
LCD_write_byte(0, 1)
}
}
/*************************设置字符位置函数**************************/
void LCD_set_XY(unsigned char X, unsigned char Y)
{
LCD_write_byte(0x40 | Y, 0)// column
LCD_write_byte(0x80 | X, 0)// row
}
/*************************ASCII字符显示函数*************************/
void LCD_write_char(unsigned char c)
{
unsigned char line
c -= 32
for (line=0line<6line++)
{
LCD_write_byte(font6x8[c][line], 1)
}
}
/*******************************************************************/
/*-------------------------------------------------
LCD_write_english_String : 英文字符串显示函数
输入参数:*s :英文字符串指针;
X、Y: 显示字符串的位置,x 0-83 ,y 0-5
--------------------------------------------------*/
void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)
{
LCD_set_XY(X,Y)
while (*s)
{
LCD_write_char(*s)
s++
}
}
/******************************************************************/
/*---------------------------------------------
LCD_write_byte: 写数据到LCD
输入参数:data:写入的数据;
command :写数据/命令选择;
---------------------------------------------*/
void LCD_write_byte(unsigned char dat, unsigned char command)
{
unsigned char i
digitalWrite( LCD_CE, LOW)// 使能LCD_CE = 0
if (command == 0)
{
digitalWrite( LCD_DC, LOW)// 传送命令 LCD_DC = 0
}
else
{
digitalWrite( LCD_DC, HIGH)// 传送数据LCD_DC = 1
}
for(i=0i<8i++)
{
if(dat&0x80)
{
digitalWrite( SDIN, HIGH)//SDIN = 1
}
else
{
digitalWrite( SDIN, LOW)//SDIN = 0
}
digitalWrite( SCLK, LOW)//SCLK = 0
dat = dat <<1
digitalWrite( SCLK, HIGH)//SCLK = 1
}
digitalWrite( LCD_CE, HIGH)//LCD_CE = 1
}
/*************************以下为主函数*****************************/
void loop()
{
LCD_init()//初始化液晶
LCD_clear()
LCD_write_english_string(0,0," --Arduino-- ")
LCD_write_english_string(0,2,"Renge:")
LCD_write_english_string(0,4,"DESIGN BY KENT")
LCD_write_english_string(0,5,"2010.6")
while(1)
{
digitalWrite(outputPin, LOW)// 使发出发出超声波信号接口低电平2μs
delayMicroseconds(2)
digitalWrite(outputPin, HIGH)// 使发出发出超声波信号接口高电平10μs,这里是至少10μs
delayMicroseconds(10)
digitalWrite(outputPin, LOW) // 保持发出超声波信号接口低电平
int distance = pulseIn(inputPin, HIGH) // 读出脉冲时间
distance= distance/58 // 将脉冲时间转化为距离(单位:厘米)
if(distance>120)
{
LCD_write_english_string(35,2,"???")
}
else
{
LCD_write_english_string(60,2,"cm")
LCD_set_XY(35, 2)
LCD_write_char( 0x30+distance%1000/100)//显示百位数
LCD_write_char( 0x30+distance%100/10) //显示十位数
LCD_write_char( 0x30+distance%10) //显示个位数
}
delay(10)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)