1.锁存器选通函数
void SelectHC573(unsigned char n)
{
switch(n)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;
break;
case 0:
P2 = (P2 & 0x1f) | 0x00; //所有锁存器不选择
break;
}
}
2.初始化开发板函数
void InitSystem()
{
SelectHC573(5);
P0 = 0x00;
SelectHC573(4);
P0 = 0xff;
SelectHC573(0);
}
3.数码管显示函数
//#include "intrins.h"
unsigned char code SMG_duanma[19]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f,0xff};//16->-,17->.,18->null
unsigned char SMG[]={18,18,18,18,18,18,18,18};
void DelaySMG(unsigned char t)
{
while(t--);
}
void ShowSMG_Bit(unsigned char dat, unsigned pos)
{
P0=0XFF;
SelectHC573(6); //数码管的位置
P0 = 0x01 << pos;
SelectHC573(7); //数码管的内容
P0 = dat;
}
void DisplaySMG()
{
SMG[0]=;
SMG[1]=;
SMG[2]=;
SMG[3]=;
SMG[4]=;
SMG[5]=;
SMG[6]=;
SMG[7]=;
ShowSMG_Bit(SMG_duanma[SMG[0]], 0);
DelaySMG(500);
ShowSMG_Bit(SMG_duanma[SMG[1]], 1);
DelaySMG(500);
ShowSMG_Bit(SMG_duanma[SMG[2]], 2);
DelaySMG(500);
ShowSMG_Bit(SMG_duanma[SMG[3]], 3);
DelaySMG(500);
ShowSMG_Bit(SMG_duanma[SMG[4]], 4);
DelaySMG(500);
ShowSMG_Bit(SMG_duanma[SMG[5]], 5);
DelaySMG(500);
ShowSMG_Bit(SMG_duanma[SMG[6]], 6);
DelaySMG(500);
ShowSMG_Bit(SMG_duanma[SMG[7]], 7);
DelaySMG(500);
ShowSMG_Bit(0xff, 7);
DelaySMG(500);
}
4.独立按键函数
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
void DelayK(unsigned char t)
{
while(t--);
}
void ScanKeys_Alone()
{
if(S7 == 0)
{
DelayK(100);
if(S7 == 0)
{
while(S7 == 0);
}
}
if(S6 == 0)
{
DelayK(100);
if(S6 == 0)
{
state++;
while(S6 == 0);
}
}
if(S5 == 0)
{
DelayK(100);
if(S5 == 0)
{
while(S5 == 0);
}
}
if(S4 == 0)
{
DelayK(100);
if(S4 == 0)
{
while(S4 == 0);
}
}
}
5.矩阵键盘函数
sbit R1=P3^0;
sbit R2=P3^1;
sbit R3=P3^2;
sbit R4=P3^3;
sbit C1=P4^4;
sbit C2=P4^2;
sbit C3=P3^5;
sbit C4=P3^4;
void Delay1ms(unsigned char x)
{
while(x--)
{
unsigned char i,j;
i=12;
j=169;
do
{
while(--j);
} while(--i);
}
}
void ScanKeysMulti()//ROW行/column列
{
R1=0;
R2=R3=R4=1;
C1=C2=C3=C4=1;
if(C1==0)
{
Delay1ms(5);
if(C1==0)
{
while(C1==0);
key=0;
}
}
else if(C2==0)
{
Delay1ms(5);
if(C2==0)
{
while(C2==0);
key=1;
}
}
else if(C3==0)
{
Delay1ms(5);
if(C3==0)
{
while(C3==0);
key=2;
}
}
else if(C4==0)
{
Delay1ms(5);
if(C4==0)
{
while(C4==0);
key=3;
}
}
}
6.外部中断函数
void Init_INT0()
{
IT0 = 1;//下降沿触发
EX0 = 1;//打开外部中断0
EA = 1;//打开总中断
}
void ServiceINT0() interrupt 0
{
//当触发外部中断0,会执行此函数
}
7.定时器函数
void init(void)
{
TMOD = 0x01; //<1>
TH0 = (65535 - 50000) / 256;
TL0 = (65535 - 50000) % 256;//<2>
ET0 = 1; //<3>
EA = 1; //<4>
TR0=1; //<5>
}
void Time0() interrupt 1
{
TL0 = (65535-50000) % 256;
TH0 = (65535-50000) / 256;//非重载模式,重新赋值
}
void init1(void)
{
TMOD = 0x20; //<1>
TH1 = (65535 - 50000) / 256;
TL1 = (65535 - 50000) % 256;//<2>
ET1 = 1; //<3>
EA = 1; //<4>
TR1=1; //<5>
}
void Time1() interrupt 3
{
TL1 = (65535-50000) % 256;
TH1 = (65535-50000) / 256;//非重载模式,重新赋值
}
8.串口通信函数
sfr AUXR = 0X8e;
void InitUart()
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
SCON = 0x50;
AUXR = 0x00;
ES = 1;
EA = 1;
}
void ServiceUart() interrupt 4
{
if(RI == 1)
{
RI = 0;
urdat = SBUF;
SendByteUart(urdat + 1);
}
}
void SendByteUart(uchar dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
void SendStringUart(uchar *str)
{
while(*str != '\0')
{
SendByteUart(*str);
str++;
}
}
9.PWM发生
unsigned char count = 0;
unsigned char pwm_duty = 0;
void InitTimer0()
{
TMOD = 0x01;
TH0 = (65535 - 100) / 256;
TL0 = (65535 - 100) % 256;
ET0 = 1;
EA = 1;
}
void ServiceTimer0() interrupt 1
{
TH0 = (65535 - 100) / 256;
TL0 = (65535 - 100) % 256;
count++;
if(count == pwm_duty)
{
L1 = 1;
}
else if(count == 100)
{
L1 = 0;
count = 0;
}
}
10.AT24C02
字节读
void Write_24C02(unsigned char addr, unsigned char dat)
{
IIC_Start(); //IIC总线起始信号
IIC_SendByte(0xa0); //24C02的写设备地址
IIC_WaitAck(); //等待从机应答
IIC_SendByte(addr); //内存字节字节
IIC_WaitAck(); //等待从机应答
IIC_SendByte(dat); //写入目标数据
IIC_WaitAck(); //等待从机应答
IIC_Stop(); //IIC总线停止信号
}
字节写
unsigned char Read_24C02(unsigned char addr)
{
unsigned char tmp;
//进行一个伪写操作
IIC_Start(); //IIC总线起始信号
IIC_SendByte(0xa0); //24C02写设备地址
IIC_WaitAck(); //等待从机应答
IIC_SendByte(addr); //内存自己地址
IIC_WaitAck(); //等待从机应答
//进行字节读操作
IIC_Start(); //IIC总线起始信号
IIC_SendByte(0xa1); //24C02读设备地址
IIC_WaitAck(); //等待从机应答
tmp = IIC_RecByte(); //读取目标数据
IIC_Ack(0); //产生非应答信号
IIC_Stop(); //IIC总线停止信号
return tmp;
}
11.PCF8591
unsigned char Ad_Read(unsigned char addr)
{
unsigned char temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp = IIC_RecByte();
IIC_Ack(0);
IIC_Stop();
return temp;
}
12.常用延时函数
#include "intrins.h"
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
13.读取温度函数
unsigned int T_dat=0;
void Read_Temperature()
{
unsigned char LSB,MSB ;
Init_DS18B20(); //DS18B20复位
Write_DS18B20(0xCC); //跳过ROM操作指令
Write_DS18B20(0x44); //开始温度转换
Delay(1000); //延时700ms左右,等待温度转换完成
Init_DS18B20(); //DS18B20复位
Write_DS18B20(0xCC); //跳过ROM操作指令
Write_DS18B20(0xBE); //开始读取高速暂存器
LSB = Read_DS18B20(); //读取温度数据的低8位
MSB = Read_DS18B20(); //读取温度数据的高8位
Init_DS18B20(); //DS18B20复位,停止暂存器数据读取
T_dat=MSB;//不带小数点
T_dat=(T_dat<<8)|LSB;
T_dat>>=4;
// T_dat = 0x0000;
// T_dat = MSB;
// T_dat <<= 8;
// T_dat = T_dat | LSB; //将LSB和MSB整合成为一个16位的整数
// //首先通过温度数据的高5位判断采用结果是正温度还是负温度
// if((T_dat & 0xf800) == 0x0000) //正温度的处理办法
// {
// T_dat >>= 4; //取出温度结果的整数部分
// T_dat = T_dat*10; //放大10倍,然后加上小数部分
// T_dat = T_dat + (LSB&0x0f)*0.625;
// }
}
14.2*2矩阵键盘
sbit R1=P3^2;
sbit R2=P3^3;
sbit C1=P4^4;
sbit C2=P4^2;
void DelayK(uchar t)
{
while(t--);
}
void Scankey()
{
R1=0;
R2=C1=C2=1;
if(C1==0)//S5
{
DelayK(100);
if(C1==0)
{
SelectHC138(4);
key_num=0;
while(C1==0);
}
}
if(C2==0)//S9
{
DelayK(100);
if(C2==0)
{
SelectHC138(4);
key_num=1;
while(C2==0);
}
}
R2=0;
R1=C1=C2=1;
if(C1==0)//S4
{
DelayK(100);
if(C1==0)
{
SelectHC138(4);
key_num=2;
while(C1==0);
}
}
if(C2==0)//S8
{
DelayK(100);
if(C2==0)
{
SelectHC138(4);
key_num=3;
while(C2==0);
}
}
}
15.ds1302
//注意BCD码
/*什么是BCD码?
就是用十六进制来表示十进制。什么意思?怎么理解?
例如,十六进制数0x13的值为整数19,但BCD码表示的是整数13。
*/
unsigned char code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
unsigned char code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
// unsigned char TIME[7] = {0x30, 0x50, 0x23, 0x17, 0x02, 0x06, 0x18};
//2018/周六/2.17/23:50:30
unsigned char TIME[7] = {0x14, 0x45, 0x11, 0x17, 0x03, 0x07, 0x24};
void DS1302_Config()
{
unsigned char n;
Ds1302_Single_Byte_Write(0x8E,0x00);
for (n=0; n<7; n++)
{
Ds1302_Single_Byte_Write(WRITE_RTC_ADDR[n],TIME[n]);
}
Ds1302_Single_Byte_Write(0x8E,0x80);
}
void DS1302_ReadTime()
{
unsigned char n;
for (n=0; n<7; n++)
{
TIME[n] = Ds1302_Single_Byte_Read(READ_RTC_ADDR[n]);
Ds1302_Single_Byte_Write(0x00, 0x00);//必须得加,否则数据会混乱
}
}
void DisplaySMG()
{
SMG[0]=TIME[2]/16;
SMG[1]=TIME[2]%16;
SMG[2]=SMG[5]=16;
SMG[3]=TIME[1]/16;
SMG[4]=TIME[1]%16;
SMG[6]=TIME[0]/16;
SMG[7]=TIME[0]%16;
ShowSMG_Bit(SMG_duanma[SMG[0]], 0);
Delay1ms();
ShowSMG_Bit(SMG_duanma[SMG[1]], 1);
Delay1ms();
ShowSMG_Bit(SMG_duanma[SMG[2]], 2);
Delay1ms();
ShowSMG_Bit(SMG_duanma[SMG[3]], 3);
Delay1ms();
ShowSMG_Bit(SMG_duanma[SMG[4]], 4);
Delay1ms();
ShowSMG_Bit(SMG_duanma[SMG[5]], 5);
Delay1ms();
ShowSMG_Bit(SMG_duanma[SMG[6]], 6);
Delay1ms();
ShowSMG_Bit(SMG_duanma[SMG[7]], 7);
Delay1ms();
ShowSMG_Bit(0xff, 7);
}
16.NE555
void DisplaySMG_F()
{
DisplaySMG_Bit(0, SMG_DM_NoDot[15]);
DelaySMG(500);
if(dat_f > 9999)
DisplaySMG_Bit(3, SMG_DM_NoDot[dat_f / 10000]);
DelaySMG(500);
if(dat_f > 999)
DisplaySMG_Bit(4, SMG_DM_NoDot[(dat_f / 1000) % 10]);
DelaySMG(500);
if(dat_f > 99)
DisplaySMG_Bit(5, SMG_DM_NoDot[(dat_f / 100) % 10]);
DelaySMG(500);
if(dat_f > 9)
DisplaySMG_Bit(6, SMG_DM_NoDot[(dat_f / 10) % 10]);
DelaySMG(500);
DisplaySMG_Bit(7, SMG_DM_NoDot[dat_f % 10]);
DelaySMG(500);
}
void Init_Timer()
{
TH0 = 0xff;
TL0 = 0xff;
TH1 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
TMOD = 0x16; //定时器1用方式1,定时;定时器0用方式2,计数
ET0 = 1;
ET1 = 1;
EA = 1;
TR0 = 1;
TR1 = 1;
}
void Service_T0() interrupt 1
{
count_f++;
}
void Service_T1() interrupt 3
{
TH1 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
count_t++;
if(count_t == 20)
{
dat_f = count_f;
count_f = 0;
count_t = 0;
}
}