四位数码管的显示程序
基于定时器的四位数码管时钟程序代码

实验名称:SUMA & BUZZER实验描述:一个带有闹钟的数码时钟,加三个键,一个调小时键一个调分钟键,一个设置闹钟时间键实验方法:TIMER0中断用来计时,控制数码时钟的时间显示还可设置半秒或四分之一秒,用来控制音调TIMER1用来控制音普,,timer0用MODE2自动加载模式*/# include<reg52.h>sbit speaker=P2^3 ;sbit AA=P2^2 ; //调时用sbit BB=P2^1 ; //调分用sbit CC=P2^0 ; // 设置闹钟用sbit P1_7=P1^7; //小数点// int code seven_reg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0123456789int code seven_reg[]={0x40,0x79,0x24,0x30,0x19,0x12,0x2,0x78,0x00,0x10};// int code scan[]={0x1F,0x2F,0x4F,0x8F}; //1110,1101,1011,0111int code scan[]={0x1,0x2,0x4,0x8}; //0001,0010,0100,1000unsigned int timer0_times;unsigned int timer1_times;unsigned int timer0_times_AA; //按纽AA用unsigned int timer0_times_BB; //按纽BB用unsigned int timer0_times_CC; // 半秒计时用unsigned int timer0_times_DD; //四分之一秒用unsigned int timer0_times_EE; // 闹钟用typedef struct{unsigned char second;unsigned char minute;unsigned char hour;unsigned char half_second;unsigned char alarm_hour;unsigned char alarm_minute;unsigned char quarter_second ;} time; //此处是固定格式,不能改time now;char mode=0;int i=0,j=0,k=0;int code tone[]={1012,956,852,759,716,638,568,506,478,426,379};//7()低音)1234567(中音)123(高音)int code song[22][2]={ {6,2},{6,2},{7,4},{6,2},{6,2}, {7,4},{6,2},{7,2},{8,2},{7,2},{6,2},{7,1},{6,1},{4,4},{3,2},{1,2},{3,2},{4,2},{3,2},{3,1},{1,1},{0,4}} ;/********************************************************************/void timer1_isr() interrupt TF1_VECTOR using 2{ TR1=0;TL1=(65536-tone[(song[j][0])])%256;TH1=(65536-tone[(song[j][0])])/256;TR1=1;speaker=~speaker;}/*******************************************************************/void timer0_isr() interrupt TF0_VECTOR using 1{/***************************************************/if(CC!=0) timer0_times_EE=0;else{ timer0_times_EE++;if(CC==0&&timer0_times_EE==4000) //按1S进入设置闹钟模式{mode++;//500 ~0.125sif(mode==2) mode=0;}}/**=调时键设置=*/if(AA!=0) timer0_times_AA=0;else{ timer0_times_AA++;if(AA==0&&timer0_times_AA==500&&mode==0)//500*0.25ms=0.125s{ now.hour++;// timer0_times_AA=0;if (now.hour==24) now.hour=0;//后边代码不会达到此效果}if(AA==0&timer0_times_AA==500&&mode==1) //设置闹钟时间HOUR{ now.alarm_hour++;if(now.alarm_hour==24) now.alarm_hour=0;}}/***=调分键设置=***/if (BB!=0) timer0_times_BB=0;else{ timer0_times_BB++;if(BB==0&&timer0_times_BB==500&&mode==0) //0.125s{ //timer0_times_BB=0;now.minute++;if(now.minute==60) now.minute=0;}if(BB==0&&mode==0){ if(timer0_times_BB==2000) //0.5s{ now.minute++;timer0_times_BB=1000;if(now.minute==60) now.minute=0;}}if(BB==0&&timer0_times_BB==500&&mode==1) //设置闹钟时间MINUTE { now.alarm_minute++;if(now.alarm_minute==60) now.alarm_minute=0;}if(BB==0&&mode==1){ if(timer0_times_BB==2000) //0.5s{ now.alarm_minute++;timer0_times_BB=1000;if(now.minute==60) now.minute=0;}}}/*=自然时间设置=*/timer0_times_DD++; //四分之一秒if(timer0_times_DD==1000){ now.quarter_second++;timer0_times_DD=0;if(now.quarter_second==60) now.quarter_second=0;} //二分之timer0_times_CC++;if(timer0_times_CC==2000){now.half_second++;timer0_times_CC=0;if(now.half_second==60) now.half_second=0;}timer0_times++; //一秒一分一时if (timer0_times==4000){ now.second++;timer0_times=0;if(now.second==60){ now.minute++;now.second=0;if(now.minute==60){ now.hour++;now.minute=0;if(now.hour==24) now.hour=0;} } }/******************扫描显示******************************/switch(mode){case 0 :{switch(i){ /*0.005秒选一次*/ case 0:P1=seven_reg[now.minute%10] ;if(now.half_second%2==0)P1_7=1; /*实现让它0.5秒闪一次*/break;case 1:P1=seven_reg[now.minute/10];//小数点不亮同,P1_7=1if(now.half_second%2==0)P1_7=1; /*为什么不能放在上一句前面昵????*/ break;case 2:P1=seven_reg[now.hour %10];break;case 3:P1=seven_reg[now.hour /10];break;}} break;case 1:{switch(i){case 0:P1=seven_reg[now.alarm_minute%10] ;break;case 1:P1=seven_reg[now.alarm_minute/10];break;case 2: P1=seven_reg[now.alarm_hour %10];break;case 3: P1=seven_reg[now.alarm_hour /10];break; }} break;}P3=scan[i];i++;if (i==4) i=0;if(now.quarter_second%2==0){ k++;if(k==(song[j][1]*4)){ j++;k=0;if(j==22) j=0;} } }/****************************************************************/void timer0_initialize(){ EA=0;TR0=0;TMOD=0X12;TL0=(256-250); //0.025ms 自动加载模式0.025*4000=1sTH0=(256-250);ET0=1;TR0=1;EA=1;}void timer1_initialize(){TR1=0;TL1=(65536-tone[song[j][0]])%256;TH1=(65536-tone[song[j][0]])/256;TMOD=0X12;ET1=1;}main(){ unsigned char m1=0;speaker=0;now.alarm_minute=1;timer0_initialize();timer1_initialize();while(1){if(now.alarm_minute!=0)//将闹钟设置为0时,相当于取消闹钟,不会响{ if(now.hour==now.alarm_hour&&now.minute==now.alarm_minute) { if(CC==0&&timer0_times_EE==500) m1=1;switch (m1){ case 0:TR1=1 ;break;case 1 :TR1=0;speaker=0;break;}}else{TR1=0;speaker=0;m1=0;} } } }#include<reg52.h>sbit P10=P1^0; //第0位数码管sbit P11=P1^1;sbit P12=P1^2;sbit P13=P1^3;#define THCO 0xee#define THLO 0x00unsigned char miao=0,fen=0,shi=0;unsigned char code duan[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; main(void){TMOD=0x11;TH0=THCO;TL0=THLO;EA=1;ET0=1;TR0=1;while(1);}void timw0() interrupt 1{static unsigned char c=0,k=0;TH0=THCO;TL0=THLO;P1|=0xff;c++;if(c>200) {miao++;if(miao>=60){miao=0;fen++;}if(fen>=60){shi++;fen=0;}c=0;}if(k>3){k=0;}k++;switch(k-1){case(0):P10=0;P0=duan[shi/10];break;case(1):P11=0;P0=duan[shi%10];break;case(2):P12=0;P0=duan[fen/10];break;case(3):P13=0;P0=duan[fen%10];break;}}这是时钟程序,可以运行,无小数点,显示时分,小数点断码是0x80,其余的只有靠你自己了。
数码管动态显示c语言程序

