51单片机c语言设计,按键控制数码管,依次按下显示0到9循环
采用共阴极LED数码管,51单片机P1口输出数据:ORG 0000H
JMP MAIN
ORG 0100H
MAIN:MOV DPTR,#TAB
MOV R1,#00H
DISP:MOV A,R1
MOVC A,@A+DPTR
MOV P1,A
LCALL DELAY
INC R1
CJNE R1,#0AH,DISP
SJMP $
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHDELAY: MOV R4,#2
DELAY100MS:MOV R5,#200
DELAY5MS: MOV R6,#250
LOOP: DJNZ R6,LOOP
DJNZ R5,DELAY5MS
DJNZ R4,DELAY100MS
RET
这是最基本的编程了,给你个参考的代码:
unsigned char Number[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F 数码管
//16进制: unsinged char code led[]={0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F,};
unsigned char Char[]={0xF7,0xFc,0xb9,0xde,0xf9,0xf1,0xB8}; //A., b., C.,d.,E.,F.,L.
long int num=0;
int hnum=0,lnum=0,temp1=0,temp2=0;
void SystemInit(void)
{
PCA0MD &= ~0x40; // 关闭 WDT
PCA0MD = 0x00;
}
void SysClkInit(void)//配置系统时钟
{
OSCICN=0X83;//0X82-SYSCLK为内部时钟2分频
}
void Port_IO_Init()
{
P0MDOUT=0xff;//0X00;
P0MDIN=0xff;//
P1MDOUT=0Xff;
P2MDOUT|=0Xff;
P0SKIP=0X3C;
XBR0 = 0x02; //0x04
XBR1 = 0x40;
P0 = 0X00;
//ESPI0=1;
EA=1;
IE=0XD0;
}
void delay(int msec)
{
int i,j;
for(i=0;i<msec;i++)
for(j=0;j<256*10;j++);
}
void init_device()
{
SysClkInit();
SystemInit();
InitSPI();
Port_IO_Init();
}
//------------------------------------
void DisplayCmd(unsigned char cmd,unsigned char axleNum)
{
if(cmd>6)cmd=0;
//if(axleNum>14)axlenum=0;
P2=0x04;
P1=Char[cmd];
delay(1);
P2=0x01;
P1=Number[(axleNum/0x10)];
delay(1);
P2=0x02;
P1=Number[axleNum&0x0f];
delay(1);
}
void DisplayData(long ldata)
{
long lemp=ldata;
unsigned char port2=0x80;
int i,len,index=0;
if(ldata<0)
{
lemp=0-ldata;
ldata=lemp;
P2=0x08;
P1=0X40;
delay(1);
}
if(ldata<10)
{
index=1;
}
else if(ldata<100)
{
index=2;
}
else if(ldata<1000)
{
index=3;
}
else if(ldata<10000)
{
index=4;
}
else if(ldata<100000)
{
index=5;
}
else if(ldata<1000000)
{
index=6;
}
else if(ldata<10000000)
{
index=7;
}
else
{
index=8;
}
for(i=0;i<index;i++)
{
len=lemp%10;
lemp/=10;
P2=port2;
port2=port2>>1;
P1=Number[len];
delay(1);
}
}
//------------------------------------
void main()
{
int i,j,k=1;
init_device();
for(i=0;i<900;i++)
{
DisplayCmd(k,k*0x10+k);
DisplayData(k*1111);
j++;
if((j%100)==0)k++;
}
Command=1;
AxleNum=0x67;
SPIData=12345;
while(1)
{
ReceiverData();
DisplayCmd(Command,AxleNum);
DisplayData(SPIData);
}
}
#include<reg51.h>
sbit k1=P1^0;
#define uint16 unsigned int
#define uchar unsigned char
uchar code shuzu[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay()
{
uint16 i=1000;
while(i--);
}
void main()
{
uchar n ;
P2=0xfe;
P1=0xff;
while(1)
{
if(k1==0)
{
if(n>=9) n=0;
else n++;
P0=shuzu[n];
while(!k1);
delay();
while(!k1);
}
}
}
扩展资料:
51单片机的功能特性
1,可以仿真63K程序空间,接近64K 的16位地址空间;
2,可以仿真64Kxdata 空间,全部64K 的16位地址空间;
3,可以真实仿真全部32 条IO脚;
4,完全兼容keilC51 UV2 调试环境,可以通过UV2 环境进行单步,断点, 全速等操作;
5,可以使用C51语言或者ASM汇编语言进行调试 ;
6,可以非常方便地进行所有变量观察,包括鼠标取值观察,即鼠标放在某 变量上就会立即显示出它此的值;
7,可选 使用用户晶振,支持0-40MHZ晶振频率;
8,片上带有768字节的xdata,您可以在仿真时选 使用他们,进行xdata 的仿真;
9,可以仿真双DPTR 指针;
10,可以仿真去除ALE 信号输出. ;
11,自适应300-38400bps 的所有波特率通讯;
12,体积非常细小,非常方便插入到用户板中.插入时紧贴用户板,没有连接电缆,这样可以有效地减少运行中的干扰,避免仿真时出现莫名其妙的故障;
13,仿真插针采用优质镀金插针,可以有效地防止日久生锈,选择优质园脚IC插座,保护仿真插针,同时不会损坏目标板上的插座. ;
14,仿真时监控和用户代码分离,不可能产生不能仿真的软故障;
15,RS-232接口不计成本采用MAX202集成电路,串行通讯稳定可靠,绝非一般三极管的简易电路可比。
参考资料来源:百度百科-51单片机
#include<reg51.h>
sbit k1=P1^0;
#define uint16 unsigned int
#define uchar unsigned char
uchar code shuzu[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay()
{
uint16 i=1000;
while(i--);
}
void main()
{
uchar n ;
P2=0xfe;
P1=0xff;
while(1)
{
if(k1==0)
{
if(n>=9) n=0;
else n++;
P0=shuzu[n];
while(!k1);
delay();
while(!k1);
}
}
}
c51 实验板 编写8个按键控制程序,按下8个键,在数码管上分别显示1-8
define KEYDOWN 1 \/\/按键按下 define KEYUP 0 \/\/按键弹开 define led_date P0 \/\/LED数据口 bit key_first = 1; \/\/按键第一次按下 bit key_state = KEYUP; \/\/按键状态 uchar key_value; \/\/键值 code uchar LED[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,}...
...数码管从0开始加1,加到9,用c语言单片机编写并且要用计数器的方法编写...
在编写这个程序时,我使用了C语言和单片机技术。程序的主要功能是通过一个按钮按一下,数码管从0开始加1,加到9。具体实现方法如下:首先,我定义了两个变量:s1和P32。s1用于存储当前的数码管数值,P32是按钮的状态。然后,我定义了一个数组num,用于存储0-9的数码管显示值。数组的具体值记不得了...
c51单片机怎么用两个按键控制两个数码管的加减,加到99就好,求程序
1、首先先在proteus画出仿真图,方便仿真程序。2、接着来编写程序,先来写入头函数。2、根据自己在proteus画的图,定义一下管脚根据你的原理图进行编写。3、然后写一个延时函数,来调节流水灯的时间间隔延时时间自己定义。4、下图就是主函数,包括流水灯的反复循环和j流水灯的方向。5、检查没有错误,...
编个单片机程序,按键控制动态数码管显示00-32,位码是P1-6,P1-7,段码...
在51单片机上编写一个程序,实现按键控制数码管显示00到32,位码使用P1-6和P1-7,段码使用P0口。程序中定义了数码管显示和按键控制的函数。程序包含主函数main和两个子函数YS和XS。主函数中通过while循环不断检查按键状态,若按键被按下则调用YS函数去抖动后更新显示值,若数值超过99则置为0,若数值...
51单片机c语言设计,按键控制数码管,依次按下显示0到9循环?
假设你的是共阳极数码管,P0接数码。按键接P2^0;include<reg52.h> typedef unsinged int uint;sbit key=P2^0;unsigned char tab[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void denay(uint x){ uint i,j;for(i=x;i>0;i--)for(j=110;j>0;j--)} void main(){ u...
求两个按键控制数码管数字加减C语言程序
{ unsigned char num=0;KEY_ADD=1; \/\/按键输入端口电平置高 KEY_DEC=1;while (1) \/\/主循环 { if(!KEY_ADD) \/\/如果检测到低电平,说明按键按下 { DelayMs(10); \/\/延时去抖,一般10-20ms if(!KEY_ADD) \/\/再次确认按键是否按下,没有按下则退出 { while(!KEY_ADD);\/\/如果...
51单片机c语言设计,按键控制数码管,依次按下显示0到9循环
sbit k1=P1^0;define uint16 unsigned int define uchar unsigned char uchar code shuzu[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(){ uint16 i=1000;while(i--);} void main(){ uchar n ;P2=0xfe;P1=0xff;while(1){ if(k1==0){ if(n>...
求一单片机C语言程序:两个按键控制两个LED KEY1按一下LED1亮 再按一...
\/\/KEY1按一下LED1亮 再按一下LED1灭 \/\/KEY2按下LED2亮 LED1灭 main(){ while(1) { if (!key2) { led1 = 1; led2 = 0;} else { if(!key1) { Delay(10);if(!key1) { while(!key1);led1 = ~led1;} } } } } \/\/--- include<reg51.h> sbit key1 = P1^...
写了个单片机矩阵按键控制数码管显示数字的程序,只需要显示0到9就好...
wei=1; \/\/第一个数码管点亮 P0=table[d];} void main(){ uchar v,temp;uchar key_l,key_h;\/\/ 定义列和行 uchar key;while(1){ P2=0xf0;temp=P2;temp=temp&0xf0;if(temp!=0xf0) \/\/检测到有按键按下 { delay(10);\/\/消抖 if(temp!=0xf0)\/\/再次确认一下有否真的有按下 {...
求一单片机c语言程序:两个按键控制两个led,按键按住不放led闪烁,松手...
一个按键时程序如下:while(1){ if(key==0)\/\/按键按下 { delayms(20);\/\/延时消抖 if(key==0)\/\/再次判断按键是否按下 { while(key==0)\/\/按键没有抬起 { led=!led; delayms(200);}\/\/LED闪烁 } } else led=0;}