lcd1602流程图_lcd1602显示流程
高分求单片机定时器程序
it dula = P2^6;STC89C52的板写的,通过DS1602实现,并包括了矩阵键盘的功能
lcd1602流程图_lcd1602显示流程
lcd1602流程图_lcd1602显示流程
P0=com;
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="ME-400-A clock";
uchar code table1[]=" --:--:-- ";
uchar code table2[]="ALL:00:00:-- ";
uchar code table3[]=" ";
uchar clk_time[3]; //秒,分,时寄存器初始值
it T_RST=P2^2;//ds1302-5
it T_IO=P2^3;//ds1302-6
it T_CLK=P2^4;//ds1302-7
it en=P2^5; //参照LCD1602说明档,使能信号
it rw=P2^6; //。。。。。。。。,读写信号端(输入高电频时为读,低电为写)
it rs=P2^7; //。。。。。。。。,数据/命令选择端(H/L)
it led=P1^0;
it dula=P1^1;
it wela=P1^2;
it ACC0=ACC^0;
it ACC7=ACC^7;
it up=P3^3;
it down=P3^4;
it set=P3^2;
it did=P1^4;
uchar num,clock_ss,clock_sg,clock_fs,clock_fg,clock_ms,clock_mg,b,clock_s,clock_g;
char hour,mie,sei,c,nhour,nmie,shour,ie;
/DS1302:写入作(上升沿)/
void write_byte(uchar da)
ACC=da;
for(i=8;i>0;i--)
{T_IO=ACC0;
/T_CLK=0;
T_CLK=1;
ACC=ACC>>1;
}}
/DS1302:读取作(下降沿)/
uchar read_byte(void)
for(i=0;i<8;i++)
{ACC=ACC>>1;
T_CLK = 1;
T_CLK = 0;
ACC7 = T_IO;
}return(ACC);
}/DS1302:写入数据(先送地址,再写数据)/
void write_1302(uchar addr,uchar da)
{T_RST=0; //停止工作
T_CLK=0; //只有在CLK为低电平时,才能将RST置为高电平,然后才能传输数据
write_byte(addr); //写入地址
write_byte(da);
T_RST=0;
T_CLK=1;
}/DS1302:读取数据(先送地址,再读数据)/
uchar read_1302(uchar addr)
{uchar temp;
T_RST=0; //停止工作
T_CLK=0;
T_RST=1; //重新工作
write_byte(addr); //写入地址
temp=read_byte();
T_RST=0;
T_CLK=1; //停止工作
return(temp);
}/延时程序=a1ms/
void delay(uint z)
{uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}void fn()
{did=0;
delay(120);
delay(120);
did=0;
delay(120);
delay(120);
did=0;
delay(120);
delay(120);
did=0;
delay(320);
delay(400);
}void write_com(uchar com)
{led=1;
wela=1;
P0=0xff;
delay(1);
led=0;
wela=0;
P0=0x00;
dula=1;
delay(1);
dula=0;
rs=0;
delay(5);
en=1;
delay(5);
en=0;
}void write_data(uchar date)
{led=1;
wela=1;
P0=0xff;
delay(1);
led=0;
wela=0;
P0=0x00;
dula=1;
delay(1);
dula=0;
rs=1;
P0=date;
delay(5);
en=1;
delay(5);
en=0;
}void morning()
{ shour=clock_ss10+clock_sg;
ie=clock_fs10+clock_fg;
if(b==0)
{if(nhour==shour)
{if(ie>=nmie)
{fn();
}}
}}
void init()
{b=0;
P0=0xff;
delay(5);
led=1;
delay(5);
P0=0xff;
led=0;
dula=0;
wela=1;
delay(5);
wela=0;//关ME-400开发板数码管
nhour=0;
nmie=0;
rw=0;
en=0;
write_com(0x38);//设置液晶
write_com(0x0c);//设光标等
write_com(0x06);//写一个字符地址指针加1且光标加1
write_com(0x01);//清屏
write_com(0x80);//设置s地址指针
{if(b==0)
{clock_ms=clk_time[0]/ 16; clock_mg=clk_time[0]%16;
led=0;
clock_fs=clk_time[1]/ 16; clock_fg=clk_time[1]%16;
led=0;
clock_ss=clk_time[2]/ 16; clock_sg=clk_time[2]%16;
write_com(0x80+0x44);
write_data(0x30+clock_ss);
write_com(0x80+0x45);
write_data(0x30+clock_sg);
write_com(0x80+0x47);
write_data(0x30+clock_fs);
write_com(0x80+0x48);
write_data(0x30+clock_fg);
write_com(0x80+0x4a);
write_data(0x30+clock_ms);
write_com(0x80+0x4b);
write_data(0x30+clock_mg);
}if(b!=0)
{clock_s=date/ 10; clock_g=date%10;
write_com(0x80+0x40+add);
write_data(0x30+clock_s);
write_data(0x30+clock_g);
}}
void key()
{uchar clock_s1, clock_s2, clock_f1, clock_f2;
rw=0;
if(set==0)
{delay(10);
if(set==0)
{did=0;
delay(10); did=1;
b++;
}while(!set);
if(b==1)
{hour=clock_ss10+clock_sg;
mie=clock_fs10+clock_fg;
write_com(0x80+0x45);
write_com(0x0f);
}if(b==2)
{write_com(0x80+0x48);
}if(b==3)
{write_com(0x80+0x40);
for(num=0;num<13;num++)
{write_data(table2[num]);
}write_com(0x80+0x45); display(4,nhour);write_com(0x80+0x45);
}if(b==4)
{write_com(0x80+0x48);
display(7,nmie); write_com(0x80+0x48);
}if(b==5)
{write_com(0x80+0x40);
for(num=0;num<4;num++)
{write_data(table3[num]);
}write_com(0x80+0x45);
write_com(0x0c);
b=0;
clock_s1=hour/10;//十进制转十六进制
clock_s2=hour%10;//十进制转十六进制
clock_s1=clock_s1&0xff;//十进制转十六进制
clock_s2=clock_s2&0xff;//十进制转十六进制
clock_s1<<=4;//十进制转十六进制
clock_s1=clock_s1|clock_s2;//十进制转十六进制
clock_f1=mie/10;//十进制转十六进制
clock_f2=mie%10;//十进制转十六进制
clock_f1=clock_f1&0xff; //全1出1 与运算
clock_f2=clock_f2&0xff;//十进制转十六进制
clock_f1<<=4;//十进制转十六进制
clock_f1=clock_f1|clock_f2;//十进制转十六进制
write_1302(0x8e,0x00); //WP=0 写作
write_1302(0x80,0x00);//写秒
write_1302(0x82,clock_f1);//写分
write_1302(0x84,clock_s1);//写时
write_1302(0x86,0x14);//写日
write_1302(0x88,0x02);//写月
write_1302(0x8a,0x06);//写星期
write_1302(0x8c,0x09);
write_1302(0x8e,0x80); //WP=1 写保护
}}
{if(up==0)
{delay(10);
if(up==0)
{did=0;
delay(10);
while(!up);
if(b==1)
{hour++;
if(hour>=24)
{delay(1);
hour=0;
}display(4,hour);
write_com(0x80+0x45);
}if(b==2)
{mie++;
if(mie>=60)
{mie=0;
}display(7,mie);
write_com(0x80+0x48);
}if(b==3)
{nhour++;
if(nhour>=24)
{delay(1);
nhour=0;
}display(4,nhour);
write_com(0x80+0x45);
}if(b==4)
{nmie++;
if(nmie>=60)
{nmie=0;
}display(7,nmie);
write_com(0x80+0x48);
}}
}if(down==0)
{delay(10);
if(down==0)
{did=0;
delay(10);
while(!down);
if(b==1)
{hour--;
if(hour<0)
{hour=23;
}display(4,hour);
write_com(0x80+0x45);
}if(b==2)
{mie--;
if(mie<0)
{mie=59;
}display(7,mie);
write_com(0x80+0x48);
}if(b==3)
{nhour--;
if(nhour<0)
{nhour=23;
}display(4,nhour);
write_com(0x80+0x45);
}if(b==4)
{nmie--;
if(nmie<0)
{nmie=59;
}display(7,nmie);
write_com(0x80+0x48);
}}
}}
}void main()
{uchar temp=0x80;
uchar i;
init();
for(num=0;num<14;num++)
{write_data(table[num]);
delay(100);
}write_com(0x80+0x40); // 设置数据地址指针为0X40
for(num=0;num<15;num++)
{write_data(table1[num]);
}/for(num=0;num<16;num++)
{write_com(0x18);
delay(20);
}/
write_1302(0x8e,0x00);
write_1302(0x90,0xa4);
write_1302(0x8e,0x80);
{if(b==0)
{ temp=0x81;
for(i=0;i<3;i++)
{clk_time[i]=read_1302(temp);
temp+=2;
}display(0x4b,0x00);
}morning();
key();
}}
lcd1602显示流程图
{uchar i;lcd1602显示流程图:
T_RST=1; //重新工作LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。
不同厂家生产的LCD1602芯片可能有所不同,但使用方法都是一样的。为了降低成本,绝大多数制造商都直接将片做到板子上。
扩展资料:
LCD1602与单片机的连接有两种方式,一种是直接控制方式,另一种是所谓的间接控制方式。它们的区别只是所用的数据线的数量不同,其他都一样。
1、直接控制方式
LCD1602的8根数据线和3根控制线E,RS和R/W与单片机相连后即可正常工作。一般应用中只须往LCD1602中写入命令和数据,因此,可将LCD1602的R/W读/写选择控制端直接接地,这样可节省1根数据线。
VO引脚是液晶对比度调试端,通常连接一个10kΩ的电位器即可实现对比度的调整{unsigned char count;;也可采用将一个适当大小的电阻从该引脚接地的方法进行调整,不过电阻的大小应通过调试决定。
2、间接控制方式
间接控制方式也称为四线制工作方式,是利用HD44780所具有的4位数据总线的功能,将电路接口简化的一种方式。为了减少接线数量,只采用引脚DB4~DB7与单片机进行通信,先传数据或命令的高4位,再传低4位。
采用四线并口通信,可以减少对微I/O的需求,当设计产品过程中单片机的I/O资源紧张时,可以考虑使用此方法。
参考资料来源:
基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数字温度计程序,用C语言编程
while(1)#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
it wela = P2^7;
it RS = P3^5;
it LCDEN = P3^4;
void delayUs()
{_nop_();
}void delayMs(uint a)
{uint i, j;
for(i = a; i > 0; i--)
for(j = 100; j > 0; j--);
}void writeComm(uchar comm)
{RS = 0;
P0 = comm;
LCDEN = 1;
delayUs();
LCDEN = 0;
delayMs(1);
}//写数据:RS=1, RW=0;
void writeData(uchar dat)
{RS = 1;
P0 = dat;
LCDEN = 1;
delayUs();
LCDEN = 0;
delayMs(1);
}void init()
{dula = wela = 0;
writeComm(0x38);
writeComm(0x0c);
writeComm(0x06);
writeComm(0x01);
}void writeString(uchar str, uchar length)
for(i = 0; i < length; i++)
{writeData(str[i]);
}}
///DS18B20/
it ds = P2^2;
void dsInit()
{unsigned int i;
ds = 0;
i = 100;
while(i>0) i--;
ds = 1;
i = 4;
while(i>0) i--;
}void dsWait()
{unsigned int i;
while(ds);
while(~ds);
i = 4;
while(i > 0) i--;
}bit readBit()
{unsigned int i;
bit b;
ds = 0;
i++;
ds = 1;
i++; i++;
b = ds;
i = 8;
while(i>0) i--;
return b;
}unsigned char readByte()
{unsigned int i;
unsigned char j, dat;
dat = 0;
for(i=0; i<8; i++)
{j = readBit();
dat = (j << 7) | (dat >> 1);
}return dat;
}void writeByte(unsigned char dat)
{unsigned int i;
unsigned char j;
bit b;
for(j = 0; j < 8; j++)
{b = dat & 0x01;
dat >>= 1;
if(b)
{ds = 0; i++; i++;
ds = 1;
i = 8; while(i>0) i--;
}else
{ds = 0;
i = 8; while(i>0) i--;
ds = 1;
i++; i++;
}}
}void sendChangeCmd()
{dsInit();
dsWait();
delayMs(1);
writeByte(0xcc);
writeByte(0x44);
}void sendReadCmd()
{dsInit();
dsWait();
delayMs(1);
writeByte(0xcc);
writeByte(0xbe);
}int getTmpValue()
{unsigned int tmpvalue;
int value;
float t;
unsigned char low, high;
sendReadCmd();
low = readByte();
high = readByte();
tmpvalue = high;
tmpvalue <<= 8;
tmpvalue |= low;
value = tmpvalue;
t = value 0.0625;
value = t 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5
return valdelayNOP();ue;
}void display(int v)
unsigned char datas[] = {0, 0, 0, 0, 0};
unsigned int tmp = abs(v);
datas[0] = tmp / 10000;
datas[1] = tmp % 10000 / 1000;
datas[2] = tmp % 1000 / 100;
datas[3] = tmp % 100 / 10;
datas[4] = tmp % 10;
writeComm(0xc0+3);
if(v < 0)
{writeString("- ", 2);
}else
{writeString("+ ", 2);
}if(datas[0] != 0)
{writeData('0'+datas[0]);
{writeData('0'+datas[count]);
if(count == 2)
{writeData('.');
}}
}///DS18B20/
void main()
{uchar table[] = " xianzaiwendu:";
init();
writeComm(0x80);
writeString(table, 16);
{delayMs(1000); //温度转换时间需要750ms以上
writeComm(0xc0);
display(getTmpValue());
}}
proteus用什么代替摄像头
sendChangeCmd(/);proteus用代替摄像头。
//接受到3,发送字符'L'给计算机就用滑动变阻器代替了,可是添加程序运行时,LCD1602没有显示。要怎么修改TCS3200输出的是随不同颜色和强度对应不同频率,占空比50%的矩形波。
ProteusVisualDesigner将世界的ProteusVSM仿真与易于使用的流程图编辑器和虚拟硬件库相结合,为Arduino和RaspberryPi提供真正集成且直观。
3D面部图象识别系统和指纹识别系统_3d人脸识别和指纹识别哪个安全
void1.硬件设计方案
=0;本系统主要使用了指纹模块,MicroSD卡读写模块,PCF8563模块,蜂鸣器模块,矩阵按键模块,lcd1602,和STC90C516RD
系统框图如下:
1)指纹模块
采用FPM10A光学指纹模块。FPM10A光学指纹模块是经典的光学指纹模块,性能稳定,应用范围广,可选用TTL串口或USB接口,可使用51单片机
2)存储模块
方案一:采用EEPROM模块
EEPROM模块简单,采用iic通讯,但存储量小,寿命有限,没有锻炼价值,所以弃用。
方案二:采用MicroSD卡读写模块
MicroSD读写卡模块,采用SPI协议通讯,这个通讯协议还没接触过,且比EEPROM存储量大,使用普遍,所以本系统采用MicroSD读写卡模块.
3)实时时钟
采用PCF8563模块。该芯片比DS1302更为稳定,走时更准,功耗。
2.程序设计和设计思路
程序流程图如下:
该项目实现签到,添加指if(b!=0)纹,删除单个指纹,搜索指纹,和清空指纹等作。
签到是搜索该指纹ID后,存储时间戳到MicroSD对应的扇区中,且蜂鸣器会响视为签到成功。功能选择使用4个按键,用循环向下选择的方式。添加指纹中,首先先获得指纹图像1,存储到buffer1中,再获得指纹图像2,存储到buffer2中,再写命令使buffer1和buffer2形成特征模板,再存入特定的ID中,初始化ID对应的MicroSD扇区。删除单个指纹和搜索指纹中,我使用两种方法找到该指纹的ID,一种是按键输入,还是用四个按键循环,二种是通过搜索指纹找到该指纹的ID,在按键指纹中需要判断该ID是否存在,通过在对应MicroSD卡设置标志位的方法,确定该ID是否在用,该标志位与指纹模块同步。搜索指纹找到ID后显示,对应ID的签到时间。清空指纹是清空指纹模块和对应的MicroSD卡扇区。
电脑与AT89S51单片机串口通信的51端程序
void这是C语言的,试试吧,
did=1;#include
#include
#define
uchar
unsigned
char
#define
uint
unsigned
int
it
LCD_RS
=P2}void display(uchar add,date)^0;
it
LCD_RW
=P2^1;
it
LCD_EN
=P2^2;
#define
{_nop_();_nop_();_nop_();_nop_();};
uchar
data
RXDdata[
]=
{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20
};
uchar
temp,buf,m,count;
bit
playflag=0;
uchar
code
cdis1[
]=
{"
SERILA
TRANFER
"};
uchar
code
cdis2[
]=
{"
"};
/
延时子程序
/
delay1(uint
ms)
{uchar
k;
while(ms--)
{for(k
k<
120;
k++);
}}
//
/
/检查LCD忙状态
/lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。
/
//
bit
lcd_busy()
{bit
result;
LCD_RS
LCD_RW
=1;
LCD_EN
=1;
result
=(bit)(P0&0x80);
LCD_EN
return(result);
}//
/
/写指令数据到LCD
/RS=L,RW=L,E=高脉冲,D0-D7=指令码。
/
//
lcd_wcmd(uchar
cmd)
{while(lcd_busy());
LCD_RS
LCD_RW
LCD_EN
_nop_();
_nop_();
P0
=cmd;
LCD_EN
=1;
LCD_EN
}//
/
/写显示数据到LCD
/RS=H,RW=L,E=高脉冲,D0-D7=数据。
/
//
lcd_wdat(uchar
dat)
{while(lcd_busy());
LCD_RS
=1;
LCD_RW
LCD_EN
P0
=dat;
LCD_EN
=1;
LCD_EN
}//
/
/
LCD初始化设定
/
//
lcd_init()
{delay1(15);
lcd_wcmd(0x01);
//清除LCD的显示内容
lcd_wcmd(0x38);
//162显示,57点阵,8位数据
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x0c);
//开显示,显示光标,光标闪烁
delay1(5);
lcd_wcmd(0x01);
//清除LCD的显示内容
delay1(5);
}//
/
/
设定显示位置
/
//
lcd_(uchar
)
{lcd_wcmd(
|0x80);
//数据指针=80+地址变量
}/
发送数据函数
/
senddata(uchar
dat)
{SBUF
=dat;
while(!TI);
TI
}/
串行中断服务函数
/
serial()
interrupt
4{
ES
//关闭串行中断
RI
//清除串行接受标志位
buf
=SBUF;
//从串口缓冲区取得数据
playflag=1;
switch(buf)
{case
0x31:
senddata('W');break;
//接受到1,发送字符'W'给计算机
case
0x32:
senddata('I');break;
//接受到2,发送字符'I'给计算机
case
0x33:
senddata('L');break;
case
0x34:
senddata('L');break;
//接受到4,发送字符'L'给计算机
case
0x35:
senddata('A');break;
//接受到5,发送字符'A'给计算机
case
0x36:
senddata('R');break;
//接受到5,发送字符'R'给计算机
default:
senddata(buf);break;
//接受到其它数据,将其发送给计算机
}if(buf!=0x0D)
{if(buf!=0x0A)
{temp
=buf;
if(count<16)
{RXDdata[count]=temp;
count++;
}}
}ES
=1;
//允许串口中断
}/
数据显示函数
/
play()
{if(playflag)
{lcd_(0x40);
//设置位置为第二行
for(m=0;m<16;m++)
lcd_wdat(cdis2[m]);
//清LCD1602第二行
for(m=0;m<16;m++)
{lcd_(0x40+m);
//设置显示位置为第二行
lcd_wdat(RXDdata[m]);
//显示字符
}playflag=0;
count=0x00;
for(m=0;m<16;m++)
RXDdata[m]=0x20;
//清显存单元
}}
/
主函数
/
main(void)
{P0
=0xff;
P2
=0xff;
SCON=0x50;
//设定串口工作方式
PCON=0x00;
//波特率不倍增
TMOD=0x20;
//定时器1工作于8位自动重载模式,
用于产生波特率
EA=1;
ES
=1;
//允许串口中断
TL1=0xfd;
TH1=0xfd;
//波特率9600
TR1=1;
lcd_init();
lcd_(0x00);
//设置显示位置为行
for(m=0;m<16;m++)
lcd_wdat(cdis1[m]);
//显示字符
lcd_(0x40);
//设置显示位置为第二行
for(m=0;m<16;m++)
lcd_wdat(cdis2[m]);
//显示字符
{play();
}}
//
/打开串口调试程序,将波特率设置为9600,无奇偶校验
晶振11.0592MHz,发送和接收使用的格式相同,如都使用
字符型格式,在发送框输入 hello,I Love MCU ,在接
收框中同样可以看到相同字符,说明设置和通信正确
#include
/主程序/
void main (void)
{SCON = 0x50; / SCON: 模式 1, 8-bit UART, 使能接收 /
TMOD |= 0x20; / TMOD: timer 1, mode 2, 8-bit reload /
TH1 = 0xFD; / TH1: reload value for 9600 baud @ 11.0592MHz /
TR1 = 1; / TR1: timer 1 run /
EA = 1; /打开总中断/
ES = 1; /打开串口中断/
while (1) /主循环不做任何动作/
{}
}void UART_SER (void) interrupt 4 //串行中断服务程序
{unsigned char Temp; //定义临时变量
if(RI) //判断是接收中断产生
{RI=0; //标志位清零
Temp=SBUF; //读入缓冲区的值
P1=Temp; //把值输出到P1口,用于观察
SBUF=Temp; //把接收到的值再发回电脑端
}if(TI) //如果是发送标志位,清零
TI=0;
}参考一下吧~
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。