//这是一个,四位数码管动态显示c语言程序,每隔一秒加一,直至加到9999为止#include <reg52.h>unsigned char code LED[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; unsigned char LEDbuff[]={0xff,0xff,0xff,0xff};//定义数码管的位选段sbit SEG_bit_1 = P0^1;sbit SEG_bit_2 = P0^2;sbit SEG_bit_3 = P0^3;sbit SEG_bit_4 = P0^4;unsigned int cnt=0;unsigned int sec =0;unsigned char i=0;void main(){TMOD=0x01; /*设置定时器*/TH0=0xfc;TL0=0x18;TR0=1;EA=1; /*设置中断*/ET0=1;while(1){if(0==TF0){if(cnt>=1000){cnt=0;sec++;LEDbuff[0]=LED[sec%10]; /*设置数码管显示位*/LEDbuff[1]=LED[sec/10%10];LEDbuff[2]=LED[sec/100%10];LEDbuff[3]=LED[sec/1000%10];}}}}void interrupttimer0() interrupt 1 /*设置中断函数*/{TH0=0xfc;TL0=0x18;cnt++;P1=0xff;switch(i){case 0: SEG_bit_1 = 1;SEG_bit_4 = 0;P1=LEDbuff[0];i++;break;case 1: SEG_bit_4 = 1;SEG_bit_3 = 0;P1=LEDbuff[1];i++;break;case 2: SEG_bit_3 = 1;SEG_bit_2 = 0;P1=LEDbuff[2];i++;break;case 3: SEG_bit_2 = 1;SEG_bit_1 = 0;P1=LEDbuff[3];i=0;break;default:break;}}教你如何用WORD文档(2012-06-27 192246)转载▼标签:杂谈1. 问:WORD 里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同?答:分节,每节可以设置不同的页眉。
《FPGA设计与应用》数码管显示实验

