头文件#include <REGX52.H>
LCD屏幕
- lcd1602共计有两行,每行40个字节
- 第一行首地址0x80
- 第二行首地址为0xc0
- lcd1602只显示每行前16个字节,其余字节要想显示需要向前移动
-
图片来自b站斌哥单片机
需要关注的有以下几点:
- lcd1602只显示右边的打印字符
- lcd1602不显示左边的控制字符
lcd1602指令集
LCD的实现是先定义连接的P0口、引脚。
根据时序图写出 写命令和写数据的函数。
写一个光标函数(确定在屏幕上的位置)。
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
if(Line==1)
{
LCD_WriteCommand(0x80|(Column-1));
//可以0x80+(Column-1),Column-1是因为屏幕1-16对应的是0-15,第一行一列的位置是0x80
}
else if(Line==2)
{
LCD_WriteCommand(0x80|(Column-1+0x40));
//第二行的位置=初始位置0x80+0x40+Column-1
}
}
初始化->写数字,行、列、输入的数字。
数字通过长度的函数判断有几个。
输入的时候01 08出错,char类型08会出错。
unsigned char NumLength(int Number)
{
unsigned char Length=0;
if(Number==0)
Length=1;
else
{
while(Number!=0)
{
Number/=10;
Length++;
}
}
if(Length==1)//没有这句,结果为1,有为01.因为变成2位的长度会在前面补0.
Length=2;
return Length;
}
如果想输出8进制,16进制。在定义函数时输入8和10即可。
int LCD_Pow(int X,int Y)//可以i=0;i<=Y(10,i-1)|i=1;i<Y(10,i);
{
unsigned char i;
int Result=1;
for(i=1;i<Y;i++)
{
Result*=X;
}
return Result;
}
->写字符串函数。
字符串的函数定义字符数组。
通过循环和写数据的函数,接收字符串。
矩阵键盘。
16个 4*4可以先每行扫描,再每列扫描。或先每列扫描,再每行扫描
先让按键全为1,当按下时为0.
unsigned char MartrixKey()//先列扫描,再行扫描
{
unsigned char KeyNumber=0;
P1=0xFF;
P1_3=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
P1=0xFF;
P1_2=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
P1=0xFF;
P1_1=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
P1=0xFF;
P1_0=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
return KeyNumber;
}