单片机程序大全
- 格式:doc
- 大小:43.00 KB
- 文档页数:29
1 独立按键
#include
#define uchar unsigned char
#define uint unsigned int
sbit P27=P2^7;
sbit K5=P1^4;
sbit fmq=P3^6;
uchar num;
unsigned char code s8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void delay1ms(uint i)
{uchar j;
while(i—-)
{for(j=0;j<115;j++) //1ms基准延时程序
{;}
}
}
void beep() //产生1KHZ频率声音的函数
{
fmq=0;
delay500us(); 2 fmq=1;
delay500us();
}
void delay500us()
{
unsigned char j;
for(j=0;j<57;j++) //500us基准延时程序
{; }
}
void main()
{ uchar t;
P27=0;
while(1){
if(K5==0){
delay1ms(15);
if(K5==0){
for(t=0;t〈100;t++)
{ beep();}
num=num+1;
if(num==16){
num=0;
} 3 while(!K5);//等待按键释放
}
}
P0=s8[num];
}
}
#include
#define uchar unsigned char //数据类型的宏定义
#define uint unsigned int //数据类型的宏定义
sbit P27=P2^7;
unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF};
//共阳数码管显示字型码数组 1011 1111 "—”
void delay1ms(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<115;j++); //1ms基准延时程序 4 }
}
void display(unsigned char i)
{
P27=0; //选通最有端的数码管显示
P0=table[i]; //显示i参数传来的字型码
}
void main(void)
{
unsigned char temp;
display(16); //初始显示 "-"
while(1)
{
P1=0xff; //先向P1口写1;端口读状态
P1=0xf0;
temp=P1;
if(temp!=0xf0)
{
delay1ms(15);
if(temp!=0xf0)
{
P1=0xfe; 5 temp=P1;
switch(temp)
{
case(0xee):display(0);break;
case(0xde):display(1);break;
case(0xbe):display(2);break;
case(0x7e):display(3);break;
}
P1=0xfd;
temp=P1;
switch(temp)
{
case(0xed):display(4);break;
case(0xdd):display(5);break;
case(0xbd):display(6);break;
case(0x7d):display(7);break;
}
P1=0xfb;
temp=P1;
switch(temp)
{ 6 case(0xeb):display(8);break;
case(0xdb):display(9);break;
case(0xbb):display(10);break;
case(0x7b):display(11);break;
}
P1=0xf7;
temp=P1;
switch(temp)
{
case(0xe7):display(12);break;
case(0xd7):display(13);break;
case(0xb7):display(14);break;
case(0x77):display(15);break;
}
}
}
}
}
/*行线接P1.0-P1。3,列线接P1。4-P1。7。
根据线反转法扫描键盘返回的键值编码查键值编码表,从而得到键值并送数码管显示.
开机时,数码管显示“-”。*/ 7 #include
#include 〈intrins。h〉
#define uchar unsigned char
#define uint unsigned int
sbit P27=P2^7;
sbit fmq=P3^6;
uchar key;
unsigned char code disp_code[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
unsigned char code key_code[]={
0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
void delay1ms(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<115;j++) //1ms基准延时程序
{;}
}
} 8 void delay500us()
{
unsigned char j;
for(j=0;j<57;j++) //500us基准延时程序
{ ;}
}
void beep() //产生1KHZ频率声音的函数
{
fmq=0;
delay500us();
fmq=1;
delay500us();
}
/**********************************************************
键盘扫描子函数
**********************************************************/
uchar keyscan()
{
uchar scan1,scan2,keycode,j;
P1=0xf0; 9 scan1=P1;
if((scan1&0xf0)!=0xf0) //判键是否按下
{
delay1ms(20); //延时20ms
scan1=P1;
if((scan1&0xf0)!=0xf0) //二次判键是否按下
{
P1=0x0f; //线反转法的核心
scan2=P1;
keycode=scan1|scan2; //组合成键编码
for(j=0;j〈=15;j++)
{
if(keycode== key_code[j]) //查表得键值
{
key=j;
return(key);
}
}
}
}
else 10 P1=0xff; //P1口写1 输入状态
return (16);//"-"
}
main()
{
uchar tt;
P0 = 0xbf;
P27 =0; //数码管显示”—”
P1 = 0xff;
while(1)
{
P1=0xf0;
if((P1&0xf0)!=0xf0){
keyscan();
P0=disp_code[key];
for(tt=0;tt〈200;tt++)
{ beep();}
fmq=1;
delay1ms(200);
}
} 11 }
中断
#include
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit d1=P1^0;
uchar num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void main()
{
EA=1;//开总中断
EX0=1;//开外部中断0
//IT0=1;
//TCON=0x01;
wela=1;//11101010