《FPGA设计与应用》数码管显示实验一、实验目的1.学习动态数码管的工作原理;2.实现对EGO1开发板四位动态数码管的控制;二、实验内容实现对EGO1开发板四位动态数码管的控制,使其能够正常工作;三、实验要求在EGO1开发板上显示想要的数字。
四、实验背景知识1.LED数码管基础知识在数码管上显示数字就是将相应的段位点亮组成要显示的数字,共阴数码管的码值表如下所示,‘1’代表相应的管脚输出高电平,点亮相应段位,‘0’代表相应的管脚输出低电平,不点亮相应段位。
2.动态数码管原理EGO1 开发板上使用的是共阴极动态数码管,这种数码管有四个共阴极分别选通对应的每位数码管,四位数码管的八个段码脚连接在一起。
动态数码管显示的原理是:每次选通其中一位,送出这位要显示的内容,然后一段时间后选通下一位送出对应数据,4 个数码管这样依次选通并送出相应的数据,结束后再重复进行。
这样只要选通时间选取的合适,由于人眼的视觉暂留,数码管看起来就是连续显示的。
五、实验方案及实现1、数码管显示的设计共分3个模块:(1)数码管封装模块(2)数码管设计模块(3)顶层模块数码管封装模块代码:module smg_ip_model(clk,data,sm_wei,sm_duan);input clk;input [15:0] data;output [3:0] sm_wei;output [7:0] sm_duan;integer clk_cnt;reg clk_400Hz;always @(posedge clk)if(clk_cnt==32'd100000)begin clk_cnt <= 1'b0; clk_400Hz <= ~clk_400Hz;endelseclk_cnt <= clk_cnt + 1'b1;reg [3:0]wei_ctrl=4'b1110;always @(posedge clk_400Hz)wei_ctrl <= {wei_ctrl[2:0],wei_ctrl[3]}; reg [3:0]duan_ctrl;always @(wei_ctrl)case(wei_ctrl)4'b1110:duan_ctrl=data[3:0];4'b1101:duan_ctrl=data[7:4];4'b1011:duan_ctrl=data[11:8];4'b0111:duan_ctrl=data[15:12];default:duan_ctrl=4'hf;endcasereg [7:0]duan;always @(duan_ctrl)case(duan_ctrl)4'h0:duan=8'b0011_1111;4'h1:duan=8'b0000_0110;4'h2:duan=8'b0101_1011;4'h3:duan=8'b0100_1111;4'h4:duan=8'b0110_0110;4'h5:duan=8'b0110_1101;4'h6:duan=8'b0111_1101;4'h7:duan=8'b0000_0111;4'h8:duan=8'b0111_1111;4'h9:duan=8'b0110_1111;4'ha:duan=8'b0111_0111;4'hb:duan=8'b0111_1100;4'hc:duan=8'b0011_1001;4'hd:duan=8'b0101_1110;4'he:duan=8'b0111_1000;4'hf:duan=8'b0111_0001;数码管设计模块module test(clk,data);input clk;output [15:0]data;reg clk_1Hz;integer clk_1Hz_cnt;always @(posedge clk)if(clk_1Hz_cnt==32'd2*******-1)begin clk_1Hz_cnt <= 1'b0; clk_1Hz <= ~clk_1Hz;end elseclk_1Hz_cnt <= clk_1Hz_cnt + 1'b1;reg [39:0]disp=40'h1234567890;reg [15:0]data;always @(posedge clk_1Hz)begindisp <= {disp[35:0],disp[39:36]};data <= disp[39:24];endEndmodule顶层模块module smg_ip(clk,sm_wei,sm_duan);input clk;output [3:0]sm_wei;output [7:0]sm_duan;wire [15:0]data;wire [3:0]sm_wei;wire [7:0]sm_duan;test U0 (.clk(clk),.data(data));smg_ip_model U1(.clk(clk),.data(data),.sm_wei(sm_wei),.sm_duan(sm_duan)); endmodule六、实验结果Vivado仿真:上实验板实操:七、实验心得次实验主要学习了利用vivado软件实现数码管的显示,利用编程来实现,并且还对动态数码管的原理进行了一定的学习,包括上次实验学习到的模块化设计,方便程序的调试,程序运行过程中并不顺利,一直没有创建出pin文件夹,最后还是在老师的帮助下完成了pin文件夹的创建,导入到板子后完成了本次实验的设计。
数码管显示程序

