单片机经典长短按程序
51单片机常见程序,附带注释

51单片机常见程序,附带注释51 单片机常见程序附带注释三位数分离成3个一位数,截取bai=num/100;//输出百位数shi=num%100/10;//输出十位数ge=num/10;//输出个位数#include //跑马灯程序。
当时间约为20ms,形成动态扫描,看上去全亮。
#include#define uint unsigned int //无符号整型,占16位数,表示围0~65536#define uchar unsigned char //无符号字符型占八位数,表示围0~255void delayms(uint);uchar aa; //定义变量void main(){aa=0xfe;while(1){P2=aa; //控制单片机接口p2,循环亮delayms(500); //当500换成5,看起来全亮,实际上灯一直亮灭,原因是视觉延迟aa=_crol_(aa, 1);}}void delayms(uint xms) //子程序,延时,通过数数{uint i, j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}#include //跑马灯程序。
现在时间较长,多以是亮灭的流动,当时间约为20ms,形成动态扫描,看上去全亮。
#include#define uint unsigned int //无符号整型,占16位数,表示围0~65536#define uchar unsigned char //无符号字符型占八位数,表示围0~255void delayms(uint);uchar aa; //定义变量void main(){aa=0xfe;while(1){P2=aa; //控制单片机接口p2,循环亮delayms(500); //当500换成5,看起来全亮,实际上灯一直亮灭,原因是视觉延迟aa=_crol_(aa, 1);}}void delayms(uint xms) //子程序,延时,通过数数{uint i, j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}#include //52系列单片机头文件(目标:用单片机和两个共阴极数码管:使用单片机的引脚1和2,控制两个数码管静态显示00到59)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P0^7; //申明U1锁存器锁存端段选uchar num,num1;uchar code table[]={ //共阴极数码管0123456789abcdef0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delayms(uint) ;void main (){while(1){for(num1=0;num1<=5;num1++){for(num=0;num<=9;num++){dula2=1; //打开U1锁存端P1=table[num]; //送入位选信号dula2=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3sdula1=1; //打开U1锁存端P2=table[num1]; //送入位选信号dula1=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3s}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=200;y>0;y--);}#include //52系列单片机头文件(目标:用单片机和两个共阴极数码管)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P2^7; //申明U1锁存器锁存端段选uchar num,num1;uchar code table[]={ //共阴极数码管0123456789abcdef0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delayms(uint) ;void main (){while(1){for(num1=0;num1<=9;num1++){dula1=1; //打开U1锁存端P1=table[num1]; //送入位选信号dula1=0; //关闭U1锁存器delayms(1000); //延时500毫秒约0.3sfor(num=0;num<=9;num++){dula2=1; //打开U1锁存端P1=table[num]; //送入位选信号dula2=0; //关闭U1锁存器delayms(1000); //延时500毫秒约0.3s}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=200;y>0;y--);}有语法错误#include //52系列单片机头文件#define uchar unsigned char //无符号字符型占八位数,表示围0~255#define uint unsigned int //无符号整型,占16位数,表示围sbit dula1=P1^6; //申明U1锁存器锁存端段选sbit dula2=P0^7; //申明U1锁存器锁存端段选uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void display(uchar,uchar) ;uchar num,num2,shi,ge;void main (){TMOD=0x11;//设置定时器0和1为工作方式1(M1M0为01,0001 00TH0= (65535-50000)/256;//装初值12.00M晶振定时50s数为50000TL0= (65535-50000)%256;TH1= (65535-50000)/256;//装初值12.00M晶振定时50s数为50000TL1= (65535-50000)%256;EA=1;// 开总中断ET0=1; // 开定时器0中断ET1=1; // 开定时器1中断TR0=1;// 启动定时器0TR1=1;// 启动定时器1while(1)// 程序停止在这里不停的对数码管动态扫描同时等待中断的发生 {display(shi,ge);dula2=1; //打开U1锁存端P1=table[shi]; //送入位选信号dula2=0; //关闭U1锁存器delayms(1175); //延时0.1毫秒}}void delayms(uint xms) //延时子程序{uint i,j;for (i=xms;i>0;i--) //i=xms即延时约为xms毫秒for (j=110;j>0;j--);}void T1_time()interrupt 1{TH1= (65536-50000)/256; //重装初值TL1= (65536-50000)%256;num2++; //num每加1次判断一次是否到20次if(num2==20){num2=0; //然后把num2清0重新再计数20次num++;if (num==60) //这个数用来送数码管显示,到60后归0num=0;shi=num/10; //把一个2位数分离后分别送数码管显示,十位数ge=num%10; //个位数}#include //52系列单片机头文件(目标:控制时间24小时一循环)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P0^7; //申明U1锁存器锁存端段选uchar num,num1,num2,num3,num4;uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void main (){while(1){for(num3=0;num3<=23;num3++) //每天24小时进位一{for(num2=0;num2<=59;num2++) //每60分进位一{for(num1=0;num1<=5;num1++) //每6*10s进位一{dula2=1; //打开U1锁存端P1=table[num1]; //送入位选信号dula2=0; //关闭U1锁存器delayms(1175); //延时0.1毫秒for(num=0;num<=9;num++) //每1s进位一{dula2=1; //打开U1锁存端P1=table[num]; //送入位选信号dula2=0;//关闭U1锁存器delayms(1000);//延时0.1毫秒}}}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=110;y>0;y--);}#include //52系列单片机头文件(目标:控制时间24小时一循环,蜂鸣器每过一段时间响一次)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P2^7; //申明U1锁存器锁存端段选sbit f=P0; //声明单片机 P0口的第一位,也就是三极管基级的位置单片机第39接口uchar num,num1,num2,num3,num4;uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void main (){while(1){for(num3=0;num3<=23;num3++) //每天进位一{for(num2=0;num2<=59;num2++) //每60分进位一{for(num4=0;num2<=59;num4++) //每60s 进位一{f=0; //控制蜂鸣器的不响for(num=0;num<=9;num++) //每1ms进位一{dula2=1; //打开U1锁存端P2=table[num]; //送入位选信号dula2=0; //关闭U1锁存器delayms(1074);//延时0.1毫秒}f=1; //控制蜂鸣器的响delayms(1000);}}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=10;y>0;y--);}#include //52系列单片机头文件(目标:用单片机和两个共阳极数码管,控制依次显示0到59,然后循环,有合适的时间间隔,程序停止)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P2^7; //申明U1锁存器锁存端段选uchar num,num1;uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg 0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void main (){while(1){for(num1=0;num1<6;num1++){dula1=1; //打开U1锁存端P1=table[num1]; //送入位选信号dula1=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3sfor(num=0;num<=9;num++){dula2=1; //打开U1锁存端P2=table[num]; //送入位选信号dula2=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3s}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=200;y>0;y--);#include //52系列单片机头文件(目标:用单片机和两个共阳极数码管,控制依次显示0到59,时间间隔约0.5,程序停止)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P2^7; //申明U1锁存器锁存端段选uchar num,num1;uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void main (){while(1){for(num=0;num1<6;num1++){dula1=1; //打开U1锁存端P1=table[num1]; //送入位选信号dula1=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3sfor(num=0;num<=9;num++){dula2=1; //打开U1锁存端P2=table[num]; //送入位选信号dula2=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3s}}}void delayms (uint xms)//延时子程序{uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=300;y>0;y--);}#include //52系列单片机头文件(目标:用单片机和两个共阳极数码管,控制依次显示0到59,时间间隔约0.5,程序停止)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P2^7; //申明U2锁存器锁存端段选uchar num,num1;uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void main (){while(1){for(num=0;num1<6;num1++){dula1=1; //打开U1锁存端P1=table[num1]; //送入位选信号dula1=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3sfor(num=0;num<=9;num++){dula2=1; //打开U2锁存端P2=table[num]; //送入位选信号dula2=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3s}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=300;y>0;y--);}#include //52系列单片机头文件(目标:用单片机和共阳极数码管,控制依次显示0到9,时间间隔约0.5s;)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P2^7; //申明U2锁存器锁存端段选uchar num;uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void main (){while(1){for(num=0;num<10;num++){dula1=1; //打开U1锁存端P1=table[num]; //送入位选信号dula1=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3秒dula2=1; //打开U2锁存端P2=table[num]; //送入位选信号dula2=0; //关闭U2锁存器delayms(100); //延时500毫秒约0.3秒}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=300;y>0;y--);}#include //52系列单片机头文件(目标:用定时器0的方式1实现第一个灯管以200ms闪烁;用定时器1的方式1实现数码管前两位59s循环计时)#define uchar unsigned char //无符号字符型占八位数,表示围0~255#define uint unsigned int //无符号整型,占16位数,表示围sbit dula=P2^6; //申明U1锁存器锁存端段选sbit wela=P2^7; // 申明U2锁存器锁存位选sbit led1=P1^0; //申明灯1点0uchar code table[]={ //共阴极数码管0123456789abcdef0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delayms(uint) ;。
单片机常见程序

