数码管显示(静态+动态),按下k1k2数码管数字加一,按下k3k4数码管数字减一,k1k3控制数码管左四位,k2k4控制数码管右四位。(加需要能加到100,减需要能减到-10)。
时间: 2023-04-05 11:03:49 浏览: 48
这是一个关于数码管显示和控制的问题,我可以回答。根据题目要求,可以通过按下k1k2和k3k4来实现数码管数字的加减,同时k1k3和k2k4可以控制数码管的左四位和右四位。需要注意的是,加需要能加到100,减需要能减到-10。
相关问题
写一段程序使数码管显示(静态+动态),按下k1k2数 码管数字加一,按下k3k4数码管数字减一,K1k3 控制数码管左四位,k2k4控制数码管右四位。 (加需要能加到100,减需要能减到-10)。
很高兴回答你的问题。以下是程序代码:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit k1 = P1^;
sbit k2 = P1^1;
sbit k3 = P1^2;
sbit k4 = P1^3;
uchar code table[] = {x3f, x06, x5b, x4f, x66, x6d, x7d, x07, x7f, x6f};
uchar num[8] = {, , , , , , , };
uchar flag = ;
void delay(uint xms)
{
uint i, j;
for(i=xms; i>; i--)
for(j=110; j>; j--);
}
void display()
{
uchar i;
for(i=; i<8; i++)
{
switch(i)
{
case : P2 = xfe; break;
case 1: P2 = xfd; break;
case 2: P2 = xfb; break;
case 3: P2 = xf7; break;
case 4: P2 = xef; break;
case 5: P2 = xdf; break;
case 6: P2 = xbf; break;
case 7: P2 = x7f; break;
}
P = table[num[i]];
delay(1);
P = x00;
}
}
void keyscan()
{
if(k1 == )
{
delay(10);
if(k1 == )
{
num[]++;
if(num[] > 9)
num[] = ;
flag = 1;
}
while(!k1);
}
if(k2 == )
{
delay(10);
if(k2 == )
{
num[1]++;
if(num[1] > 9)
num[1] = ;
flag = 1;
}
while(!k2);
}
if(k3 == )
{
delay(10);
if(k3 == )
{
num[2]--;
if(num[2] < )
num[2] = 9;
flag = 1;
}
while(!k3);
}
if(k4 == )
{
delay(10);
if(k4 == )
{
num[3]--;
if(num[3] < )
num[3] = 9;
flag = 1;
}
while(!k4);
}
}
void main()
{
while(1)
{
keyscan();
if(flag)
{
flag = ;
if(num[] == 1 && num[1] == && num[2] == && num[3] == )
{
num[] = ;
num[1] = ;
num[2] = ;
num[3] = ;
}
if(num[] > 1 || (num[] == 1 && num[1] > ))
{
num[] = 1;
num[1] = ;
num[2] = ;
num[3] = ;
}
if(num[] < || (num[] == && num[1] == && num[2] == && num[3] < -1))
{
num[] = ;
num[1] = ;
num[2] = ;
num[3] = -1;
}
display();
}
}
}
写一段程序使静态数码管显示按下k1k2数 码管数字加一,按下k3k4数码管数字减一,K1k3 控制数码管左四位,k2k4控制数码管右四位。 (加需要能加到100,减需要能减到-10)。
我可以回答这个问题。以下是程序代码:
#include <reg52.h>
sbit k1 = P1^; //定义按键k1
sbit k2 = P1^1; //定义按键k2
sbit k3 = P1^2; //定义按键k3
sbit k4 = P1^3; //定义按键k4
sbit dula = P2^6; //定义段选锁存器控制端
sbit wela = P2^7; //定义位选锁存器控制端
unsigned char code table[] = { //定义数码管显示~9的编码
xc, xf9, xa4, xb, x99, x92, x82, xf8, x80, x90
};
int num = ; //定义初始数字为
void delay(unsigned int i) { //延时函数
while(i--);
}
void display(int n) { //数码管显示函数
int i;
for(i = ; i < 8; i++) { //循环显示左右四位数码管
if(i == || i == 4) { //判断位选锁存器控制端
wela = ;
} else {
wela = 1;
}
P = table[n % 10]; //取余数显示对应数字
n /= 10; //除以10取整
dula = ; //段选锁存器控制端清零
delay(100); //延时
dula = 1; //段选锁存器控制端置1
P = xff; //清空数码管
}
}
void main() {
while(1) {
if(k1 == && k3 == 1) { //按下k1k3,左四位加一
num += 10;
if(num > 100) { //判断是否超过100
num = ;
}
}
if(k2 == && k4 == 1) { //按下k2k4,右四位加一
num++;
if(num > 99) { //判断是否超过100
num = ;
}
}
if(k3 == && k1 == 1) { //按下k1k3,左四位减一
num -= 10;
if(num < -10) { //判断是否小于-10
num = ;
}
}
if(k4 == && k2 == 1) { //按下k2k4,右四位减一
num--;
if(num < -9) { //判断是否小于-10
num = ;
}
}
display(num); //显示数字
}
}