数码管显示程序一、程序X11、程序X1的功能:最右边的数码管显示“0”2、程序:ORG 0LJMP STRORG 0100HSTR: MOV P3, #0FEH ;送最低位有效的位码MOV P0, #0C0H ;送“0”的段码“0C0H”SJMP STREND二、程序X2: 用查表方式显示某个显示缓冲器中的数字1、查表显示的预备知识设从右到左各显示器对应的显示缓冲器为片内RAM79H~7EH3、 实例:例:已知(79H )= 0 7H , 查段码表在最右边的数码管显示79H 中的“7”;注:共阳极的段码表:TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HDB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH若:(A )= 0XH则数字“X ”对应的段码在段码表中的表地址 = TAB + XORG 0LJMP STRORG 0100H① 各显示器与显示缓冲器地址对应关系显示缓冲器: 7EH 7DH 7CH 7BH 7AH 79H对应显示器:② 显示缓冲器的值与显示数字的关系:显示缓冲器中的值 对应段码表地址 显示的数字0XH表首址+OXH XSTR: MOV P3, #11111110B ;送最低位有效的位码MOV 79H , #07H ;送要显示的数据到显示缓冲器MOV A , 79H ;显示缓冲器的数作为查表变址送A MOV DPTR , #TAB ;表首址送DPTRMOVC A , @A+ DPTR ;查表将数字转换为对应段码MOV P0, A ; 段码送段码口(P0)SJMP STRTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEHEND例2:. 查段码表在最右边的数码管循环显示“0”~“F”ORG 0LJMP STRORG 0100HSTR: MOV P3, #11111110B ;送最低位有效的位码LP0: MOV 79H , #0H ;送要显示的数据的初值到显示缓冲器MOV R3 , #6 ; 送要显示的数据的个数LP: MOV A , 79H ;显示缓冲器的数作为查表变址送A MOV DPTR , #TAB ;表首址送DPTRMOVC A , @A+ DPTR ;查表将数字转换为对应段码MOV P0, A ; 段码送段码口(P0)LCALL SE19INC 79HDJMZ R3 ,LPSJMP LP0TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEHSE19: MOV R6 , #0A0HLO36: MOV R7 , #0FFHLO35: DJNZ R7 , LO35DJNZ R6 , LO36RETEND3、修改程序查段码表在最左边的数码管循环显示“0”~“9”三、对6个数码管的操作程序X3四、功能:通过查表使6个数码管从右到左依次循环显示对应显示缓冲器79H~7EH中的数字0~51.程序:ORG 0LJMP X3ORG 0100HX3: SETB RS1 ;选工作寄存器2MOV SP , #40H ;设置堆栈指针MOV R0 , #79H ;对79H~7EH单元送0~5MOV R2 , #6 ;CLR A ;LP0: MOV @R0 , AINC AINC R0DJNZ R2, LP0LP1: M OV 30H , #11111110B ;对字位口送选择第一个数码管的位电平;反相后得有效的位码01H(共阳极) MOV R2 , #6 ;送数码管个数,即重复操作的次数 MOV R0 , #79H ;送第一个数码管对应的显存地址LP: MOV A ,30H ;送位码MOV P3 , A ;MOV A , @R0 ;要显示的数字送AMOV DPTR , #TAB ;送段码表的首地址MOVC A , @A + DPTR ;查表将A中的数字转换为其对应的段码MOV P0 , A ; 段码送段码口LCALL SE19 ;调延时MOV A , 30H ;位码左移一位,变为使下一个数码管的位;电平有效的位码RL A ;MOV 30H , A ;位码存回30H,解放AINC R0 ;显存地址加1,指向下一个显存地址DJNZ R2 , LP ;(R2)- 1不为0(即没有使所有数码管都显;示),转LP,继续使下一个数码管显示的操作。
4位拨动开关控制数码管显示系统设计

4位拨动开关控制数码管显⽰系统设计务书设计题⽬4位拨动开关控制数码管显⽰系统设计学⽣姓名设计要求:1.电源电路具有电源开关及指⽰灯,有复位按键;2.⾼4位开关屏蔽;3.⽤4位拨码开关为输⼊,控制数码管显⽰器的输出;4.实现功能:通电复位后数码管全显即显“8”,数码管对应4位DIP开关的⼆进制输⼊显⽰⼗六进制全部字符即从“0”到“F”。
学⽣应完成的⼯作:1.了解单⽚机系统的设计⽅法,设计步骤;2.查找并收集相关资料书籍;3.完成硬件原理图设计;4.完成软件和流程图的设计;5.对系统进⾏仿真;6.焊接电路板,调试系统;7.认真撰写课程设计报告。
8.孙晓界同学主要负责软件设计参考⽂献阅读:[1] 张毅刚,彭喜元,彭宇. 单⽚机原理及应⽤[M]. 北京:⾼等教育出版社,2009.[2] 杜树春. 单⽚机C语⾔和汇编语⾔混合编程实例详解[M]. 北京:北京航空航天⼤学出版社,2006.[3] 童诗⽩,华成英. 模拟电⼦技术基础(第四版)[M]. 北京:⾼等教育出版社,2006.[4] 林志琦. 基于Proteus的单⽚机可视化软硬件仿真[M]. 北京:北京航空航天⼤学出版社,2006. ⼯作计划:5⽉6⽇:查阅相关资料,拟定⽅案;5⽉7⽇:进⾏⽅案论证,完善设计⽅案;5⽉8⽇:完成硬件设计;5⽉9⽇:设计程序流程图;5⽉10⽇:完成软件设计,并进⾏仿真和调试;5⽉13⽇:进⾏焊接;5⽉14⽇:烧写程序;5⽉15⽇:调试电路;5⽉16⽇:与辅导⽼师交流,写课程设计报告;5⽉17⽇:上交课程设计报告及实物。
任务下达⽇期:2013 年5⽉ 6 ⽇任务完成⽇期:2013 年5⽉17 ⽇指导教师(签名):学⽣(签名):4位拨动开关控制数码管显⽰系统设计摘要:⽤AT89S52单⽚机作为核⼼,利⽤晶振,共阳极数码管,7805,桥堆2w10等器件进⾏设计,由电源电路、复位电路、时钟电路、输⼊输出电路等设计⼀个控制电路。
利⽤汇编编写控制程序,程序使⽤查表法进⾏编写。
单片机实验3 数码管控制实验-动态显示