org 00hmain: mov P0, #0ffh ;向P0端口锁存器写0FFH,准备输入mov a, P0 ;从P0口输入数据mov P1, a ;将数据传至P1口sjmp mainend2 单片机IO-2程序org 00hmov a, #1loop: mov P1, a ;将a的内容通过P1口输出call delay ;调延时子程序rl a ; a左移一位sjmp loopdelay: mov r0, #80h ;延时子程序delay1: mov r1, #00hdelay2: djnz r1, delay2djnz r0, delay1retend3 单片机LED点阵程序ORG 0HSTART: MOV P2,#0FFH ;阳极全部加高电平MOV A,#80H ;A初值为80H,为最左一列(第7列)阴极输出低电平准备? LOOP: MOV P1,A ;使一列阴极为低电平CALL DELAY ;延时RRC A ;A右移一位,为下一列阴极输出低电平作准备JNC LOOP ;八列未完转移?CLR CMOV P1,#0FFH ;阴极全部加低电平mov a,#80h ;为最上面一行输出高电平准备LOOP1: MOV P2,A ;使一行阳极极为高电平CALL DELAY ; 延时RRC A ; A右移一位,为下一行阳极输出高电平作准备JNC LOOP1 ; 八行未完转移?CLR CAJMP STARTDELAY: MOV R1,#0C8H ;延时子程序DEY0: MOV R0,#0HDEY1: DJNZ R0,DEY1DJNZ R1,DEY0RETEndORG 0H ;显示'年?START:MOV DPTR,#DA TA1 ;指向点阵代码首址MOV R2,#80H ;80H使第7列(最左一列)阴极为低电平??CLR CDISP: MOV A,#0MOVC A,@A+DPTR ;取一列代码MOV P2,A ;加至阳极MOV P1,R2 ;使一列阴极为低电平CALL DELAY ;延时INC DPTR ;指向下一列代码?MOV A,R2 ;R2右移一位,为下一列阴极输出低电平作准备RRC A ;MOV R2,A ;JNC DISP ;8列未完,转AJMP STARTDELAY: MOV R1,#0 ;延时子程序DELY0: DJNZ R1,DEL Y0RETDA TA1: DB 24H,44H,0DCH,54H,7FH,54H,54H,44H;年的点阵代码END5 报警程序ORG 0000HLJMP MAINORG 1BHJMP T1INT ;定时器1中断入口地址ORG 0100HMAIN: MOV SP,#60HANL TMOD,#0FH ;定时器1置为方式1ORL TMOD,#10HORL IE,#88H ;允许定时器1中断MAIN1: MOV DPTR,#TONE ;置TONE表首地址MOV A,#00H ;TONE表偏移量LOOP: MOVC A,@A+DPTR ;读TONE表中的TH1值JZ MAIN1 ;为0则转MAIN1,进入下一周期MOV TH1,A ;TONE表中的高字节送TH1和R5MOV R5,AINC DPTR ;从TONE表中读出TL1的值MOV A,#00HMOVC A,@A+DPTRMOV TL1,A ;TONE表中的低字节值送TL1和R6MOV R6,ASETB TR1 ;启动定时器1INC DPTRMOV A,#00HMOVC A,@A+DPTR ;从TONE表中取出音的时间MOV R2,ALOOP1: M OV R3,#80H ;延时LOOP2: M OV R4,#0FFHDJNZ R4,$DJNZ R3,LOOP2DJNZ R2,LOOP1INC DPTR ;TONE表地址加1,指向下一个音调MOV A,#00HJMP LOOPT1INT: CPL P1.2 ;取反得到一定频率的方波,使喇叭;发出一定音高的音调CLR TR1 ;停止定时器1计数MOV TH1,R5 ;重置定时器1时间常数MOV TL1,R6SETB TR1 ;恢复定时器1计数RETITONE: DB 0FCH,46H,04H,0FCH,0AEH,04H ;音调表DB 0FDH,0BH,04H,0FDH,34H,04HDB 0FDH,83H,04H,0FDH,0C8H,04HDB 0FEH,06H,04H,0FEH,22H,04HDB 0FEH,22H,04H,0FEH,06H,04HDB 0FDH,0C8H,04H,0FDH,83H,04HDB 0FDH,34H,04H,0FDH,0BH,04HDB 0FCH,0AEH,04H,0FCH,46H,0CHDB 00H,00H,00HEND6 查询式键盘0525ORG 0000HSTART: mov P1,#0FFH ;P1端口全部置01111 1111 MOV P2,#00HMOV A,P1jnb acc.7,START ;有无键按下,直接寻址为为零则转移ANL A,#3FH ;立即数与到累加器;0011 1111CJNE A,#3FH,S1 ;比较立即数和A,不等则转移到S1 AJMP STARTS1: call delay ;延时去抖动MOV A,P1jnb acc.7,STARTANL A,#3FHcjne A,#3Eh,S2 ;0键按下0011 1110mov A,#01H ;0000 0001mov P2,Acall delay1AJMP STARTS2: cjne A,#3DH,S3 ;1键按下0011 1101 mov A,#02H ;0000 0010mov P2,Acall delay1AJMP STARTS3: cjne A,#3BH,S4 ;2键按下0011 1011 mov A,#04H ;0000 0100mov P2,Acall delay1AJMP STARTS4: cjne A,#37H,S5 ;3键按下0011 0111 mov A,#08H ;0000 1000mov P2,Acall delay1AJMP STARTS5: cjne A,#2FH,S6 ;4键按下0010 1111 mov A,#10H ;0001 0000mov P2,Acall delay1AJMP STARTS6: cjne A,#1FH,S7 ;5键按下0001 1111 mov A,#20H ;0010 0000mov P2,Acall delay1S7: AJMP STARTDELAY: MOV R6,#10H;30H ;延时子程序DE0: mov R7,#10H;30HDE1: DJNZ R7,DE1DJNZ R6,DE0RETDELAY1: MOV R4,#0FFH ;延时子程序DE2: mov R5,#0FFHDE3: DJNZ R5,DE3DJNZ R4,DE2RETEND7 电子琴KEYBUF EQU 30HSTH0 EQU 31HSTL0 EQU 32HTEMP EQU 33HORG 00HLJMP STARTORG 0BHLJMP INT_T0START: MOV TMOD,#01HSETB ET0SETB EAWAIT:MOV P3,#0FFHCLR P3.4MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1LCALL DELY10MS MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1MOV A,P3ANL A,#0FHCJNE A,#0EH,NK1 MOV KEYBUF,#0 LJMP DK1NK1: CJNE A,#0DH,NK2 MOV KEYBUF,#1 LJMP DK1NK2: CJNE A,#0BH,NK3 MOV KEYBUF,#2 LJMP DK1NK3: CJNE A,#07H,NK4 MOV KEYBUF,#3 LJMP DK1NK4: NOPDK1:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,AMOV A,KEYBUFMOV B,#2MUL ABMOV TEMP,AMOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,AMOV TH0,AINC TEMPMOV A,TEMPMOVC A,@A+DPTR MOV STL0,AMOV TL0,ASETB TR0DK1A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK1ACLR TR0NOKEY1:MOV P3,#0FFHCLR P3.5MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2LCALL DELY10MS MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2MOV A,P3ANL A,#0FHCJNE A,#0EH,NK5 MOV KEYBUF,#4 LJMP DK2NK5: CJNE A,#0DH,NK6 MOV KEYBUF,#5 LJMP DK2NK6: CJNE A,#0BH,NK7 MOV KEYBUF,#6 LJMP DK2NK7: CJNE A,#07H,NK8 MOV KEYBUF,#7 LJMP DK2NK8: NOPDK2:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,AMOV A,KEYBUFMOV B,#2MUL ABMOV TEMP,AMOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,AMOV TH0,AINC TEMPMOV A,TEMPMOVC A,@A+DPTR MOV STL0,AMOV TL0,ASETB TR0DK2A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK2ACLR TR0NOKEY2:MOV P3,#0FFHCLR P3.6ANL A,#0FHXRL A,#0FHJZ NOKEY3LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY3MOV A,P3ANL A,#0FHCJNE A,#0EH,NK9MOV KEYBUF,#8LJMP DK3NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#9LJMP DK3NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10LJMP DK3NK11: CJNE A,#07H,NK12 MOV KEYBUF,#11LJMP DK3NK12: NOPDK3:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,AMOV A,KEYBUFMOV B,#2MUL ABMOV TEMP,AMOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,AMOV TH0,AINC TEMPMOV A,TEMPMOVC A,@A+DPTR MOV STL0,AMOV TL0,ASETB TR0DK3A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK3ACLR TR0NOKEY3:MOV P3,#0FFHCLR P3.7MOV A,P3ANL A,#0FHJZ NOKEY4LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY4MOV A,P3ANL A,#0FHCJNE A,#0EH,NK13MOV KEYBUF,#12LJMP DK4NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#13LJMP DK4NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#14LJMP DK4NK15: CJNE A,#07H,NK16 MOV KEYBUF,#15LJMP DK4NK16: NOPDK4:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,AMOV A,KEYBUFMOV B,#2MUL ABMOV TEMP,AMOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,AMOV TH0,AINC TEMPMOV A,TEMPMOVC A,@A+DPTR MOV STL0,AMOV TL0,ASETB TR0DK4A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK4ACLR TR0NOKEY4:LJMP W AITDELY10MS:MOV R6,#10D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETINT_T0:MOV TH0,STH0MOV TL0,STL0CPL P1.0RETITABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71HTABLE1: DW 64021,64103,64260,64400DW 64524,64580,64684,64777DW 64820,64898,64968,65030DW 65058,65110,65157,65178END8 键盘ORG 0H ;翻转法键盘扫描显示?KB1: MOV P1,#0F0H ;列线输出低电平MOV A,P1 ;输入行线值CJNE A,#0F0H,KB2 ;若有键按下, 转KB2?AJMP KB1 ;若无键按下,转KB1KB2: MOV B,A ;保存键码的高四位ORL A,#0FH ;A高四位不变,低四位置1?MOV P1,A ;键码的高四位通过行线输出?MOV A,P1 ;输入列线值ANL A,#0FH ;屏蔽高四位ORL B,A ;键码的高四位与低四位合并MOV DPTR,#TAB ;DPTR 指向键码表首地址?MOV R3,#0 ;R3?作为键号计数器KB3: MOV A,R3MOVC A,@A+DPTR ;取键码CJNE A,B,NEXT ;所取键码与当前按键的键码不等转移?CALL DELAY ;延时20msCALL DISPLAY ;显示键号WAIT0: MOV P1,#0F0H ;以下3条指令为等待按键释放MOV A,P1CJNE A,#0F0H,W AIT0CALL DELAYAJMP KB1NEXT: INC R3 ;键号计数器加1AJMP KB3DELAY: MOV R0,#32H ;延时20msDELAY0: MOV R1,0C8HDELAY1: DJNZ R1,DELAY1DJNZ R0,DELAY0RET;显示子程序DISPLAY:MOV DPTR,#TAB1 ;DPTR指向段码表首址MOV A,R3MOVC A,@A+DPTR ;查段码表MOV SBUF,A ;输出段码RETTAB: DB 77H,7BH,7DH,7EH,0B7H,0BBH,0BDH,0BEH,0D7H DB 0DBH,0DDH,0DEH,0E7H,0EBH,0EDH,0EEH ;0~F键码tab1: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;0~9 DB 88H,83H,0C6H,0A1H,86H,8EH ;a~f段码END9 交通灯制作SR EQU P1.0 ;南北红灯SY EQU P1.1 ;南北黄灯SG EQU P1.2 ;南北绿灯ER EQU P1.3 ;东西红灯EY EQU P1.4 ;东西黄灯EG EQU P1.5 ;东西绿灯ORG 00hST1: SETB SG ;南北方向绿灯亮CLR SYCLR SRCLR EGCLR EYSETB ER ;东西方向红灯亮MOV R3, #20 ;长延时CALL DELAYMOV R4, #8 ;南北方向绿灯闪4次ST2: CPL SG ;MOV R3, #2 ;短延时CALL DELAYDJNZ R4, ST2CLR SG ;南北方向绿灯灭SETB SY ;南北方向黄灯亮MOV R3, #20 ;延时CALL DELAYST3: CLR SY ;南北方向黄灯灭SETB SR ;南北方向红灯亮CLR ER ;东西方向红灯灭SETB EG ;东西方向绿灯亮MOV R3, #20 ;长延时CALL DELAYST4: MOV R4, #8 ;东西方向绿灯闪4次LP: CPL EGMOV R3, #2 ;短延时CALL DELAYDJNZ R4, LPCLR EG ;东西方向绿灯灭SETB EY ;东西方向黄灯亮MOV R3, #20 ;延时CALL DELAYSJMP ST1 ;转ST1DELAY: MOV R1, #0 ;延时子程序DELAY1: MOV R0, #0DELAY2: DJNZ R0, DELAY2DJNZ R1, DELAY1DJNZ R3, DELAYRETend10 矩阵键盘0518ORG 00H ;扫描法键盘扫描显示?CLR P3.3CLR P3.4KB1: MOV P2,#0FH ;行线输出低电平MOV A,P2 ;输入列线值CJNE A,#0FH,KB2 ;若有键按下,转KB2行扫??AJMP KB1 ;若无键按下,转KB1KB2: MOV B,#7FHKB22: MOV P2,BMOV A,P2ANL A,#0FHCJNE A,#0FH,KB3 ;此行有键按下, 转KB3MOV A,BRR AMOV B,AAJMP KB22KB3: ANL B,#0F0HORL B,AMOV R3,#0HMOV DPTR,#TABKB4: MOV A,R3MOVC A,@A+DPTR ;取键码CJNE A,B,NEXT ;所取键码与当前按键的键码不等转移?CALL DELAY ;延时20msCALL DISPLAY ;显示键号WAIT: MOV P2,#0F0H ;以下3条指令为等待按键释放MOV A,P2CJNE A,#0F0H,W AITCALL DELAYAJMP KB1NEXT: INC R3 ;键号计数器加1AJMP KB4DELAY: MOV R0,#05H ;延时20msDELAY0: MOV R1,0C8HDELAY1: DJNZ R1,DELAY1DJNZ R0,DELAY0RET;显示子程序DISPLAY:MOV DPTR,#TAB1 ;DPTR指向段码表首址MOV A,R3MOVC A,@A+DPTR ;查段码表SETB p3.3SETB p3.4MOV P1, A ;将段码送出RETTAB: DB 77H,7BH,7DH,7EH,0B7H,0BBH,0BDH,0BEH,0D7H DB 0DBH,0DDH,0DEH,0E7H,0EBH,0EDH,0EEH ;0~F键码tab1: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0~9 DB 77H,7CH,39H,5EH,79H,71H ;a~f段码END11 按键控制ORG 0000HSTART: MOV P1, #0FFHMOV P2, #00HMOV A, P1JNB ACC.7, STARTANL A, #3FHCJNE A, #3FH,S1AJMP STARTS1: CALL DELAYMOV A, P1JNB ACC.7, STARTANL A, #3FHCJNE A, #3FH,S2MOV A, #01HMOV P2, ACALL DELAY1AJMP STARTS2: CJNE A, #3DH,S3MOV A, #02HMOV P2,ACALL DELAY1AJMP STARTS3: CJNE A, #3BH,S4MOV A, #04HMOV P2, ACALL DELAY1AJMP STARTS4: CJNE A, #37H,S5MOV A, #08HMOV P2, ACALL DELAY1AJMP STARTS5: CJNE A, #2FH,S6MOV A,#10HMOV P2, ACALL DELAY1AJMP STARTS6: CJNE A, #1FH,S7MOV A, #20HMOV P2, ACALL DELAY1S7: AJMP STARTDELAY: MOV R6,#10H;30H DE0: MOV R7,#1OH;30HDE1: DJNZ R7,DE1DJNZ R6,DE0RETDELAY1: MOV R4,#0FFH DE2: MOV R5,#0FFHDE3: DJNZ R5,DE3DJNZ R4,DE2RETEND。
51单片机经典C程序(12864)

