//头文件 #define uchar unsigned char//宏定义 #define uint unsigned int uchar i;uchar code table1[]=\"LCD1602 test 0k!\";//定义数组 uchar code table2[]=\"MY QQ:413830262\"; sbit rw=P2^1;//位定义 sbit rs=P2^0;
sbit e=P2^2; uchar num;
void delay(uint z)//延时 { }
void write_com(uchar com)//写指令函数 { }
void write_data(uchar dat)//写数据函数 { rs=0; rw=0; e=0; P0=com; delay(1); e=1; delay(1); e=0; uint x,y; for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
rs=1; rw=0; e=0; P0=dat; delay(1); e=1; delay(1); e=0;
void init()//1602初始化 {
delay(15); write_com(0x38); delay(5); write_com(0x38); delay(5); write_com(0x38); delay(5); write_com(0x38); write_com(0x08); write_com(0x06); write_com(0x01);
}
write_com(0x0c);
void main()//主函数 {
write_com(0x80+0x40+0x10);//写地址 for(num=0;num<16;num++) { }
for(i=0;i<32;i++) {
write_com(0x1c);//整屏右移 delay(200);
write_data(table2[num]);//送数据 delay(20); init(); //初始化
write_com(0x80+0x10);//写地址 for(num=0;num<16;num++) { }
write_data(table1[num]);//送数据 delay(20);
}
} delay(200);
二、秒表
原理图:
程序流程图:
1、 主程序流程图 2、 加一子程序流程图
程序开始 R1=R1+1 程序初始化 开各中断 R1=?#0ahP1.0=?1 R1=#00H 关定时器0,1 调用显示子程序 R2=R2+1 R2=?#0ah P1.0=?0 R2=#00H 开定时器0,1 14H=R1 13H=R2
程序:
#include #define uchar unsigned char #define uint unsigned int uchar bai,shi,ge,a; uint num; uchar flag; ucharcode
table1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码
管段选
uchar code table2[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码管位选 sbit k1 = P1^0; sbit k2 = P1^1; sbit k3 = P1^2; void init(); void delay(uint x); void main() { init(); while(1) { if(k1==0) {
flag=0;
TR0=1; }
else if(k2==0) { TR0=0;
} //K1按下,定时器启动
//K2按下 ,暂停
else if(k3==0) {
flag=1; //标志位直一
} if(flag!=1) { P2=0; P0=table1[bai]; P2=table2[0]; delay(5); P2=0; P0=table1[shi]; P2=table2[1]; delay(5);
P2=0;
P0=table1[ge]; P2=table2[2]; delay(5);
} else { init();
}
bai=0; shi=0; ge=0;
}
}
void init() //初始化各变量及寄存器 { a=0; num=0; P0=table1[0]; P2=0x07; TMOD=0x01;
TH0=(65535-10000)/256; TL0=(65535-10000)%256; EA=1; ET0=1; }
void delay(uint x) //延时
{ uchar y; for(;x>0;x--) for(y=110;y>0;y--); }
void timer0()interrupt 1 //定时器中断函数 {
TH0=(65535-10000)/256; TL0=(65535-10000)%256; a++; if(a==1) {
a=0; num++; if(num==1000) num=0; bai=num/100; shi=num%100/10; ge=num%10;
} }
三、按键显示
原理图:
程序流程图:
程序:
#include #define uchar unsigned char #define uint unsigned int uchar num,shi,ge; ucharcode table1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code table2[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; void delay_50us(uint t) { uchar j;
for(;t>0;t--) }
void main() {
uchar keyl,keyh,key; P2=0; while(1) { P1=0xf0; keyl=P1; keyl=keyl&0xf0; if(keyl!=0xf0) { delay_50us(100) ; if(keyl!=0xf0) { keyl=P1&0xf0; keyl=keyl|0x0f;
P1=keyl; keyh=P1; keyh=keyh&0x0f; keyl=keyl&0xf0; for(j=19;j>0;j--) ;
key=keyl+keyh;
} }
switch(key)
{ case 0xee:num=1;break; case 0xde:num=2 ;break; case 0xbe:num=3 ;break; case 0x7e:num=4 ;break; case 0xed:num=5 ;break; case 0xdd:num=6 ;break; case 0xbd:num=7 ;break; case 0x7d:num=8 ;break; case 0xeb:num=9 ;break; case 0xdb:num=10 ;break; case 0xbb:num=11 ;break; case 0x7b:num=12 ;break; case 0xe7:num=13 ;break; case 0xd7:num=14 ;break; case 0xb7:num=15 ;break; case 0x77:num=16 ;break;
}
shi=num/10; ge=num%10; P2=0; P0=table1[shi]; P2=table2[0]; delay_50us(100); P2=0; P0=table1[ge]; P2=table2[1]; delay_50us(100);
} }