单片机C语言后程序集文档格式.docx
《单片机C语言后程序集文档格式.docx》由会员分享,可在线阅读,更多相关《单片机C语言后程序集文档格式.docx(179页珍藏版)》请在冰豆网上搜索。
//定义字符数组显示数字
/*****************************************************
函数功能:
延时1ms
(3j+2)*i=(3×
33+2)×
10=1010(微秒),可以认为是1毫秒
***************************************************/
voiddelay1ms()
{
unsignedchari,j;
for(i=0;
i<
10;
i++)
for(j=0;
j<
33;
j++)
;
}
延时若干毫秒
入口参数:
n
voiddelaynms(unsignedcharn)
{
unsignedchari;
n;
delay1ms();
/*******************************************************************************
以下是对液晶模块的操作程序
********************************************************************************/
判断液晶模块的忙碌状态
返回值:
result。
result=1,忙碌;
result=0,不忙
unsignedcharBusyTest(void)
bitresult;
RS=0;
//根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1;
//E=1,才允许读写
_nop_();
//空操作
//空操作四个机器周期,给硬件反应时间
result=BF;
//将忙碌标志电平赋给result
E=0;
//将E恢复低电平
returnresult;
将模式设置指令或显示地址写入液晶模块
dictate
voidWriteInstruction(unsignedchardictate)
{
while(BusyTest()==1);
//如果忙就等待
//根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
//E置低电平(根据表8-6,写指令时,E为高脉冲,
//就是让E从0到1发生正跳变,所以应先置"
0"
//空操作两个机器周期,给硬件反应时间
P0=dictate;
//将数据送入P0口,即写入指令或地址
//空操作四个机器周期,给硬件反应时间
//E置高电平
//当E由高电平跳变成低电平时,液晶模块开始执行命令
指定字符显示的实际地址
x
voidWriteAddress(unsignedcharx)
WriteInstruction(x|0x80);
//显示位置的确定方法规定为"
80H+地址码x"
将数据(字符的标准ASCII码)写入液晶模块
y(为字符常量)
voidWriteData(unsignedchary)
RS=1;
//RS为高电平,RW为低电平时,可以写入数据
P0=y;
//将数据送入P0口,即将数据写入液晶模块
_nop_();
对LCD的显示模式进行初始化设置
voidLcdInitiate(void)
delaynms(15);
//延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38);
//显示模式设置:
16×
2显示,5×
7点阵,8位数据接口
delaynms(5);
//延时5ms ,给硬件一点反应时间
//连续三次,确保初始化成功
WriteInstruction(0x0c);
显示开,无光标,光标不闪烁
WriteInstruction(0x06);
光标右移,字符不移
WriteInstruction(0x01);
//清屏幕指令,将以前的显示内容清除
/***************************************************
函数功能:
显示小时
voidDisplay(unsignedcharx)
i=x/10;
//取整运算,求得十位数字
j=x%10;
//取余运算,求得各位数字
WriteAddress(0x44);
//写显示地址,将十位数字显示在第2行第5列
WriteData(digit[i]);
//将十位数字的字符常量写入LCD
WriteData(digit[j]);
//将个位数字的字符常量写入LCD
以下是对AT24C02的读写操作程序
/***************************************************
开始数据传送
voidstart()
//开始位
SDA=1;
//SDA初始化为高电平“1”
SCL=1;
//开始数据传送时,要求SCL为高电平“1”
//等待一个机器周期
SDA=0;
//SDA的下降沿被认为是开始信号
SCL=0;
//SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
}
结束数据传送
voidstop()
//停止位
//SDA初始化为低电平“0”
//结束数据传送时,要求SCL为高电平“1”
//SDA的上升沿被认为是结束信号
从AT24Cxx读取数据
出口参数:
unsignedcharReadData()
//从AT24Cxx移入数据到MCU
unsignedcharx;
//储存从AT24Cxx中读出的数据
for(i=0;
i<
8;
i++)
SCL=1;
//SCL置为高电平
x<
<
=1;
//将x中的各二进位向左移一位
x|=(unsignedchar)SDA;
//将SDA上的数据通过按位“或“运算存入x中
SCL=0;
//在SCL的下降沿读出数据
return(x);
//将读取的数据返回
向AT24Cxx的当前地址写入数据
y(储存待写入的数据)
//在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0
bitWriteCurrent(unsignedchary)
bitack_bit;
//储存应答位
i++)//循环移入8个位
SDA=(bit)(y&
0x80);
//通过按位“与”运算将最高位数据送到S
//因为传送时高位在前,低位在后
//等待一个机器周期
//在SCL的上升沿将数据写入AT24Cxx
//将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲
y<
=1;
//将y中的各二进位向左移一位
//发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,
//以让SDA线转由接收设备(AT24Cxx)控制
//根据上述规定,SCL应为高电平
ack_bit=SDA;
//接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节
//若送高电平,表示没有接收到,传送异常
returnack_bit;
//返回AT24Cxx应答位
向AT24Cxx中的指定地址写入数据
add(储存指定的地址);
dat(储存待写入的数据)
voidWriteSet(unsignedcharadd,unsignedchardat)
//在指定地址addr处写入数据WriteCurrent
start();
//开始数据传递
WriteCurrent(OP_WRITE);
//选择要操作的AT24Cxx芯片,并告知要对其写入数据
WriteCurrent(add);
//写入指定地址
WriteCurrent(dat);
//向当前地址(上面指定的地址)写入数据
stop();
//停止数据传递
delaynms(4);
//1个字节的写入周期为1ms,最好延时1ms以上
从AT24Cxx中的当前地址读取数据
x(储存读出的数据)
unsignedcharReadCurrent()
WriteCurrent(OP_READ);
//选择要操作的AT24Cxx芯片,并告知要读其数据
x=ReadData();
//将读取的数据存入x
returnx;
//返回读取的数据
从AT24Cxx中的指定地址读取数据
set_add
x
unsignedcharReadSet(unsignedcharset_add)
//在指定地址读取
WriteCurrent(set_add);
return(ReadCurrent());
//从指定地址读出数据并返回
/*********************************************************************
主函数
***********************************************************************/
voidmain(void)
unsignedcharsum;
//储存计数值
//储存从AT24C02读出的值
LcdInitiate();
//调用LCD初始化函数
sum=0;
//将计数值初始化为0
while
(1)//无限循环
if(S==0)//如果该键被按下
{
delaynms(80);
//软件消抖,延时80ms
if(S==0)//确实该键被按下
sum++;
//计件值加1
if(sum==99)//如果计满99
sum=0;
//清0,重新开始计数
}
WriteSet(0x01,sum);
//将计件值写入AT24C02中的指定地址"
0x01"
x=ReadSet(0x01);
//从AT24C02中读出计件值
Display(x);
//将计件值用1602LCD显示
//实例70:
对I2C总线上挂接多个AT24C02的读写操作
#include<
//包含51单片机寄存器定义的头文件
#defineOP_READ10xa1//器件1地址以及读取操作,0xa1即为10100001B
#defineOP_WRITE10xa0//器件1地址以及写入操作,0xa1即为10100000B
#defineOP_READ20xaf//器件2地址以及读取操作,0xa1即为10101111B
#defineOP_WRITE20xae//器件2地址以及写入操作,0xa1即为10101110B
//SDA的上升沿被认为是结束信号
unsignedcharReadData(