/*************************************** 控制器:KS0108* MCU:AT89C5* ,晶体频率:12MHz* 取模方式:纵向字节倒序* CS1和CS2为低电平有效**************************************/#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define LCD_PORT P0#define Left 1#define Right 2sbit LCD_Busy=P0^7;sbit LCD_EN = P1^2;sbit LCD_RS = P1^0;sbit LCD_RW = P1^1;sbit LCD_RST= P1^7;sbit LCD_CS2= P3^6;sbit LCD_CS1= P3^5;uchar DisBuf[32],Page_Num,Clm_Num;code char Table0[]={/*-- 文字: A --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27 ,0x38,0x20,/*-- 文字: B --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11 ,0x0E,0x00,/*-- 文字: C --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10 ,0x08,0x00,/*-- 文字: D --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10 ,0x0F,0x00,/*-- 文字: E --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20 ,0x18,0x00,/*-- 文字: F --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00 ,0x00,0x00,/*-- 文字: G --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E ,0x02,0x00,};code unsigned char Table3[]={/*-- 文字: 天 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x42,0x42 ,0x40,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x06,0x01,0x02,0x04,0x08,0x10,0x30,0x60 ,0x20,0x00,/*-- 文字: 仙 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x60,0xF8,0x07,0x02,0xE0,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0xE0,0x00,0x01,0x00,0x00,0x7F,0x00,0x20,0x7F,0x20,0x20,0x20,0x3F,0x20,0x20,0x20 ,0x7F,0x00,/*-- 文字: 妹 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x88,0x7F,0x0A,0x08,0xF8,0x80,0x88,0x88,0x88,0xFF,0x88,0x88,0x88 ,0x80,0x00,0x40,0x21,0x12,0x0C,0x3A,0x11,0x40,0x30,0x0C,0x03,0xFF,0x06,0x08,0x30 ,0x10,0x00,/*-- 文字: 妹 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x88,0x7F,0x0A,0x08,0xF8,0x80,0x88,0x88,0x88,0xFF,0x88,0x88,0x88 ,0x80,0x00,0x40,0x21,0x12,0x0C,0x3A,0x11,0x40,0x30,0x0C,0x03,0xFF,0x06,0x08,0x30 ,0x10,0x00};code unsigned char Table4[]={/*-- 文字: 我 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x20,0x22,0x22,0xFE,0x21,0x21,0x20,0x20,0xFF,0x20,0x22,0xAC,0x20 ,0x20,0x00,0x04,0x04,0x42,0x82,0x7F,0x01,0x01,0x10,0x10,0x08,0x07,0x1A,0x21,0x40 ,0xF0,0x00,/*-- 文字: 好 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0xF0,0x1F,0x10,0xF0,0x80,0x82,0x82,0x82,0xF2,0x8A,0x86,0x82 ,0x80,0x00,0x80,0x43,0x22,0x14,0x0C,0x73,0x20,0x00,0x40,0x80,0x7F,0x00,0x00,0x00 ,0x00,0x00,/*-- 文字: 想 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0xC8,0x38,0xFF,0x18,0x68,0x08,0x00,0xFE,0x2A,0x2A,0x2A,0x2A,0xFE ,0x00,0x00,0x01,0x40,0x70,0x01,0x38,0x40,0x40,0x44,0x59,0x41,0x41,0x61,0x01,0x09 ,0x30,0x00,/*-- 文字: 你 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x40,0xF0,0x2C,0x43,0x20,0x98,0x0F,0x0A,0xE8,0x08,0x88,0x28,0x1C ,0x08,0x00,0x00,0x00,0x7F,0x00,0x10,0x0C,0x03,0x21,0x40,0x3F,0x00,0x00,0x03,0x1C ,0x08,0x00};code unsigned char Table5[]={/*-- 调入了一幅图像:C:\Documents and Settings\sammy\桌面\小新.bmp --*//*-- 宽度x高度=64x64 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xF0 ,0xF8,0x7C,0x3C,0x1E,0x1E,0x8F,0xCF,0xCF,0xCF,0xDF,0x9F,0x9F,0x1F,0x1F,0x3F,0x3E ,0x3E,0x3E,0x7C,0x7C,0x7C,0xF8,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x20,0x10,0x08,0x08,0x1E,0x3F,0x7F,0x03 ,0x00,0x00,0x00,0x06,0x07,0x07,0x03,0x03,0x03,0x0F,0x3F,0x3F,0x7E,0x78,0x78,0x30 ,0x00,0x00,0x00,0x00,0x60,0xE0,0xF0,0x78,0x39,0x39,0x73,0xFE,0x60,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x03,0x04,0x08,0x11,0x08,0x04,0x83,0x80,0x0C,0x92,0xA2,0x44 ,0x22,0x12,0x00,0x00,0x00,0x00,0x00,0x0F,0x30,0x40,0x80,0x80,0x80,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x02,0x02,0x04,0x04,0x04,0x08,0x08,0x08,0x08,0x10,0x10,0x00 ,0x00,0x00,0x00,0x40,0x40,0x80,0x80,0x80,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x60,0x90,0x10,0x20,0x10,0x90,0x60,0x00,0x03,0x04,0x08,0x11,0x08,0x04,0x03 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x10 ,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x01,0x06,0xF8,0x00,0x00 ,0x00,0x00,0x00,0x01,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F ,0x7F,0xFF,0xF3,0xF3,0xFE,0xFC,0xFC,0xF8,0xF8,0xF0,0xF0,0xF0,0xE0,0xE0,0xE0,0xE0 ,0xE0,0xE0,0xE4,0xE0,0xE0,0xE0,0x10,0x10,0x10,0x08,0x08,0x04,0x02,0x01,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xD8,0xD8,0xFC ,0xFC,0xFC,0xFD,0xFD,0xFF,0xF7,0xF7,0xF7,0xF7,0xFF,0xFF,0xFF,0xFF,0xF3,0xF7,0xF7 ,0xFF,0xFF,0xFF,0xFD,0xFD,0xFC,0xDC,0xD8,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0 ,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0 ,0xC0,0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF};code uchar Table8[]={/*-- 文字: 相 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0xD0,0xFF,0x30,0x50,0x90,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE ,0x00,0x00,0x04,0x03,0x00,0xFF,0x00,0x00,0x01,0x00,0xFF,0x42,0x42,0x42,0x42,0xFF ,0x00,0x00,/*-- 文字: 约 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x60,0x58,0xC7,0x60,0x18,0x40,0x20,0x58,0x8F,0x08,0x08,0x08,0xF8 ,0x00,0x00,0x10,0x32,0x13,0x12,0x0A,0x0A,0x08,0x00,0x00,0x00,0x43,0x80,0x40,0x3F ,0x00,0x00,/*-- 文字: 丛 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFE,0x80,0x00,0x00,0x00 ,0x00,0x00,0x20,0x30,0x2C,0x23,0x20,0x21,0x36,0x2C,0x23,0x20,0x20,0x23,0x26,0x3C ,0x28,0x00,/*-- 文字: 林 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0x90,0xFF,0x90,0x10,0x00,0x10,0x10,0xD0,0xFF,0x90,0x10,0x10 ,0x10,0x00,0x08,0x06,0x01,0xFF,0x00,0x13,0x08,0x04,0x03,0x00,0xFF,0x01,0x06,0x18 ,0x08,0x00};code uchar Table9[]={/*-- 文字: 浪 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x30,0x01,0xC6,0x30,0x00,0xFC,0x94,0x95,0x96,0x94,0x94,0xFC,0x00 ,0x00,0x00,0x04,0x04,0xFE,0x01,0x00,0x00,0xFF,0x40,0x21,0x06,0x08,0x34,0x62,0xC2 ,0x40,0x00,/*-- 文字: 漫 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x20,0x81,0x66,0x00,0xC0,0x5F,0xD5,0x55,0x55,0xD5,0x55,0x5F,0xC0 ,0x00,0x00,0x04,0xFC,0x03,0x00,0x00,0x81,0x85,0x4D,0x55,0x25,0x35,0x4D,0xC5,0x41 ,0x00,0x00,/*-- 文字: 野 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x7E,0x4A,0xFE,0x4A,0x4A,0x7E,0x00,0x42,0x52,0xD2,0x6A,0x46,0xC2 ,0x40,0x00,0x22,0x22,0x22,0x1F,0x12,0x12,0x12,0x00,0x40,0x80,0x7F,0x00,0x00,0x00 ,0x00,0x00,/*-- 文字: 岭 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xF0,0x00,0xFF,0x00,0xF0,0x40,0x20,0x10,0x2C,0x43,0x04,0x08,0x70 ,0x20,0x00,0x08,0x1F,0x08,0x07,0x04,0x07,0x01,0x05,0x09,0x11,0x29,0x65,0x03,0x01 ,0x00,0x00};void Delay_us(unsigned int DelayTime){while(DelayTime) DelayTime--;}void Delay_x10ms(unsigned char DelayTime) //***************10ms延时**********//{unsigned char i,j,k;for(i=0;i<DelayTime;i++)for(j=0;j<10;j++)for(k=0;k<120;k++) {;}}/*----------------------------------------------------------------------------下面这个函数用于液晶模块的忙信号检测。
单片机程序大全

