设计内容总体介绍:
模拟十字路口的交通灯控制,并通过按键更换显示的内容,
硬件电路介绍及IO分配:
本次实验用到的硬件:
1、AT89C51单片机*1
2、LCD 1602液晶显示器*1
3、RESPACK-8 排阻*2
4、MATRIX-8*8-RED*1
5、BUTTON*4
6、晶振电路
7、复位电路
IO分配:
1、XTAL1,XTAL2用于连接晶振电路
2、RST引脚 用于复位电路
3、单片机P1.4,P1.5,P1.6,P1.7 链接四个按钮用来控制LCD的显示
4、单片机P2口和P3口分别连接点阵屏的列和行,用于点阵屏的显示。
5、单片机P0口连接LCD屏的引脚,用于显示时间。
#include "lcd.h"
/*******************************************************************************
* 函 数 名 : Lcd1602_Delay1ms
* 函数功能 : 延时函数,延时1ms
* 输 入 : c
* 输 出 : 无
* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/
void Lcd1602_Delay1ms(uint c) //误差 0us
{
uchar a,b;
for (; c>0; c--)
{
for (b=2;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
/*******************************************************************************
* 函 数 名 : LcdWriteCom
* 函数功能 : 向LCD写入一个字节的命令
* 输 入 : com
* 输 出 : 无
*******************************************************************************/
void LcdWriteCom(uchar com) //写入命令
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 0; //选择写入命令
//LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS =(LCD1602_DATAPINS & 0x0f) +(com &0xf0); //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS =(LCD1602_DATAPINS & 0x0f) +( com << 4); //发送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
/*******************************************************************************
* 函 数 名 : LcdWriteData
* 函数功能 : 向LCD写入一个字节的数据
* 输 入 : dat
* 输 出 : 无
*******************************************************************************/
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择写入数据
//LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS =(LCD1602_DATAPINS & 0x0f) +( dat & 0xf0); //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS =(LCD1602_DATAPINS & 0x0f) +( dat << 4); //写入低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
/*******************************************************************************
* 函 数 名 : LcdInit()
* 函数功能 : 初始化LCD屏
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void LcdInit() //LCD初始化子程序
{
LCD1602_RW=0;
LcdWriteCom(0x32); //将8位总线转为4位总线
LcdWriteCom(0x28); //在四位线下的初始化
LcdWriteCom(0x0c); //开显示不显示光标
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //设置数据指针起点
}
/********************************************************************
* 函 数 名 : write_string
* 函数功能 : 向LCD写入字符串
* 输 入 : 行、列、字符串
* 输 出 : 无
***********************************************************************/
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
LcdWriteCom(0x80+add);
else
LcdWriteCom(0x80+0x40+add);
while(1)
{
if(*p == '\0') break;
LcdWriteData(*p);
p++;
}
}
资料借鉴于此纷传