用C语言编写程序,利用按键0-255,并且显示在LCD1206 Allegro,pads,PCB电路板设计,硬件及芯片资料分享—小北设计

用C语言编写程序,利用按键0-255,并且显示在LCD1206

51单片机 by AD,Allegro,pads,PCB设计,电源模块,硬件,stm32,嵌入式,单片机,小北设计
/*用C语言编写程序,利用按键0-255,并且显示在LCD1206,每过一秒将这个变化的数写入板上AT24C02
内部。单片机先从AT24C02中将原来写入的数读取出来,接着此数继续变化并显示在液晶屏上。
anjian增加1,qingling清零。
2.起始信号和终止信号

        由I2C总线协议,总线上数据信号传送由起始信号(S)开始、由终止信号(P)结束。起始信号和终止信号都由主机发出,在起始信号产生后,总线就处于占用状态;在终止信号产生后,总线就处于空闲状态。

(1)起始信号(S)。在SCL线为高期间,SDA线由高电平向低电平的变化表示起始信号,只有在起始信号以后,其他命令才有效。

(2)终止信号(P)。在SCL线为高期间,SDA线由低电平向高电平的变化表示终止信号。随着终止信号出现,所有外部操作都结束。

3.I2C总线上数据传送的应答

        I2C总线数据传送时,传送字节数没有限制,但每字节须为8位长。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随1位应答位(即1帧共有9位)

        I2C总线在传送每1字节数据后都须有应答信号A,应答信号在第9个时钟位上出现,与应答信号对应的时钟信号由主器件产生。这时发方须在这一时钟位上使SDA线处于高电平状态,以便收方在这一位上送出低电平应答信号A。

        由于某种原因收方不对主器件寻址信号应答时,例如收方正在进行其他处理而无法接收总线上数据时,必须释放总线,将数据线置为高电平,而由主器件产生一个终止信号以结束总线的数据传送。

        当主器件接收来自从机数据时,接收到最后一个数据字节后,须给从器件发送一个非应答信号(A),使从机释放数据总线,以便主机发送一终止信号,从而结束数据传送。*
通过网盘分享的文件:IIC24c02——1602
链接: https://pan.baidu.com/s/17kVc9FTbkmI1aF-mYxNKdw 提取码: rix4
*/
#include <reg52.h>
#include <intrins.h>
 
#define uchar unsigned char
#define uint unsigned int

uchar code dis_table[] = "0123456789";

sbit anjian = P1^6; //定义增加按键
sbit qingling=P1^7; //定义清零按键
sbit lcden = P2^2; //定义lcd的E端口
sbit lcdrw = P2^1; //定义lcd的rw端口
sbit lcdrs = P2^0; //定义lcd的rs端口
sbit SCL = P1^0; //定义SCL时钟线端口
sbit SDA = P1^1; //定义SDA数据线端口
 
//IIC延时函数,延时必须精确,否则无法准确传输
void Delay4us()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
 
void DelayMs(uint ms)
{
uint i;
while(ms--)
{
for(i = 110;i > 0;i--)
{
;
}
}
}
 
//往LCD1602中写命令
void Write_Com(uchar com)
{
lcdrs = 0; //lcdrs为低电平时,选择指令寄存器
P0 = com;
DelayMs(5);
lcden = 1;
DelayMs(5);
lcden = 0;
}
 
//往LCD1602中写数据
void Write_data(uchar date)
{
lcdrs = 1; //lcdrs为高电平时,选择数据寄存器
P0 = date;
DelayMs(5);
lcden = 1; //当lcden由高电平变为低电平时,LCD1602开始执行命令
DelayMs(5);
lcden = 0;
}
 
//LCD1602的初始化函数
void init()
{
lcdrw = 0; //lcdrw高电平时为读操作,低电平时为写操作 
lcden = 0;
Write_Com(0x38);
Write_Com(0x0c);
Write_Com(0x06);
Write_Com(0x01);
}
 
//IIC初始化函数
void IIC_init()
{
SCL = 1;
Delay4us();
SDA = 1;
Delay4us();
}
 
//IIC起始信号函数
void IIC_start()
{
//当SCL信号为高电平期间,SDA出现下降沿时,就是起始信号
SDA = 1;
Delay4us();
SCL = 1;
Delay4us();
SDA = 0;
Delay4us();
}
 
//IIC应答信号函数
void IIC_respons()
{
//在SCL高电平期间,讲SDA线拉低,产生应答信号,表明数据传输成功
uchar i = 0;
SCL = 1;
Delay4us();
while(SDA == 1 && (i < 255))
{
i ++;
}
SCL = 0;
Delay4us();
}
 
//定义停止信号函数
void IIC_stop()
{
//当SCL在高电平时,SDA产生一个上升沿信号为停止信号
SDA = 0;
Delay4us();
SCL = 1;
Delay4us();
SDA = 1;
Delay4us();
}
 
//写一个字节函数
void IIC_writebyte(uchar date)
{
uchar i,temp;
temp = date;
for(i = 0;i < 8;i++)
{
temp = temp << 1; //溢出的一位自动保存到寄存器CY中
SCL = 0;
Delay4us();
SDA = CY;
Delay4us();
SCL = 1;
Delay4us();
}
SCL = 0;
Delay4us();
SCL = 1;
Delay4us();
}
 
//IIC读一个字节函数
uchar IIC_readbyte()
{
uchar i,Data;
SCL = 0;
Delay4us();
SDA = 1;
for(i = 0;i < 8;i++)
{
SCL = 1;
Delay4us();
SDA = 1;
Data = (Data << 1) | SDA;
SCL = 0;
Delay4us();
}
Delay4us();
return Data;
}
 
//往AT24C02的地址中写数据
void Write_add(uchar date,uchar address)
{
IIC_start();
IIC_writebyte(0xa0);
IIC_respons();
IIC_writebyte(address);
IIC_respons();
IIC_writebyte(date);
IIC_respons();
IIC_stop();
}
 
//从AT24C02的地址中读数据
uchar Read_add(uchar address)
{
uchar date;
IIC_start();
IIC_writebyte(0xa0); //AT24C02的地址为0xa0时是写入
IIC_respons();
IIC_writebyte(address);
IIC_respons();
IIC_start();
IIC_writebyte(0xa1); //AT24C02的地址为0xa1时是读
IIC_respons();
date = IIC_readbyte(); //将数据读取到date中
IIC_stop(); //停止信号
return date;
}
 
//显示数字函数
void display(uchar date)
{
Write_Com(0x80);
Write_data(dis_table[date/100]); //显示百位
Write_data(dis_table[date%100/10]); //显示十位
Write_data(dis_table[date%10]); //显示个位
}
 
void main()
{
uchar num,NUM;
init();
IIC_init();

while(1)
{
if(anjian  == 0)//判断按键是否按下
{
DelayMs(10);
if(anjian == 0)
{
num = Read_add(0x00);
num ++;
Write_add(num,0x00); //将num写入到0x00地址处
}
while(anjian == 0);//等待按键是否松开
}
if(qingling  == 0)//判断按键是否按下
{
DelayMs(10);
if(qingling == 0)
{
num =0;
Write_add(num,0x00); //将num写入到0x00地址处
}
while(qingling == 0);//等待按键是否松开
}

NUM = Read_add(0x00); //将0x00处的数据读取出来
display(NUM);
}

}

51单片机1602

    Message:

    Name:
    Email:
    Content:
PgUP ...
Allegro,pads,PCB电路板设计,电源模块件及stm32,嵌入式,单片机资料分享—小北设计