独立按键#include<reg52。
h>#define uchar unsigned char#define uint unsigned intsbit 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();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;}while(!K5);//等待按键释放}}P0=s8[num];}}#include<reg52.h>#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基准延时程序}}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;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){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。
单片机程序大全

单片机程序大全(以下是一个以“单片机程序大全”为题目的文章范例,依据题目性质并非一个合同或作文的格式。
请注意,这个范例只是为了明示写作格式的变化,并非提供一个实际的单片机程序大全。
)单片机程序大全本文将为大家提供一个全面的单片机程序大全,涵盖了各种常见的单片机应用。
希望本文能够对单片机程序的学习和实践有所帮助。
一、LED灯程序LED灯是一个常见的单片机实验项目。
以下是一个基本的LED灯闪烁程序的代码,使用C语言编写:```c#include <reg51.h>#define LED P0void delay(int time) {int i, j;for (i = 0; i < time; i++) {for (j = 0; j < 10000; j++) {; // 空循环,用于延时}}}void main() {while (1) {LED = 0xFF; // 所有LED灯亮delay(1000); // 延时1秒LED = 0x00; // 所有LED灯灭delay(1000); // 延时1秒}}```二、温度监测程序单片机可以用于温度监测,以下是一个简单的温度监测程序的代码示例,使用C语言编写:```c#include <reg51.h>#define TEMP P1void delay(int time) {int i, j;for (i = 0; i < time; i++) {for (j = 0; j < 10000; j++) {; // 空循环,用于延时}}}void main() {while (1) {if (TEMP > 30) {P0 = 0x01; // 温度过高,亮起警示灯 } else {P0 = 0x00; // 温度正常,灭掉警示灯 }delay(100); // 延时0.1秒}}```三、电机控制程序单片机常用于电机控制,以下是一个电机正反转控制程序的代码示例,使用C语言编写:```c#include <reg51.h>#define MOTOR P2void delay(int time) {int i, j;for (i = 0; i < time; i++) {for (j = 0; j < 10000; j++) {; // 空循环,用于延时}}}void main() {while (1) {MOTOR = 0x01; // 电机正转delay(1000); // 延时1秒MOTOR = 0x02; // 电机反转delay(1000); // 延时1秒}}```以上仅是三个简单的单片机程序示例,单片机的应用非常广泛,包括但不限于LED灯闪烁、温度监测、电机控制等。
单片机程序大全(29页)