;实验名称:数码管动态显示
;功能:4位数码管循环显示“0123”“4567”“89AB”“CDEF”,间隔0.5S。
;编写人:陈建泽
;编写时间:2010年11月2日
/**********************程序代码************************/
D1MS: MOV R2,#250 ;250*(1+1+2)=1000us=1ms
L1:NOP
NOP
DJNZ R2,L1
RET
/*****************中断服务子程序*****************/
T0_INT:MOV TH0,#(65536-50000)/256
MOV TL0,#(65536-50000)MOD 256
MOV A,R4
CJNE A,#16,L3
AJMP MAIN
L3:MOV R5,A
AJMP L1
DIS:MOV P2,R6;用A作为中间寄存器,因后面要循环显示
MOV A,R5
ACALL SQR ;查表
MOV P0,A
ACALL D1MS ;1ms
INC R5
MOV A,R6
RL A;指向下一位
MOV R6,A
RET;子程序返回
TAB: DB 0C0H,0F9H,0A4H,0B0H ;共阳极字型码表0、1、2、3
DB 99H, 92H, 82H, 0F8H;共阳极字型码表4、5、6、7
DB 80H, 90H, 88H, 83H;共阳极字型码表8、9、A、B
DB 0C6H,0A1H,86H, 8EH;共阳极字型码表C、D、E、F
51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。
最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。
4位数码管计时器程序

/******************************************************************************************* **/#include<STC12C2052AD.H>//STC头文件/******************************************************************************************* ***///“程序开发调试设置项”#define DY_LI 9 //设置LED显示的亮度(值域:~9)#define DY_DELAY 12 //设置每一个点显示的时间长度(~20)/******************************************************************************************* ***/sbit DY_LED1_H1 =P3 ^ 0; //设置LED点阵屏连接的I/O口sbit DY_LED1_H2 =P3 ^ 1; //设置LED点阵屏连接的I/O口sbit DY_LED1_H3 =P3 ^ 2; //设置LED点阵屏连接的I/O口sbit DY_LED1_H4 =P3 ^ 3; //设置LED点阵屏连接的I/O口sbit DY_LED1_L1 =P1 ^ 0; //设置LED点阵屏连接的I/O口sbit DY_LED1_L2 =P1 ^ 1; //设置LED点阵屏连接的I/O口sbit DY_LED1_L3 =P1 ^ 2; //设置LED点阵屏连接的I/O口sbit DY_LED1_L4 =P1 ^ 3; //设置LED点阵屏连接的I/O口sbit DY_LED1_L5 =P1 ^ 4; //设置LED点阵屏连接的I/O口sbit DY_LED1_L6 =P1 ^ 5; //设置LED点阵屏连接的I/O口sbit DY_LED1_L7 =P1 ^ 6; //设置LED点阵屏连接的I/O口sbit DY_LED1_L8 =P1 ^ 7; //设置LED点阵屏连接的I/O口//sbit DY_BEEP =P2 ^ 2; //扬声器//sbit DY_KEY1 =P0 ^ 2; //按键(M键)(连接在P1.3和P0.2,读P0.2为低时表示有按键动作)//sbit DY_KEY2 =P3 ^ 0; //按键(+键)(连接在P4.6和P3.0,读P3.0为低时表示有按键动作)//sbit DY_KEY3 =P3 ^ 6; //按键(-键)(连接在P2.4和P3.6,读P3.6为低时表示有按键动作)#define DY_P1M0SET 0x00 //设置I/O口工作方式//00000000(左到右,高到低位)#define DY_P1M1SET 0x00 //设置I/O口工作方式//00101000#define DY_P3M0SET 0x00 //设置I/O口工作方式//00000000#define DY_P3M1SET 0xff //设置I/O口工作方式//10010100data unsigned char TIME_DD,TIME_MO,TIME_YY,TIME_WW,TIME_HH,TIME_MM,TIME_SS,ty;//设置日、月、年、周、时、分、秒和温度存放区data unsigned char cou = 0; // 软计数器,对ms时基信号累加到sdata unsigned char bn;//扫描映射全局变量data unsigned char KEY_BIT = 0;//按键值data unsigned char DY_PWM;//显示亮度data unsigned char DY_PWM2;//显示暂存unsigned char code disdata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //无小数点数码管段码表(0~9)};/******************************************************************************************* **/void delay (unsigned int a){ // 用于点扫描的延时unsigned int i;while( --a != 0){for(i = 0; i < DY_DELAY; i++);}}/******************************************************************************************* **/void delay1ms (unsigned int a){ // 1ms延时程序(MHz 10倍于单片机速度时)unsigned int i;while( --a != 0){for(i = 0; i < 600; i++);}}/******************************************************************************************* **/void dis_off (void){P1 = ~DY_P1M1SET; //关所有显示P3 = ~DY_P3M1SET;delay(10-DY_PWM);}/******************************************************************************************* **/void displayHH1 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H1 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H1 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H1 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H1 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();i = d & 0x10;if(i == 0x10){DY_LED1_H1 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H1 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H1 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H1 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void displayHH2 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H2 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H2 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H2 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H2 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();i = d & 0x10;if(i == 0x10){DY_LED1_H2 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H2 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H2 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H2 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void displayHH3 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H3 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H3 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H3 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H3 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();i = d & 0x10;if(i == 0x10){DY_LED1_H3 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H3 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H3 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H3 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void displayHH4 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H4 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H4 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H4 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H4 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();if(i == 0x10){DY_LED1_H4 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H4 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H4 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H4 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void diplay_data (unsigned char l,unsigned char d){switch (l){//显示的列位置case 1://displayHH1(d); //将显示数据送入break;//case 2://displayHH2(d); //将显示数据送入break;//case 3://displayHH3(d); //将显示数据送入break;//case 4://displayHH4(d); //将显示数据送入break;//}}/******************************************************************************************* **/void init (void){ //上电初始化P1M0 = DY_P1M0SET;P1M1 = DY_P1M1SET;P3M0 = DY_P3M0SET;P3M1 = DY_P3M1SET;////dis_off();DY_PWM = DY_LI;////TMOD = 0x11; // 定时/计数器,1工作于方式TH0 = 0x3c; // 预置产生ms时基信号EA = 1; // 开总中断ET0 = 1; // 定时/计数器允许中断TR0 = 1; // 开闭定时/计数器//////TIME_DD = 18; //时间在首次使用的值,之后会在EEPROM自动记录上一天的值//TIME_MO = 5; //初始时间:年月日周一,时分秒//TIME_YY = 9;//TIME_WW = 1;//TIME_HH = 22;//TIME_MM = 13;//TIME_SS = 40;}/******************************************************************************************* **/void main (void){ //主程序init();while (1){diplay_data (1,disdata[TIME_MM/10]);diplay_data (2,disdata[TIME_MM%10]);diplay_data (3,disdata[TIME_SS/10]+0x80);diplay_data (4,disdata[TIME_SS%10]+0x80);}}/******************************************************************************************* ***/void tiem0(void) interrupt 1{ // T/C0中断服务程序(产生ms时基信号)cou++; // 软计数器加if(cou > 19){ // 计数值到(1s)cou = 0; // 软计数器清零TIME_SS++; // 秒计数器加(进位ms*100=1s)if(TIME_SS > 59){ // 秒计数值到TIME_SS = 0; // 秒计数器清零TIME_MM++; // 分计数器加(进位s=1m)if(TIME_MM > 59){ // 分计数到TIME_MM = 0; // 分计数器清零TIME_HH++; // 时计数器加(进位m=1h)if(TIME_HH > 23){ // 时计数到TIME_HH = 0; // 时计数器清零}}}}TH0 = 0x3c; // 重置定时常数TL0 = 0xb0;}/******************************************************************************************* ***//*************************************************************/*************************************************************/。
实验四 数码管显示控制

