好文档 - 专业文书写作范文服务资料分享网站

单片机C语言程序设计实训100例--基于某8051+PROTEUS仿真1

天下 分享 时间: 加入收藏 我要投稿 点赞

下的按键值越大点亮的LED越多。 */

#include #include

#define uchar unsigned char #define uint unsigned int //矩阵键盘按键特征码表

uchar code KeyCodeTable[]={0x11,0x12,0x14,0x18,0x21, 0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88}; //延时

void DelayMS(uint x) { uchar i; while(x--) for(i=0;i<120;i++); }

//键盘扫描

uchar Keys_Scan() { uchar sCode,kCode,i,k; //低4位置0,放入4行 P1=0xf0; //若高4位出现0,则有键按下 if((P1&0xf0)!=0xf0) { DelayMS(2); if((P1&0xf0)!=0xf0) { sCode=0xfe; //行扫描码初值 for(k=0;k<4;k++) //对4行分别进行扫描 { P1=sCode; if((P1&0xf0)!=0xf0) { kCode=~P1; for(i=0;i<16;i++) //查表得到按键序号并返回 if(kCode==KeyCodeTable[i]) return(i); } else sCode=_crol_(sCode,1); } } } return(-1); }

//主程序

void main() { uchar i,P2_LED,P3_LED; uchar KeyNo=-1; //按键序号,-1表示无按键 while(1) { KeyNo=Keys_Scan(); //扫描键盘获取按键序号KeyNo if(KeyNo!=-1) { P2_LED=0xff; P3_LED=0xff; for(i=0;i<=KeyNo;i++) //键值越大,点亮的LED越多 { if(i<8) P3_LED>>=1; else P2_LED>>=1; } P3=P3_LED; //点亮条形LED P2=P2_LED; } } }

17 数码管显示4X4矩阵键盘按键号

/* 名称:数码管显示4X4矩阵键盘按键号 说明:按下任意键时,数码管都会显示其键的序号,扫描程序首先判断按键发生在哪一列,然后根据所发生的行附加不同的值,从而得到按键的序号。 */

#include

#define uchar unsigned char #define uint unsigned int //段码

uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,

0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};

sbit BEEP=P3^7;

//上次按键和当前按键的序号,该矩阵中序号围0~15,16表示无按键 uchar Pre_KeyNo=16,KeyNo=16; //延时

void DelayMS(uint x)

{ uchar i; while(x--) for(i=0;i<120;i++); }

//矩阵键盘扫描 void Keys_Scan() { uchar Tmp; P1=0x0f; //高4位置0,放入4行 DelayMS(1); Tmp=P1^0x0f;//按键后0f变成0000XXXX,X中一个为0,3个仍为1,通过异或把3个1变为0,唯一的0变为1 switch(Tmp) //判断按键发生于0~3列的哪一列 { case 1: KeyNo=0;break; case 2: KeyNo=1;break; case 4: KeyNo=2;break; case 8: KeyNo=3;break; default:KeyNo=16; //无键按下 } P1=0xf0; //低4位置0,放入4列 DelayMS(1); Tmp=P1>>4^0x0f;//按键后f0变成XXXX0000,X中有1个为0,三个仍为1;高4位转移到低4位并异或得到改变的值 switch(Tmp) //对0~3行分别附加起始值0,4,8,12 { case 1: KeyNo+=0;break; case 2: KeyNo+=4;break; case 4: KeyNo+=8;break; case 8: KeyNo+=12; } }

//蜂鸣器 void Beep() { uchar i; for(i=0;i<100;i++) { DelayMS(1); BEEP=~BEEP; } BEEP=0; }

//主程序 void main() {

P0=0x00; BEEP=0; while(1) { P1=0xf0; if(P1!=0xf0) Keys_Scan(); //获取键序号 if(Pre_KeyNo!=KeyNo) { P0=~DSY_CODE[KeyNo]; Beep(); Pre_KeyNo=KeyNo; } DelayMS(100); } }

18 开关控制LED

/* 名称:开关控制LED 说明:开关S1和S2分别控制LED1和LED2。 */

#include sbit S1=P1^0; sbit S2=P1^1; sbit LED1=P0^0; sbit LED2=P0^1; //主程序 void main() { while(1) { LED1=S1; LED2=S2; } }

19 继电器控制照明设备

/* 名称:继电器控制照明设备 说明:按下K1灯点亮,再次按下时灯熄灭 */

#include

#define uchar unsigned char #define uint unsigned int

sbit K1=P1^0;

sbit RELAY=P2^4; //延时

void DelayMS(uint ms) { uchar t; while(ms--)for(t=0;t<120;t++); }

//主程序 void main() { P1=0xff; RELAY=1; while(1) { if(K1==0) { while(K1==0); RELAY=~RELAY; DelayMS(20); } } }

20 数码管显示拨码开关编码

/* 名称:数码管显示拨码开关编码 说明:系统显示拨码开关所设置的编码000~255 */

#include #include

#define uchar unsigned char #define uint unsigned int

//各数字的数码管段码(共阴)

uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //显示缓冲

uchar DSY_Buffer[3]={0,0,0}; //延时

void DelayMS(uint ms) { uchar t; while(ms--)for(t=0;t<120;t++); }

//主程序 void main() {

单片机C语言程序设计实训100例--基于某8051+PROTEUS仿真1

下的按键值越大点亮的LED越多。*/#include#include#defineucharunsignedchar#defineuintunsignedint//矩阵键盘按键特征码表ucharcodeKeyCodeTable[]={0x11,0x12,0x14,0x18,0x21
推荐度:
点击下载文档文档为doc格式
1cp3f9hx3t4yj364q360565jb3urvy0113u
领取福利

微信扫码领取福利

微信扫码分享