C51实验程序(流水灯、矩阵键盘、动态显示、串行口、1602液晶)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for(i=7;i>0;i--)//隔灯右移次数视情况而定
{P2=_cror_(P2,2);
DelayMS(500);}
}
}
}
#include <reg52.h>(矩阵键盘)
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE[]=
case 1:putc_to_serialPort('A');
LED1=~LED1,LED2=1;break;
case 2:putc_to_serialPort('B');
LED2=~LED2,LED1=1;break;
case 3:putc_to_serialPort('C');
LED1=~LED1,LED2=~LED2;break;
{RI=0;
switch(SBUF)//根据收到的数据决定模式
{ case 'A':LED1=~LED1,LED2=1;break;
case 'B':LED2=~LED2,LED1=1;break;
case 'C': LED1=~LED1,LED2=~LED2;break;
}
}
else
LED1=LED2=1;
while(X--)
{for(t=120;t>0;t--);}
}
void main()//主函数
{uchar i;
P2=0x01;
DelayMS(500);
//此处延时为了从最低位开始点亮可见
while(1)
{
if(key==0)//若按键口为高电平
{
for(i=7;i>0;i--)//循环左移7次
DelayMS(10);
}}
#include<reg52.h>(LCD1602)
#define uint unsigned int
#define uchar unsigned char
uchar code table[]="Zhoubo ";
uchar code table1[]="12311207";
P0=com; //向P0口输入命令
DelayMS(5); //延时
lcden=1; //打开LCD使能
/*DelayMS(5); //一个高脉冲*/
lcden=0; //关闭LCD使能
}
void write_data(uchar date)
{void fbusy();
lcdrw=0;//写操作
lcdrs=1; //设置为输入数据
}DelayMS(10);
}}
#include<reg52.h>(乙机)
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P0^0;
sbit LED2=P0^1;
sbit K1=P1^0;
void DelayMS(uint ms)//1ms延时子程序
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar Pre_KeyNO=16,KeyNO=16;
void DelayMS(uint ms)
{uchar t;
while(ms--)
P0=date; //将数据赋给P0口
DelayMS(5); //延时
lcden=1; //置高
/*DelayMS(5); //高脉冲*/
lcden=0; //置低完成高脉冲
}
void init()//初始化函数
{void fbusy();
lcdrw=0; //写操作
lcden=0;
write_com(0x38); //设置16x2显示5x7点阵,8位数据接口
}
DelayMS(100);
}
}
#include<reg52.h>(甲机)
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P0^0;
sbit LED2=P0^1;
sbit K1=P1^0;
void DelayMS(uint ms)//1ms延时子程序
case 8: KeyNO=3;break;
default:KeyNO=16;
}
P1=0xf0;
DelayMS(1);
Tmp=P1>>4^0x0f;
switch(Tmp)
{ case 1: KeyNO+=0;break;
case 2: KeyNO+=4;break;
case 4: KeyNO+=8;break;
write_com(0x0c); //设置开始显示不显示光标
write_com(0x06); //写一个字符后地址指针加1
write_com(0x01); //显示清零数据指针清零
}
//检查忙函数
void fbusy()
{
lcdrw=1;//读操作
lcdrs=0;
lcden=1;
lcden=0;
while(P0&0x80){lcden=0;lcden=1;}//忙,等待
for(num=0;num<6;num++)
{write_data(table[num]);DelayMS(5);}
lcd_pos(1,4);
/*write_com(0x80+0x40); //定义指针位置(第二行第一个字处即0xc0)*/
for(num=0;num<8;num++)
{write_data(table1[num]);DelayMS(5);} while(key0==0){};
/*write_com(0x80+0x40); //定义指针位置(第二行第一个字处即0xc0)*/
for(num=0;num<8;num++)
{write_data(table1[num]);DelayMS(5);}
flash();flash();}
}
void DelayMS(uint ms)
{uchar t;
while(ms--)
{for(t=0;t<120;t++);}
} //1ms延时子程序
void write_com(uchar com) //写入命令
{void fbusy();
lcdrw=0; //写操作
lcdrs=0; //LCD选择输入命令
{uchar t;
while(ms--)
{
for(t=0;t<120;t++);
}
}
void main()//主函数
{SCON=0x50;//以下为串行口初始化
TMOD=0x20;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
RI=0;
TR1=1;
LED1=LED2=1;
while(1)
{ if(RI)
DelayMS(5);}
//指定显示一个字符位置
void lcd_pos(unsigned char row,unsigned char pos)
{
row &= 0x1;
pos &= 0xF;//限制pos不能大于15,row不能大于1
if (row) pos |= 0x40;//当要显示第二行时地址码+0x40;
{uchar t;
while(ms--)
{
for(t=0;t<120;t++);
}
}
void putc_to_serialPort(uchar c)//发送子程序
{SBUF=c;
while(TI==0);
TI=1;
}
void main()//主函数
{uchar Operation_NO=0;
SCON=0x40; //以下为串行口初始化
{
for(t=0;t<120;t++);
}
}
void Keys_Scan()
{
uchar Tmp;
P1=0x0f;
DelayMS(1);
Tmp= P1 ^ 0x0f;
switch(Tmp)
{
case 1: KeyNO=0;break;
case 2: KeyNO=1;break;
case 4: KeyNO=2;break;
}
//方式2
if(key1==0){
init();
write_com(0x80+0x10); //数据的第一个字符,放在液晶屏的第一行第16位处
for(num=0;num<7;num++)
{write_data(table[num]);DelayMS(5);}
/*write_com(0x80+0x50); //定义指针位置*/
{P2=_crol_(P2,1);
DelayMS(500);}
for(i=7;i>0;i--)//循环右移7次
{P2=_cror_(P2,1);
DelayMS(500);}
}
else //若按键接口为电平
{
for(i=7;i>0;i--)//隔灯左移次数视情况而定
{P2=_crol_(P2,2);
DelayMS(500);}
#include<reg52.h>(流水灯)
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit key=P1^0;//按键接P1.0
void DelayMS(uint X)//延时1ms子程序
{uchar t;
TMOD=0x20;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
TI=0;
TR1=1;
while(1)
{ if(K1==0)
{ while(K1==0);
Operation_NO=(Operation_NO+1)%4; //计按键次数决定模式
}
switch(Operation_NO)
{ case 0:LED1=LED2=1;break;
write_com(pos | 0x80);
}//row为:0行,1行;pos:0<pos<16
void flash()//动闪烁
{
DelayMS(300); //控制停留时间
write_com(0x08); //关闭显示
DelayMS(100); //延时
write_com(0x0c); //开显示
for(num=0;num<8;num++)
{write_data(table1[num]);DelayMS(5);}
//分别显示完字符后,将字符整体,一次一列的左移一格,移动32次
for(num=0;num<32;num++)
{write_com(0x1c);
DelayMS(100);}
}
//方式3
DelayMS(100);
write_com(0x08); //关闭显示
DelayMS(100); //延时
write_com(0x0c); //开显示
DelayMS(100);
}
void main()
{
//方式1
if(key0==0){
init();
lcd_pos(0,5);
/*write_com(0x80); //将数据指针第一行第一个字处,*/
case 8: KeyNO+=12;break;
}
}
void main()
{ P0=0x00;
while(1)
{
P1=0xf0;
if(P1!=0xf0)
Keys_Scan();
if(Pre_KeyNO!=KeyNO)
{
P0=DSY_CODE[KeyNO];//P0口接数码管显示
Pre_KeyNO!=KeyNO;
uchar num;
sbit key0=P1^0;
sbit key1=P1^1;
sbit key2=P1^2;
sbit lcden=P2^2; //液晶使能端
sbit lcdrs=P2^0; //液晶数据命令选择端选择写数据还是写命令
sbit lcdrw=P2^1; //液晶读/写信号线高电平读,低电平写
if(key2==0){
init();
lcd_pos(0,5);
/*write_com(0x80); //将数据指针第一行第一个字处,*/
for(num=0;num<6;num++)
{write_data(table[num]);DelayMS(5);}
flaຫໍສະໝຸດ Baiduh();flash();
lcd_pos(1,4);
相关文档
最新文档