LCD1602
液晶显示屏,可以显示2*16个字符,即1602,有16个管脚
LCD初始化
/*********************************************************/
// 1602液晶功能初始化
/*********************************************************/
void LcdInit()
{
LcdWriteCmd(0x38); // 16*2显示,5*7点阵,8位数据口
LcdWriteCmd(0x0C); // 开显示,不显示光标
LcdWriteCmd(0x06); // 地址加1,当写入数据后光标右移
LcdWriteCmd(0x01); // 清屏
}
使用LCD时要先初始化才能使用其他功能函数
LCD_Delay()
LCD_WriteCommand(unsigned char Command)
LCD_WriteData(unsigned char Data)
LCD_SetCursor(unsigned char Line,unsigned char Column)
LCD_Init()
LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
LCD_Pow(int X,int Y)
LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
51单片机中经常使用LCD调试程序
矩阵键盘
sct89c52中的矩阵键盘为4*4十六个按键盘,由八个引脚控制(4行+4列)
51单片机内部为高电平,按下按键当某个按键则相当于接地,所处电平为低电平,io口为0
采用行列扫描法确定按下按键
#include <REGX52.H>
#include "Delay.h"
unsigned char Matrixkey()
{
unsigned char Matrixnumber=0;
P1=0xFF;
P1_3=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Matrixnumber=1;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Matrixnumber=5;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Matrixnumber=9;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Matrixnumber=13;}
P1=0xFF;
P1_2=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Matrixnumber=2;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Matrixnumber=6;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Matrixnumber=10;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Matrixnumber=14;}
P1=0xFF;
P1_1=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Matrixnumber=3;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Matrixnumber=7;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Matrixnumber=11;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Matrixnumber=15;}
P1=0xFF;
P1_0=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Matrixnumber=4;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Matrixnumber=8;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Matrixnumber=12;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Matrixnumber=16;}
return Matrixnumber;
}
定时器
stc89c52中有三个定时器t0,t1,t2
★通常使用t1,16位定时器/计数器。
工作原理:每过一个时间段给一个脉冲,对脉冲进行计数,计数达到某个值时程序跳进中断系统,运行中断系统中的程序
由于“某个值”是确定的(65535)所以我们可以先给一个初始值,由初始值计数到65535,实现不同时间的定时
定时计数器通过特殊功能寄存器TCON来启动
#include <REGX52.H>
void Timer0_Init(void) //1000微秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x66; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
PT0 = 0;
}
//void Timer0_Rountine() interrupt 1
//{
// static unsigned int count;
// TL0 = 0x66; //设置定时初始值
// TH0 = 0xFC;
// count++;
// if(count>=500){
// count=0;
// if(keymode==0){P2=_crol_(P2,1);}
// if(keymode==1){P2=_cror_(P2,1);}
// }
//
//}
串口
串口即串行通信口,串行通信是数据通信的一种,串行通信是一位一位的按顺序的进行发送或接收的通信方式
sct89c52有1个UART,4种工作模式
通过定时器T1计时(仅提供波特率:串口通信的速率),需要配置串行控制寄存器SCON(对串行通信的工作模式进行控制),电源控制寄存器PCON(配置SMOD来控制波特率是否加倍,若SMOD=0,波特率不变。SMOD=1,波特率加倍。SMOD默认为0)
void Uart1_Init(void) //4800bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFA; //设置定时初始值
TH1 = 0xFA; //设置定时重载值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
}
LED点阵屏
sct89c52LED点阵屏(1616)由4片74HC595芯片(44)拼成
共有8+8个引脚
74HC595是8位串行输入/输出或者并行输出移位寄存器
通过SER口输入串行的数据,当SRCLK有上升沿信号时,数据就往下移一位,当数据满了8位时,给RCLK上升沿信号时,8位数据就锁存到QA~QH,QH’连接到下一片74HC595,继续拓展16位、32位…
void _74HC595_Byte(unsigned char byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
SER=byte&(0x80>>i);
SCK=1;
SCK=0;
}
RCK=1;
RCK=0;
}
void MatrixLED_ShowColumn(unsigned char Column,Data)
{
_74HC595_Byte(Data);
P0=~(0x80>>Column);
Delay(1);
P0=0xFF;
}
DS1302实时时钟
DS1302 是 DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和 31 字节静态 RAM,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。
ds1302使用三根通信线CE,IO,SCLK
初始化:
void DS1302_Init(void)
{
DS1302_CE=0;
DS1302_SCLK=0;
}
BCD码
写
void DS1302_Byte(unsigned char Command,Data)
{
unsigned char i;
DS1302_CE=1;
for(i=0;i<8;i++)
{
DS1302_IO=Command&(0x01<<i);
DS1302_SCLK=1;
DS1302_SCLK=0;
}
for(i=0;i<8;i++)
{
DS1302_IO=Data&(0x01<<i);
DS1302_SCLK=1;
DS1302_SCLK=0;
}
DS1302_CE=0;
}
读
unsigned char DS1302_Read(unsigned char Command)
{
unsigned char Data=0x00,i;
DS1302_CE=1;
Command|=0x01;
for(i=0;i<8;i++)
{
DS1302_IO=Command&(0x01<<i);
DS1302_SCLK=0;
DS1302_SCLK=1;
}
for(i=0;i<8;i++)
{
DS1302_SCLK=1;
DS1302_SCLK=0;
if(DS1302_IO)
{
Data|=(0x01<<i);
}
}
DS1302_CE=0;
DS1302_IO=0;
return Data;
}