导航:首页 > 操作系统 > 单片机数码管显示9999

单片机数码管显示9999

发布时间:2022-08-21 04:32:45

㈠ 四位数码管显示0到9999 四个按键控制数字加减清零用51单片机C 语言

#include <reg52.h>
//P0是数码管。P1是LED.P2是按键
sbit KEY_OUT_1 = P2^3;
sbit KEY_OUT_2 = P2^2;
sbit KEY_OUT_3 = P2^1;
sbit KEY_OUT_4 = P2^0;

#define uchar unsigned char
#define ulint unsigned long
#define Frequency 10//定时器中断时间 = f*T
#define Time 1//一个周期1ms
#define TubeNumber 6//数码管个数
#define KeyLine 4//矩阵按键行数
#define KeyColumn 4//矩阵按键列数
//数码管真值表
uchar code LED_Number[]={0x0C,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//uchar code LED_Alphabet[]={0x88,0x83,0xC6,0xA1,0x86,0x8E,0x89,0xC7,0x8C,0xC1,0x91,0x9C};
/*0~9
A~F (b 、d为小写) H L P U y o */
uchar LED_Buff[TubeNumber]={0xff,0xff,0xff,0xff,0xff,0xff};
/*数码管显示缓冲区,0xff确保初始时都不亮.
不可写成uchar code LED_Buff[]。code定义变量写入room,不可修改*/
// 矩阵按键编号到标准盘码的映射表
uchar code KeyCodeMap[4][4] = {
( 0x31, 0x32, 0x33, 0x26 ), // 数字键 1、数字键 2、数字键 3、向上键
( 0x34, 0x35, 0x36, 0x25 ), // 数字键 4、数字键 5、数字键 6、向左键
( 0x37, 0x38, 0x39, 0x28 ), // 数字键 7、数字键 8、数字键 9、向下键
( 0x30, 0x1B, 0x0D, 0x27 )}; // 数字键 0、ESC 键 、回车键 、向右键
uchar StaFlag[KeyLine][KeyColumn] ={(1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1)};//按键是否稳定标志
void StartTime0();
void TubeDisplay(ulint sec);
ulint pow(x,y);
void TubeScan();
void KeyAction(uchar keycode);
void KeyDriver();
void KeyScan();
void main ()
{
P1 = 0x08;//使能U3,选择数码管。
StartTime0();
while(1)KeyDriver();
}
//定时器0启动函数
void StartTime0()
{
EA = 1;
ET0 = 1;
TMOD = 0x01;
TH0 = (65536 - Time * 100) / 256;
TL0 = (65536 - Time * 100) % 256;
PT0 = 1;
/*定时器0优先中断控制位。
IP 这个寄存器的每一位,表示对应中断的抢占优先级,每一位的复值都是0,当我们把某一位设置为1的时候,这一位优先级就比其它位的优先级高了。
比如我们设置了 PT0位为1后, 当单片机在主循环或其他中断程序执行时,一旦TO发生中断,作为更高优先级,程序马上执行T0.若在T0程序执行时,
其他中断程序发生中断,仍执行TO直到T0中断结束后再执行其他程序。
*/
}
//中断服务函数
void To_time0()interrupt 1 using 0
{
static uchar cnt;//记录TO中断次数
// static ulint sec;//记录经过秒速
//判断是否溢出
if (TF0 == 1)
{
TF0 = 0;
TH0 = (65536 - Time * 100) / 256;
TL0 = (65536 - Time * 100) % 256;
}

if (cnt >= Frequency)
{
cnt = 0;
//sec++;
// Tube_Display(sec);
TubeScan();
KeyScan();
}
}
//数码管显示函数
void TubeDisplay(ulint nom)
{
uchar m = 2;//小数部分位数
uchar i;//传输索引
//秒速达到上限清零
if (nom > pow(10,TubeNumber - m))nom = 0;
//分别传输小数部分和整数部分
for(i=0; i<m; i++)
LED_Buff[i] = LED_Number[nom/pow(10,i)%10];
for(i=0; i<(TubeNumber - m); i++)
LED_Buff[i+m] = LED_Number[nom/pow(10,i)%10];
//点亮小数点
LED_Buff[m] &= 0x7f;
}
//平方运算函数
ulint pow(x,y)//x为底,为幂
{
ulint p,i = 1;
//平方运算
for(i=1; i<=y; i++)
p*=x;
//输出结果
return p;
}
//数码管动态函数
void TubeScan()
{
static uchar i = 0;//动态扫描索引
//关闭所有段选位,数码管消隐
P0 = 0xff;
//for (i=0; i < Tube_number; i++)
P1 = (P1 & 0xf8) | i;//位选索引赋值到P1口低3位
P0 = LED_Buff[i];//缓冲区中的索引位置数据传输到P0口
if (++i >= TubeNumber)i=0;//索引递增循环,遍历整个缓冲区
}
//矩阵按键动作函数
void KeyAction(uchar keycode)
{
static ulint result;
ulint nom = 0;
//输入数字0~9
if ((keycode >= 0x30) && (keycode <= 39))
{
nom = (nom*10) + (keycode - 0x30);//十进制整体左移,新数进入各位
TubeDisplay(nom);
}
//输入方向键
if ((keycode >= 0x25) && (keycode <= 28))
switch (keycode)
{
case 0x26:result += nom; nom = 0; TubeDisplay(result);
case 0x28:result -= nom; nom = 0; TubeDisplay(result);
case 0x25:result = 1; result *= nom; nom = 0; TubeDisplay(result);
case 0x27:result = 1; result /= nom; nom = 0; TubeDisplay(result);
}
else if (keycode == 0x0d)TubeDisplay(result);//输入回车键,输出最终结果
else if (keycode == 0x1b)//输入ESC键,清零
{
nom = result = 0;
TubeDisplay(nom);
}
}
//矩阵按键驱动函数
void KeyDriver()
{
uchar l,c;
static uchar backup[KeyLine][KeyColumn] = {(1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1)};//按键值备份,保存前一次值
for(l=0; l<KeyLine; l++)
{
for(c=0; c<KeyColumn; c++)
{
if (backup[l][c] != StaFlag[l][c])
{//检测按键动作
if (backup[l][c] == 1)//按键按下时执行
KeyAction(KeyCodeMap[l][c]);//调用动作函数
backup[l][c] = StaFlag[l][c];//刷新前一次备份值
}
}
}
}
//矩阵按键扫描函数
void KeyScan()
{
uchar l = 0;//矩阵按键扫描输出索引
uchar c = 0;//矩阵按键扫描列索引
uchar keybuff [KeyLine][KeyColumn] = {(0xff,0xff,0xff,0xff),(0xff,0xff,0xff,0xff),
(0xff,0xff,0xff,0xff),(0xff,0xff,0xff,0xff)};//矩阵按键扫描缓冲区
//将一行的四个按键移入缓冲区
for(l=0; l<KeyColumn; l++)
keybuff [l][c] = ((0xfe | (P2 >> (4 + l)) & 0x01));
//按键消抖
for(l=0; l <KeyLine; l++)
{
if((keybuff [l][c] & 0x0f) == 0x00)//连续4次扫描都为0,判断4*4ms内都是按下状态,可认为按键已稳定按下
StaFlag[l][c] = 0;
else if ((keybuff [l][c] & 0x0f) == 0x0f)//连续4次扫描都为1,判断4*4ms内都是弹起状态,可认为按键已稳定弹起
StaFlag[l][c] = 1;
}
for(c=0; c <KeyColumn; c++)
{
switch (c) // 根据索引,释放当前输出脚 拉低下次的根据索引
{
case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break;
case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break;
case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break;
case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break;
default: break;
}
}
}

㈡ 51单片机修改4位9999倒计时,程序如下,哪里出了错,为什么不能正常显示

void clock()
{
adj_sec++; //秒调整变量自增
if(adj_sec > SECOND) //判断1秒钟是否到
{
adj_sec = 0; //到了1秒钟,秒调整变量清零
sec--; //秒钟变量减1
if(sec == 255) //判断99秒是否到完
{
sec = 99; //到完99秒,秒钟变99秒
min--; //分钟变量减1
if(min == 255) //判断99倒计时完
{
min = 99; //倒计时完99分钟中,分钟恢复99
}
……
255,就是-1的补码

㈢ C51单片机:用数码管显示0到999的值。求c语言程序和原理图

#include<reg51.h>

#define uchar unsigned char

uchar temp;

int key1,key,disbuf;// 此表为 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f

unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

unsigned char ledx[8];

bit s0,s1;

void delay(uchar z)

{

uchar i,j;

for(i=0;i<120;i++)

for(j=0;j<z;j++);

}

void scan() //要是按键了,扫描键盘编码值

{

P1=0xF0;

delay(1);

temp=P1;

switch(temp)

{

case 0xe0: key1=0;

break;

case 0xd0: key1=1;

break;

case 0xb0: key1=2;

break;

case 0x70: key1=3;

break;

}

P1=0x0f;

delay(1);

temp=P1;

switch(temp)

{

case 0x0E: key=key1+0;

break;

case 0x0D: key=key1+4;

break;

case 0x0B: key=key1+8;

break;

case 0x07: key=key1+12;

break;

default : key=-1;

}

if((key1+1)&&(key+1)) disbuf=key;

}

void ejjc() //判断是否按键

{

P1=0xF0;

if(P1!=0xF0) { scan();s0=1;}

else { s0=0; s1=1;}

}

void main()

{

uchar i;

while(1)

{

ejjc();

if(s0==1 && s1==1)

{

s0=0;s1=0;

for(i=0;i<8;i++)

{ ledx[i]=ledx[i+1]; ledx[8]=disbuf; }

}

P0=0xff;

P2=LED7Code[ledx[0]];

P0=0xfe;

delay(5);

P0=0xff;

P2=LED7Code[ledx[1]];

P0=0xfd;

delay(5);

P0=0xff;

P2=LED7Code[ledx[2]];

P0=0xfb;

delay(5);

P0=0xff;

P2=LED7Code[ledx[3]];

P0=0xf7;

delay(5);

P0=0xff;

P2=LED7Code[ledx[4]];

P0=0xef;

delay(5);

P0=0xff;

P2=LED7Code[ledx[5]];

P0=0xdf;

delay(5);

P0=0xff;

P2=LED7Code[ledx[6]];

P0=0xbf;

delay(5);

P0=0xff;

P2=LED7Code[ledx[7]];

P0=0x7f;

delay(5);

}

}

㈣ 求AT89S52单片机 9999秒倒计时 asm程序

用AT89S52单片机 做9999秒倒计时,应该四位数码管显示,用定时器定时得到1秒,就可以计秒了。 asm程序是汇编程序,不是组合程序。

㈤ 单片机数码管显示0到999c语言程序怎么编

#include<reg51.h>

unsigned char xs_d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

unsigned int time=0,s,sz;delay(unsigned int k)
{

unsigned int i,j;

for(i=0;i<k;i++)

for(j=0;j<125;j++);

}INT_0()interrupt 0

{ delay(10);

if(INT0==0){sz++;<br> if(sz>2){sz=0;}

}
}

void T0_int()interrupt 1
{

TH0=(65535-50000)/256;//设置初值

TL0=(65535-50000)%256;

s++;
if(s>20){s=0;<br> if(sz==1)time++;<br> if(time>999){time=0;}

if(sz==0){time=0;//清零<br> }



(5)单片机数码管显示9999扩展阅读:

运算器由运算部件——算术逻辑单元(Arithmetic & Logical Unit,简称ALU)、累加器和寄存器等几部分组成。

ALU的作用是把传来的数据进行算术或逻辑运算,输入来源为两个8位数据,分别来自累加器和数据寄存器。ALU能完成对这两个数据进行加、减、与、或、比较大小等操作,最后将结果存入累加器。

运算器有两个功能:

(1) 执行各种算术运算。

(2) 执行各种逻辑运算,并进行逻辑测试,如零值测试或两个值的比较。

运算器所执行全部操作都是由控制器发出的控制信号来指挥的,并且,一个算术操作产生一个运算结果,一个逻辑操作产生一个判决。



㈥ 单片机,使用汇编语言使led数码管每隔1秒轮流显示数字0000-9999,这个怎么样做呀

这是四位数的秒计数器,用四位一体共阴数码管显示,P0口输出段码,P2口输出位码。用定时器定时器50ms,采用中断方式,中断20次为1秒,显示数字加1。

阅读全文

与单片机数码管显示9999相关的资料

热点内容
图的算法有什么用 浏览:793
柜式空调压缩机在哪里 浏览:724
创建多级文件夹视频讲解 浏览:195
计算机有很多空文件夹能删吗 浏览:486
android44w下载 浏览:248
测排卵app哪个好用 浏览:622
平时解压方法图解 浏览:56
php多长时间能学会 浏览:308
apex服务器选什么好 浏览:595
nds编译 浏览:110
各个击破法动态规划法贪婪算法 浏览:533
柱端部为什么要加密 浏览:891
c单链表排序算法 浏览:362
python邻接链表 浏览:369
外国解压的视频说话助眠 浏览:115
查看php扩展版本 浏览:239
社保卡加密机放在信息中心 浏览:95
python3爬取网页数据 浏览:621
超级主升幅图公式源码 浏览:22
2核2g服务器有什么用 浏览:494