单片机程序大全(29页)在单片机程序设计领域,有许多常用的程序,可以用于各种不同的应用。
本文将为您介绍一些常见的单片机程序,并提供相应的代码示例。
这些程序将涵盖从基本的输入/输出操作到复杂的控制算法。
无论您是初学者还是有一定经验的开发人员,我们相信本文都会对您有所帮助。
I. LED控制程序LED控制程序是单片机程序设计的基础,也是许多初学者的入门项目。
下面是一个简单的LED控制程序示例:```c#include <reg51.h>void delay(unsigned int milliseconds) {unsigned int i, j;for(i = 0; i < milliseconds; i++) {for(j = 0; j < 1000; j++);}}void main() {while(1) {P1 = 0xFF; // 将P1口的所有引脚设置为高电平(点亮LED)delay(1000); // 延时1秒P1 = 0x00; // 将P1口的所有引脚设置为低电平(熄灭LED)delay(1000); // 延时1秒}}```上述程序通过控制单片机的I/O口,实现了LED的闪烁效果。
其中,`delay`函数用于延时一定的时间,通过循环等待的方式实现。
II. 温度传感器数据采集程序许多实际应用中,我们需要使用温度传感器来采集环境温度数据。
下面是一个简单的温度传感器数据采集程序示例:```c#include <reg51.h>unsigned char readTemperature() {unsigned char temperature;// 温度传感器数据采集代码...// 在此省略实际的数据采集操作,以及与温度传感器通信的代码 // 假设最终采集到的温度数据存储在temperature变量中return temperature;}void main() {unsigned char temperature;while(1) {temperature = readTemperature();// 对温度数据进行处理和显示的代码...// 在此省略实际的数据处理和显示操作,以及与显示设备通信的代码}}```上述程序通过`readTemperature`函数模拟温度传感器的数据采集,并将采集到的温度数据存储在`temperature`变量中。
基于51单片机按键长按短按效果源程序
基于51单片机按键长按短按效果源程序[复制链接]* 实验名称:多位数按键加减** 晶振:12MHZ* 内容:按键加减数字,多个数码管显示,使用定时器做数码管动态扫描** 并区别长按短按效果,完全可以应用的实际生产中** ---------------------------------------------------------------*/#includ e<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit KEY_ADD=P3^3; //定义按键输入端口S17sbit KEY_DE C=P3^2; //S18#define DataPo rt P1 //定义数据端口程序中遇到D ataPo rt 则用P1 替换sbit LATCH1=P2^0;//定义锁存使能端口段锁存sbit LATCH2=P2^1;// 位锁存sbit P35 = P3^5;//这是为了关闭开发板上的点阵实际应用去掉unsign ed char code HEYAO_DuanM a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 显示段码值0123456789unsign ed char code HEYAO_WeiMa[]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};//分别对应相应的数码管点亮,即位码unsign ed char TempDa ta[8]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};//存储显示值的全局变量void DelayU s2x(unsign ed char t);//函数声明void DelayM s(unsign ed char t);void Init_T imer0(void);void Displa y(unsign ed char FirstB it,unsign ed char Num);/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsign ed char num=0,key_pr ess_n um;P35=0; //这是为了关闭开发板上的点阵实际应用去掉KEY_ADD=1; //按键输入端口电平置高KEY_DE C=1;Init_T imer0();while(1) //主循环{if(!KEY_ADD) //如果检测到低电平,说明按键按下DelayM s(10); //延时去抖,一般10-20msif(!KEY_ADD) //再次确认按键是否按下,没有按下则退出{while(!KEY_AD D){key_pr ess_n um++;DelayM s(10); //10x200=2000ms=2sif(key_pr ess_n um==200) //大约2s{key_pr ess_n um=0; //如果达到长按键标准//则进入长按键动作while(!KEY_ADD) //这里用于识别是否按//键还在按下,如果按//下执行相关动作,否则退出{if(num<99) //加操作num++;//即时把显示数据处理,如果去掉下面2//句处理信息,实际上看不到渐变效果,//而是看到跳变效果//用户可以自行屏蔽测试//分解显示信息,如要显示68,则68/10=6 68%10=8 TempDa ta[0]=HEYAO_DuanM a[num/10];TempDa ta[1]=HEYAO_DuanM a[num%10];DelayM s(50);//用于调节长按循环操作//的速度,可以自行调整此值以便达到最佳效果}}}key_pr ess_n um=0;//防止累加造成错误识别if(num<99) //加操作num++;}}if(!KEY_DEC) //如果检测到低电平,说明按键按下{DelayM s(10); //延时去抖,一般10-20msif(!KEY_DEC) //再次确认按键是否按下,没有//按下则退出{while(!KEY_DE C)key_pr ess_n um++;DelayM s(10);if(key_pr ess_n um==200) //大约2s{key_pr ess_n um=0;while(!KEY_DE C){if(num>0) //减操作num--;//分解显示信息,如要显示68,则68/10=6 68%10=8 TempDa ta[0]=HEYAO_DuanM a[num/10];TempDa ta[1]=HEYAO_DuanM a[num%10];DelayM s(50);//用于调节长按循环操作的速度}}}key_pr ess_n um=0;//防止累加造成错误识别if(num>0) //减操作num--;}}//分解显示信息,如要显示68,则68/10=6 68%10=8 TempDa ta[0]=HEYAO_DuanM a[num/10];TempDa ta[1]=HEYAO_DuanM a[num%10];// Displa y(0,8); //显示全部8位//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------uS延时函数,含有输入参数unsign ed char t,无返回值unsign ed char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayU s2x(unsign ed char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsign ed char t,无返回值unsign ed char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayM s(unsign ed char t){while(t--){//大致延时1mSDelayU s2x(245);DelayU s2x(245);}}/*------------------------------------------------显示函数,用于动态扫描数码管输入参数FirstB it 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。
经典单片机编程100例
经典单片机编程100例单片机是指具有微处理器内核、存储器和输入输出设备的集成电路芯片。
它广泛应用于各种电子设备中,例如家用电器、汽车电子、工业自动化等领域。
单片机编程是指通过给单片机内部写入特定的指令,使其按照程序逻辑完成特定的功能。
本文将介绍经典的单片机编程实例,帮助读者更好地理解和掌握单片机编程的基本原理和技巧。
1. LED闪烁程序在单片机编程中,最简单的实例之一就是控制LED灯的闪烁。
通过设置相应的IO口为输出模式,并在循环中对该IO口进行高低电平的切换,可以实现LED的闪烁效果。
以下是一个基本的LED闪烁程序示例:```c#include <reg51.h>sbit LED = P1^0;void delay(unsigned int t){while(t--);}void main(){while(1){LED = 0; // 点亮LEDdelay(50000);LED = 1; // 熄灭LEDdelay(50000);}}```上述代码中,通过设置P1口的第0位为1或者0,控制LED的亮灭状态,并在两个状态之间加入适当的延时,从而实现LED的闪烁。
2. 按键控制LED开关在单片机编程中,常常需要通过外部输入设备来控制其他设备的状态。
例如,通过按下按钮来控制LED的开关。
以下是一个简单的按键控制LED开关的程序示例:```c#include <reg51.h>sbit LED = P1^0;sbit Key = P0^0;void delay(unsigned int t){while(t--);}void main(){while(1){if(Key==0) // 如果按键被按下{LED = ~LED; // 取反LED的状态delay(50000); // 延时一段时间,防止按键抖动 while(Key==0); // 等待按键释放}}}```上述代码中,通过检测P0口的第0位,判断是否有按键按下。
单片机经典长短按程序
新型的按键扫描程序不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。
我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性。
同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点。
对于老鸟,我建议直接看那两个表达式,然后自己想想就会懂的了,也不需要听我后面的自吹自擂了,我可没有班门弄斧的意思,hoho~~但是对于新手,我建议将全文看完。
因为这是实际项目中总结出来的经验,学校里面学不到的东西。
以下假设你懂C语言,因为纯粹的C语言描述,所以和处理器平台无关,你可以在MCS-51,AVR,PIC,甚至是ARM平台上面测试这个程序性能。
当然,我自己也是在多个项目用过,效果非常好的。
好了,工程人员的习惯,废话就应该少说,开始吧。
以下我以AVR的MEGA8作为平台讲解,没有其它原因,因为我手头上只有AVR的板子而已没有51的。
用51也可以,只是芯片初始化部分不同,还有寄存器名字不同而已。
核心算法:unsigned char Trg;unsigned char Cont;void KeyRead( void ){unsigned char ReadData = PINB^0xff; // 1Trg = ReadData & (ReadData ^ Cont); // 2Cont = ReadData; // 3}完了。
有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!!下面是程序解释:Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。
1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。
2:算法1,用来计算触发变量的。
一个位与操作,一个异或操作,我想学过C 语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。
单片机按键-长按-短按-连发-双击-抬起-按下
/* 每次定义按键都给出按键编号, 用和按键状态码组成键值 */ /*按键编号定义*/ #define KEY_NUM_ZERO #define KEY_NUM_POWER
((unsigned char)(0x01)) ((unsigned char)(0x02))
/* 按键可以简单分成以下五种状态, 状态和按键编号组合成每个按键 不同状态下的按键值 */ /*按键状态码定义*/ #define KEY_NULL #define SHORT_CLICK #define LONG_CLICK #define DOUBLE_CLICK #define KEY_DOWN #define KEY_UP
(SHORT_CLICK | KEY_NUM_ZERO<<8) (LONG_CLICK | KEY_NUM_ZERO<<8) (DOUBLE_CLICK | KEY_NUM_ZERO<<8) (KEY_DOWN | KEY_NUM_ZERO<<8) (KEY_UP | KEY_NUM_ZERO<<8)
/* 每个按键都包括自己的属性 */ /*按键属性定义*/
typedef struct {
StatEnum_TypeDefstat; unsigned char KeyNum; unsigned short CountMs; unsigned short ShakeTimeMs; unsigned short LongClickTimeMs; unsigned short ContinueSendTimeMs; unsigned short DoubleClickTimeMs; unsigned char (*GetKeyStat)(void); }KeyAttribute_TypeDef;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机经典长短按程序新型的按键扫描程序不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。
我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性。
同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点。
对于老鸟,我建议直接看那两个表达式,然后自己想想就会懂的了,也不需要听我后面的自吹自擂了,我可没有班门弄斧的意思,hoho~~但是对于新手,我建议将全文看完。
因为这是实际项目中总结出来的经验,学校里面学不到的东西。
以下假设你懂C语言,因为纯粹的C语言描述,所以和处理器平台无关,你可以在MCS-51,AVR,PIC,甚至是ARM平台上面测试这个程序性能。
当然,我自己也是在多个项目用过,效果非常好的。
好了,工程人员的习惯,废话就应该少说,开始吧。
以下我以AVR的MEGA8作为平台讲解,没有其它原因,因为我手头上只有AVR的板子而已没有51的。
用51也可以,只是芯片初始化部分不同,还有寄存器名字不同而已。
核心算法:unignedcharTrg;unignedcharCont;voidKeyRead(void){unignedcharReadData=PINB^0某ff;//1Trg=ReadData&(ReadData^Cont);//2Cont=ReadData;//3}完了。
有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!!下面是程序解释:Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。
1:读PORTB的端口数据,取反,然后送到ReadData临时变量里面保存起来。
2:算法1,用来计算触发变量的。
一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。
3:算法2,用来计算连续变量。
看到这里,有种“知其然,不知其所以然”的感觉吧?代码很简单,但是它到底是怎么样实现我们的目的的呢?好,下面就让我们绕开云雾看青天吧。
我们最常用的按键接法如下:AVR是有内部上拉功能的,但是为了说明问题,我是特意用外部上拉电阻。
那么,按键没有按下的时候,读端口数据为1,如果按键按下,那么端口读到0。
下面就看看具体几种情况之下,这算法是怎么一回事。
(1)没有按键的时候端口为0某ff,ReadData读端口并且取反,很显然,就是0某00了。
Trg=ReadData&(ReadData^Cont);(初始状态下,Cont也是为0的)很简单的数学计算,因为ReadData为0,则它和任何数“相与”,结果也是为0的。
Cont=ReadData;保存Cont其实就是等于ReadData,为0;结果就是:ReadData=0;Trg=0;Cont=0;(2)第一次PB0按下的情况端口数据为0某fe,ReadData读端口并且取反,很显然,就是0某01了。
Trg=ReadData&(ReadData^Cont);因为这是第一次按下,所以Cont是上次的值,应为为0。
那么这个式子的值也不难算,也就是Trg=0某01&(0某01^0某00)=0某01Cont=ReadData=0某01;结果就是:ReadData=0某01;Trg=0某01;Trg只会在这个时候对应位的值为1,其它时候都为0Cont=0某01;(3)PB0按着不松(长按键)的情况端口数据为0某fe,ReadData读端口并且取反是0某01了。
Trg=ReadData&(ReadData^Cont);因为这是连续按下,所以Cont是上次的值,应为为0某01。
那么这个式子就变成了Trg=0某01&(0某01^0某01)=0某00Cont=ReadData=0某01;结果就是:ReadData=0某01;Trg=0某00;Cont=0某01;因为现在按键是长按着,所以MCU会每个一定时间(20m左右)不断的执行这个函数,那么下次执行的时候情况会是怎么样的呢?ReadData=0某01;这个不会变,因为按键没有松开Trg=ReadData&(ReadData^Cont)=0某01&(0某01^0某01)=0,只要按键没有松开,这个Trg值永远为0!!!Cont=0某01;只要按键没有松开,这个值永远是0某01!!(4)按键松开的情况端口数据为0某ff,ReadData读端口并且取反是0某00了。
Trg=ReadData&(ReadData^Cont)=0某00&(0某00^0某01)=0某00Cont=ReadData=0某00;结果就是:ReadData=0某00;Trg=0某00;Cont=0某00;很显然,这个回到了初始状态,也就是没有按键按下的状态。
总结一下,不知道想懂了没有?其实很简单,答案如下:Trg表示的就是触发的意思,也就是跳变,只要有按键按下(电平从1到0的跳变),那么Trg在对应按键的位上面会置一,我们用了PB0则Trg的值为0某01,类似,如果我们PB7按下的话,Trg的值就应该为0某80,这个很好理解,还有,最关键的地方,Trg的值每次按下只会出现一次,然后立刻被清除,完全不需要人工去干预。
所以按键功能处理程序不会重复执行,省下了一大堆的条件判断,这个可是精粹哦!!Cont代表的是长按键,如果PB0按着不放,那么Cont的值就为0某01,相对应,PB7按着不放,那么Cont的值应该为0某80,同样很好理解。
如果还是想不懂的话,可以自己演算一下那两个表达式,应该不难理解的。
因为有了这个支持,那么按键处理就变得很爽了,下面看应用:应用一:一次触发的按键处理假设PB0为蜂鸣器按键,按一下,蜂鸣器beep的响一声。
这个很简单,但是大家以前是怎么做的呢?对比一下看谁的方便?#defineKEY_BEEP0某01voidKeyProc(void){if(Trg&KEY_BEEP)//如果按下的是KEY_BEEP{Beep();//执行蜂鸣器处理函数}}怎么样?够和谐不?记得前面解释说Trg的精粹是什么?精粹就是只会出现一次。
所以你按下按键的话,Trg&KEY_BEEP为“真”的情况只会出现一次,所以处理起来非常的方便,蜂鸣器也不会没事乱叫,hoho~~~或者你会认为这个处理简单,没有问题,我们继续。
应用2:长按键的处理项目中经常会遇到一些要求,例如:一个按键如果短按一下执行功能A,如果长按2秒不放的话会执行功能B,又或者是要求3秒按着不放,计数连加什么什么的功能,很实际。
不知道大家以前是怎么做的呢?我承认以前做的很郁闷。
但是看我们这里怎么处理吧,或许你会大吃一惊,原来程序可以这么简单这里具个简单例子,为了只是说明原理,PB0是模式按键,短按则切换模式,PB1就是加,如果长按的话则连加(玩过电子表吧?没错,就是那个!)#defineKEY_MODE0某01//模式按键#defineKEY_PLUS0某02//加voidKeyProc(void){if(Trg&KEY_MODE)//如果按下的是KEY_MODE,而且你常按这按键也没有用,{//它是不会执行第二次的哦,必须先松开再按下Mode++;//模式寄存器加1,当然,这里只是演示,你可以执行你想//执行的任何代码}if(Cont&KEY_PLUS)//如果“加”按键被按着不放{cnt_plu++;//计时if(cnt_plu>100)//20m某100=2S如果时间到{Func();//你需要的执行的程序}}}不知道各位感觉如何?我觉得还是挺简单的完成了任务,当然,作为演示用代码。
应用3:点触型按键和开关型按键的混合使用点触形按键估计用的最多,特别是单片机。
开关型其实也很常见,例如家里的电灯,那些按下就不松开,除非关。
这是两种按键形式的处理原理也没啥特别,但是你有没有想过,如果一个系统里面这两种按键是怎么处理的?我想起了我以前的处理,分开两个非常类似的处理程序,现在看起来真的是笨的不行了,但是也没有办法啊,结构决定了程序。
不过现在好了,用上面介绍的办法,很轻松就可以搞定。
原理么?可能你也会想到,对于点触开关,按照上面的办法处理一次按下和长按,对于开关型,我们只需要处理Cont就OK了,为什么?很简单嘛,把它当成是一个长按键,这样就找到了共同点,屏蔽了所有的细节。
程序就不给了,完全就是应用2的内容,在这里提为了就是说明原理~~好了,这个好用的按键处理算是说完了。
可能会有朋友会问,为什么不说延时消抖问题?哈哈,被看穿了。
果然不能偷懒。
下面谈谈这个问题,顺便也就非常简单的谈谈我自己用时间片轮办法,以及是如何消抖的。
延时消抖的办法是非常传统,也就是第一次判断有按键,延时一定的时间(一般习惯是20m)再读端口,如果两次读到的数据一样,说明了是真正的按键,而不是抖动,则进入按键处理程序。
当然,不要跟我说你delay(20)那样去死循环去,真是那样的话,我衷心的建议你先放下手上所有的东西,好好的去了解一下操作系统的分时工作原理,大概知道思想就可以,不需要详细看原理,否则你永远逃不出“菜鸟”这个圈子。
当然我也是菜鸟。
我的意思是,真正的单片机入门,是从学会处理多任务开始的,这个也是学校程序跟公司程序的最大差别。
当然,本文不是专门说这个的,所以也不献丑了。
我的主程序架构是这样的:volatileunignedcharIntrcnt;voidInterruptHandle()//中断服务程序{Intrcnt++;//1m中断1次,可变}voidmain(void){SyInit();while(1)//每20m执行一次大循环{KeyRead();//将每个子程序都扫描一遍KeyProc();Func1();Funt2();while(1){if(Intrcnt>20)//一直在等,直到20m时间到{Intrcnt=\break;//返回主循环}}}}貌似扯远了,回到我们刚才的问题,也就是怎么做按键消抖处理。
我们将读按键的程序放在了主循环,也就是说,每20m我们会执行一次KeyRead()函数来得到新的Trg和Cont值。
好了,下面是我的消抖部分:很简单怎么判断按键释放?很简单,Trg和Cont都为0则肯定已经释放了。
这个需要有定时(按键间隔)调用函数,完成去抖,区别单次和长按,好的思路。
我想矩阵键盘也可以处理,只有键盘返回的码是唯一的,把PINB换成getkey之类的函数。
我想这个可能用来分析脉冲信号,比如红外遥控信号最简单矩阵键盘扫描程序矩阵按键扫描程序是一种节省IO口的方法,按键数目越多节省IO口就越可观,本程序的思路跟书上一样:先判断某一列(行)是否有按键按下,再判断该行(列)是那一只键按下。