实验四数码管显示控制一、实验目的1、熟悉Keil uVision2软件的使用;2、掌握LED数码管显示接口技术;3、理解单片机定时器、中断技术。
二、实验设备及仪器Keil μVision2软件;单片机开发板;PC机一台三、实验原理及内容1、开发板上使用的LED 数码管是四位八段共阴数码管(将公共端COM接地GND),其内部结构原理图,如图4.1所示。
图4.1共阴四位八段LED数码管的原理图图4.1表明共阴四位八段数码管的“位选端”低电平有效,“段选端”高电平有效,即当数码管的位为低电平,且数码管的段为高电平时,相应的段才会被点亮。
实验开发板中LED数码管模块的电路原理图,如图4.2所示。
SP1a~hP0.4~P0.7SP2P0.0~P0.3图4.2 LED数码管模块电路原理图图中,当P1.0“段控制”有效时,P0.0~P0.7分别对应到数码管的a~h段。
当P1.1“位控制”有效时,P0.0~P0.7分别对应到DIG1~DIG8。
训练内容一:轮流点亮数码管来检测数码管是否正常。
参考程序:ORG 00HAJMP MAINMAIN:SETB P1.2;LED流水灯模块锁存器的控制位MOV P0,#0FFH;关闭LED灯CLR P1.2SETB P1.3 ;点阵模块的行控制锁存器MOV P0,#0 ;关闭点阵行CLR P1.3MOV A,#11111110B;数码管“位选信号”初值,低电平有效LOOP:SETB P1.1;数码管位控制锁存器有效MOV P0,ACLR P1.1RL A ;形成新的“位选信号”,为选择下一位数码管做准备SETB P1.0;数码管段控制锁存器有效MOV P0,#0FFH ;数码管的所有段点亮,显示“8”CLR P1.0CALL DELAYSJMP LOOPDELAY:MOV R5,#0;延时子程序D1: MOV R6,#0D2:NOPDJNZ R6,D2DJNZ R5,D1RETEND训练内容二:静态显示,0~9计数。
四位数码管(动态) - C51程序详解

