1.动态数码管
注意:每个数码管后都要加上: P1 = 0x00; 进行消影,不然会有重影。
#include <reg52.h>
sbit led1 = P1^3;
sbit led2 = P1^2;
sbit led3 = P1^1;
sbit led4 = P1^0;
unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay3ms(void) //?? 0us
{
unsigned char a,b;
for(b=111;b>0;b--)
for(a=12;a>0;a--);
}
void main()
{
P1 = 0x00;
P0 = table[1];
led1 = 1;
delay3ms();
P1 = 0x00;
P0 = table[2];
led2 = 1;
delay3ms();
P1 = 0x00;
P0 = table[3];
led3 = 1;
delay3ms();
P1 = 0x00;
P0 = table[4];
led4 = 1;
delay3ms();
P1 = 0x00;
}
独立按键:按下键从1递增至8
// ¶ÀÁ¢°´¼ü£º×¢ÒâÏû¶¶£¬°´ÏÂÏû¶¶£¬ËÉ¿ªÒ²Ïû¶¶
#include <reg52.h>
#define uchar unsigned char;
#define uint unsigned int;
sbit key1 = P1^4;
sbit led1 = P2^0;
sbit wei = P1^3;
uint num;
unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay10ms(void)
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void main()
{
P1 = 0xf0;
wei = 1;
num = 1;
P0 = table[num];
while(1)
{
if(key1 == 0){
delay10ms();
if(key1 == 0){
num++;
if(num>=9) num = 1;
while(key1);
delay10ms();
while(!key1);
}
}
P0 = table[num];
}
}
矩阵键盘
// 独立按键:注意消抖,按下消抖,松开也消抖
#include <reg52.h>
#define uchar unsigned char;
#define uint unsigned int;
#define KEY_C P1;
uint num;
uchar keyvalue = 0;
uint a = 0;
unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay10ms(void)
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void key_down();
void main()
{
while(1){
key_down();
P0 = ~table[keyvalue];
}
}
void key_down(){
//高四位0,低四位1
P1 = 0x0f;
if(P1!=0x0f){
// 去抖动
delay10ms();
if(P1!=0x0f){
switch(P1){
case(0x07):keyvalue=0;break;
case(0x0b):keyvalue=1;break;
case(0x0d):keyvalue=2;break;
case(0x0e):keyvalue=3;break;
}
P1 = 0xf0;
switch(P1){
case(0x70):keyvalue=keyvalue;break;
case(0xb0):keyvalue=keyvalue+4;break;
case(0xd0):keyvalue=keyvalue+8;break;
case(0xe0):keyvalue=keyvalue+12;break;
}
while(a<50&&P1!=0xf0){
delay10ms();
a++;
}
}
}
}
蜂鸣器
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit beep = P1^1;
void delay(uint i) //误差 0us
{
while(i--);
}
void main()
{
while(1){
beep = ~beep;
delay(12);
beep = ~beep;
delay(3);
}
}
1602显示
#include <reg52.h>
#define uchar unsigned char
//typedef unsigned char uchar;
typedef unsigned int uint;
// 待打印的字符集
uchar code table[] = "Hello MCU!";
uchar code table1[] = "WWW.KIM.COM";
sbit en = P2^7;
sbit rs = P2^6;
sbit rw = P2^5;
void delay(uint z){
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com){
rs = 0;// 写指令
P0 = com;
delay(5);
// 高脉冲瞬间读入
en = 1;
en = 0;
}
void init(){
rw = 0;
en =0;
// 使能端为0,写指令
write_com(0x38);// 设置显示方式
write_com(0x0c);// 开显示,包括光标和闪烁
write_com(0x06);// 写一个字符后,地址指针自动加一
write_com(0x01);// 显示请0,数据指针清0
}
void write_data(uchar date){
rs = 1;
P0 = date;
delay(5);
en = 1;
en = 0;
}
void main(){
uchar num = 0;
init();
write_com(0x80);
for(num=0;num<10;num++){
write_data(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<11;num++){
write_data(table1[num]);
delay(5);
}
while(1);
}
直流电机控制
#include <reg52.h>
sbit moto1 = P1^0;
sbit moto2 = P1^2;
void delay3s(void) //误差 0us
{
unsigned char a,b,c;
for(c=189;c>0;c--)
for(b=230;b>0;b--)
for(a=33;a>0;a--);
}
void main(){
while(1){
moto1 = 0;
moto1 = 1;
delay3s();
moto1 = 0;
delay3s();
}
}