/*-----------------------------------------------------方案要求:上电一个LED一直闪,四位数码管9999循环正计数思路:用两个定时器分别控制LED和数码管----------------------------------------------------------*/#include <reg51.h>//51头文件#define Uchar unsigned char//宏定义,用Uchar来代表关键词unsigned char(无符号字符型数据)#define Uint unsigned int//宏定义,用Uchar来代表关键词unsigned int(无符号整型数据)sbit seg = P2^6; //位声明,声明该位用于控制数码管的笔画.sbit com = P2^7;//位声明,声明该位用于控制数码管的公共端.sbit LED = P1^0;//位声明,声明该位用于控制一个LED亮灭.Uchar displ[]= //声明数组,displ是自定义数组名,[]是叫下标的,里面本应填元素个数,但可以不填.{0x3f,0x06,0x5b,0x4f, //这些都是叫数组的元素,按顺序排放,从左到右,从上到下.0x66,0x6d,0x7d,0x07,0x7f,0x6f,//这是共阴数码管,ox7f=01111111 ,如果该数(8字)是10000000则是共阳.};Uint number, number1, number2, qian, bai, shi, ge; //定义多个全局变量,以便后面要用到void delay_mS (Uint k)//延时子程序,k为形参,在显示子程序里会传递实参来进行计算{Uint i,j;//定义两个局部变量for(i=k; i>0; i--)//k接到实参后,如果i大于0,那么让i自减1,再执行{ }内的for语句,然后再判断i是否大于0,{for(j=110; j>0; j--);}//直到i=0(不大于0),该延时子程序才算执行完成,跳出。
4bitled数码管

4位LED数码管是一种常见的电子显示器件,由4个7段LED数码管组合而成,可以显示0-9的数字和某些英文字母。
每个7段LED数码管由7个LED发光二极管组成,可以显示数字或字母的轮廓。
通过控制每个LED的亮灭,可以显示出不同的数字和字母。
4位LED数码管通常具有公共端,可以通过控制公共端的电平来选择要显示的数码管。
同时,每个数码管的7个LED也可以通过控制相应的引脚来控制其亮灭,从而实现数字的显示。
在实际应用中,4位LED数码管常用于数字显示、计时器、频率计等场合。
由于其亮度高、寿命长、驱动简单等优点,因此在电子产品中得到了广泛的应用。
总之,4位LED数码管是一种非常实用的电子显示器件,可以满足各种数字显示需求,为电子产品增添更多的功能和美观性。
四位秒表程序

重赏之下心有勇夫^_^;汇编时钟程序。
4位共阳管。
P0口段码,P2.0~P2.3位码。
显示毫秒和秒。
三个按键一个控制时钟开始走,一个控制暂停和继续。
一个按键清0;12M晶振 2011 04 20 调试完成STRT EQU P3.2STP EQU P3.3CLRR EQU P3.5ORG 00HSJMP MAINORG 0BHAJMP T0INTORG 30HMAIN: MOV SP,#60HMOV R3,#10MOV R4,#20MOV TMOD,#01H ;定时器T0工作方式1MOV TH0,#0D8H ;10MS定时初值MOV TL0,#0F0HSETB ET0SETB EAk1: LCALL DISPJB STRT,K2LCALL DISPJNB STRT,$-3AJMP STARTk2: LCALL DISPJB STP,K3LCALL DISPJNB STP,$-3AJMP SSK3: LCALL DISPJB CLRR,K1LCALL DISPJNB CLRR,$-3AJMP CLEARSTART: SETB TR0CLR F0 ;如无此条,暂停后,不是按继续键,而是按开始键继续走时,下次按暂停键时,不能暂停AJMP K1SS: CPL F0JNB F0,STARTSTOP: CLR TR0AJMP K2CLEAR: CLR TR0MOV A,#0MOV 20H,AMOV 21H,AMOV 22H,AMOV 23H,AMOV 24H,AMOV 25H,AAJMP K3DISP: MOV A,24HMOV B,#10DIV ABMOV 20H,B ;余数(MS个位数)MOV 21H,A ;商(MS十位数)MOV A,25HMOV B,#10DIV ABMOV 22H,B ;余数(S个位数)MOV 23H,A ;商(S十位数)MOV A,20H ;MS个位ACALL SEG7MOV P0,ASETB P2.4ACALL DLYCLR P2.4MOV A,21H ;MS十位ACALL SEG7MOV P0,ASETB P2.5ACALL DLYCLR P2.5MOV A,22H ;S个位ACALL SEG7MOV P0,ACLR P0.7SETB P2.6ACALL DLYCLR P2.6MOV A,23H ;S十位ACALL SEG7MOV P0,ASETB P2.7ACALL DLYCLR P2.7RETT0INT: MOV TH0,#0D8H MOV TL0,#0F0HINC 24HMOV A,24HCJNE A,#99,T0INTRMOV 24H,#0INC 25HMOV A,25HCJNE A,#60,T0INTRMOV 25H,#0T0INTR: RETIDLY: MOV R7,#10D1: MOV R6,#50DJNZ R6,$DJNZ R7,D1RETSEG7: INC AMOVC A,@A+PCRETDB 0C0H;0DB 0F9H;1DB 0A4H;2 DB 0B0H;3 DB 099H;4 DB 092H;5 DB 082H;6 DB 0F8H;7 DB 080H;8 DB 090H;9 END2STRT EQU P1.0CLRR EQU P1.1ORG 00HAJMP MAINORG 0BHAJMP T0INT0ORG 30HMAIN:MOV SP,#60HMOV R4,#20MOV TMOD,#01HMOV TH0,#3CH;12M晶振时定时初值取#3CB0H,还可细调如TL=#0B7H,可以更准MOV TL0,#0B0HSETB ET0SETB EAk1:ACALL DISP ;开始/暂停键JB STRT,K2ACALL DISPJNB STRT,$-2AJMP K1K2:JB CLRR,K1ACALL DISPJNB CLRR,$-2MOV A,#0CLR TR0MOV 26H,AMOV 27H,AMOV 28H,AAJMP K2DISP:MOV A,26HMOV B,#10DIV ABMOV 20H,B ;余数(百分秒位数)MOV 21H,A ;商(十分秒位数)MOV A,27HMOV B,#10DIV ABMOV 22H,B ;余数(秒个位数)MOV 23H,A ;商(秒十位数)MOV A,28HMOV B,#10DIV ABMOV 24H,B ;余数(分个位数)MOV 25H,A ;商(分十位数)MOV A,20H ;百分秒?ACALL SEG7MOV P0,ACLR P2.3ACALL DLYSETB P2.3MOV A,21H ;十分秒ACALL SEG7MOV P0,AACALL DLYSETB P2.2DISP1:MOV A,22H ;秒个位ACALL SEG7MOV P0,ASETB P0.7CLR P2.1ACALL DLYSETB P2.1MOV A,23H ;秒十位ACALL SEG7MOV P0,ACLR P2.0ACALL DLYSETB P2.0RETT0INT0:MOV TH0,#3CH; ;定时中断子程序。
课题四 数码管显示

图4-1 数码管显示实物图
任务一
LED数码管的静态显示
本任务就是将单片机与数码管接成图 4-2所示静态显示方式,编程实现数码管 每隔0.5s的0-9数字显示。
图4-2
数码管显示电路图
一、任务分析
所谓静态显示,就是当单片机某一端口输出 一组显示数据之后,该端口一直保持该数据输出, 维持数码管的显示数字,直到端口数据改变,又 保持显示下一数据的显示方式。 在具体电路连接上,将单片机一个端口的八 个端子接在一只数码管的八个引脚上(h端为小数 点),控制数码管的七段LED的亮或熄,显示器 出数字,这种显示控制方式就是静态显示。静态 显示电路连接特点是单片机端口的每一位与数码 管的一个端相连接,相当于单片机的一个引脚外 接一只发光二极管。
unsigned char dispcount; void delay02s(void) { unsigned char i,j,k; for(i=10;i>0;i--) for(j=200;j>0;j--) for(k=248;k>0;k--);} void main(void) { while(1) {for(dispcount=0;dispcount<8;dispcount++) { P0=tablewe[dispcount]; P1=tabledu[dispcount]; delay02s(); } } }
数码管段码表
表4-1 共阴数码管显示数字的段码表
段名称 dp g f e d c b a 对应段码
对应引脚
数字0 数字1 数字2 数字3 数字4 数字5 数字6 数字7 数字8
P1.7
0 0 0 0 0 0 0 0 0
P1.6
0 0 1 1 1 1 1 0 1
51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。
最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
大家可以参考下:
我也没调试过大家有问题可以给我留言我的邮箱zhangyi061322@
基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。
最佳答案
下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!
#include<at89x52.h>
unsigned char code
Dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码
unsigned char k; //设置全局变量k 为键盘的键值
/************************************键盘延时函数****************************/
void key_delay(void) //延时函数
{
int t;
for(t=0;t<500;t++);
}
/************************************键盘扫描函数******************************/
void keyscan(void) //键盘扫描函数
{
unsigned char a;
P2 = 0xf0; //键盘初始化
if(P2!=0xf0) //有键按下?
{
key_delay(); //延时
if(P2!=0xf0) //确认真的有键按下?
{
P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平
key_delay();
a = P2; //a作为缓存
switch (a) //开始执行行列扫描
{
case 0xee:k=15;break;
case 0xde:k=11;break;
case 0xbe:k=7;break;
case 0x7e:k=3;break;
default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平
a = P2;
switch (a)
{
case 0xed:k=14;break;
case 0xdd:k=10;break;
case 0xbd:k=6;break;
case 0x7d:k=2;break;
default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平
a = P2;
switch (a)
{
case 0xeb:k=13;break;
case 0xdb:k=9;break;
case 0xbb:k=5;break;
case 0x7b:k=1;break;
default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平
a = P2;
switch (a)
{
case 0xe7:k=12;break;
case 0xd7:k=8;break;
case 0xb7:k=4;break;
case 0x77:k=0;break;
default:break;
}
}
}
break;
}
}
}
}
/****************************** ***主函数*************************************/ void main(void)
{
while(1)
{
keyscan(); //调用键盘扫描函数
switch(k) //查找按键对应的数码管显示代码
{
case 0:P0=Dig[0];break;
case 1:P0=Dig[1];break;
case 2:P0=Dig[2];break;
case 3:P0=Dig[3];break;
case 4:P0=Dig[4];break;
case 5:P0=Dig[5];break;
case 6:P0=Dig[6];break;
case 7:P0=Dig[7];break;
case 8:P0=Dig[8];break;
case 9:P0=Dig[9];break;
case 10:P0=Dig[10];break;
case 11:P0=Dig[11];break;
case 12:P0=Dig[12];break;
case 13:P0=Dig[13];break;
case 14:P0=Dig[14];break;
case 15:P0=Dig[15];break;
default:break; //退出
}
}
}
/**********************************end***************************************/。