标题:
怎样修改一下单片机代码,可以不用38译码器进行位定义?求大佬指点
[打印本页]
作者:
knight123.
时间:
2021-11-14 01:54
标题:
怎样修改一下单片机代码,可以不用38译码器进行位定义?求大佬指点
QG)A}%RGHDAJA1]KHD6L]NB.png
(149.55 KB, 下载次数: 60)
下载附件
2021-11-15 23:41 上传
单片机代码奉上:
#include "reg52.h"
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
#define GPIO_KEY P1
u8 smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
u8 t0,KeyVal,Display[8],flag,flag1,flag2,flag3;
u16 hour,minute,second;
//38译码器
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
//数码管显示函数
void Showsmg();
//延时函数
void Delay(u16 i);
//初始化函数
void Init();
//按键检测
void KeyDown();
//按键处理
void Keypross();
//数据处理
void Datapross();
//按键数字处理
void Numpross(u8 dat);
//Up功能处理
void Uppross();
//Down功能处理
void Downpross();
//Func功能处理
void Funcpross();
//Enter功能处理
void Enterpross();
//Back功能处理
void Backpross();
void main(){
Init();
while(1){
KeyDown();
Keypross();
Datapross();
Showsmg();
}
}
//数码管显示函数
void Showsmg(){
u8 i;
for(i=0;i<8;i++)
{
switch(7-i) //位选
{
case 0: LSA=0;LSB=0;LSC=0;break;
case 1: LSA=1;LSB=0;LSC=0;break;
case 2: LSA=0;LSB=1;LSC=0;break;
case 3: LSA=1;LSB=1;LSC=0;break;
case 4: LSA=0;LSB=0;LSC=1;break;
case 5: LSA=1;LSB=0;LSC=1;break;
case 6: LSA=0;LSB=1;LSC=1;break;
case 7: LSA=1;LSB=1;LSC=1;break;
}
P0=Display[i];
Delay(1);
P0=0x00;
}
}
//延时函数
void Delay(u16 i) //11.0592 1ms
{
while(i--){
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
//初始化函数
void Init(){
//参数初始化
hour=0;
minute=0;
second=0;
t0=0;
flag=0;
flag1=0;
flag2=0;
//定时器0初始化
TMOD=0x01;
TH0=(65536-9174)/256; //10ms
TL0=(65536-9174)%256;
EA=1;
ET0=1;
TR0=0;
}
//按键检测
void KeyDown(){
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f){
Delay(10);
if(GPIO_KEY!=0x0f){
GPIO_KEY=0x0f;
switch(GPIO_KEY){
case 0x07 : KeyVal=0;flag3=1;break;
case 0x0b : KeyVal=1;flag3=1;break;
case 0x0d : KeyVal=2;flag3=1;break;
case 0x0e : KeyVal=3;flag3=1;break;
}
GPIO_KEY=0xf0;
switch(GPIO_KEY){
case 0x70 : KeyVal=KeyVal;break;
case 0xb0 : KeyVal=KeyVal+4;break;
case 0xd0 : KeyVal=KeyVal+8;break;
case 0xe0 : KeyVal=KeyVal+12;break;
}
}
while((a<150) && (GPIO_KEY!=0xf0)){
Delay(1);
a++;
}
}
}
//按键处理
void Keypross(){
if(flag3==1){
flag3=0;
switch(KeyVal){
case 0:Numpross(7);break;
case 1:Numpross(8);break;
case 2:Numpross(9);break;
case 3:Uppross();break;
case 4:Numpross(4);break;
case 5:Numpross(5);break;
case 6:Numpross(6);break;
case 7:Downpross();break;
case 8:Numpross(1);break;
case 9:Numpross(2);break;
case 10:Numpross(3);break;
case 11:Funcpross();break;
case 12:Numpross(0);break;
case 13:break;
case 14:Backpross();break;
case 15:Enterpross();break;
}
}
}
//数据处理
void Datapross(){
if(flag2==1){
flag2=0;
second--;
if(second>59){
if(minute>59){
if(hour>23){
second=0;
minute=0;
hour=0;
TR0=0;
}
else{
hour--;
minute=59;
}
}
else{
minute--;
second=59;
}
}
}
Display[0]=smgduan[hour/10];
Display[1]=smgduan[hour%10];
Display[2]=0x40;
Display[3]=smgduan[minute/10];
Display[4]=smgduan[minute%10];
Display[5]=0x40;
Display[6]=smgduan[second/10];
Display[7]=smgduan[second%10];
}
//按键数字处理
void Numpross(u8 dat){
u8 tp;
if(flag==1){
switch(flag1){
case 0:tp=hour%10;hour=tp+dat*10;break;
case 1:tp=hour/10;hour=tp*10+dat;break;
case 2:tp=minute%10;minute=tp+dat*10;break;
case 3:tp=minute/10;minute=tp*10+dat;break;
case 4:tp=second%10;second=tp+dat*10;break;
case 5:tp=second/10;second=tp*10+dat;break;
}
}
}
//Up功能处理
void Uppross(){
if(flag==1){
flag1++;
if(flag1>5){
flag1=0;
}
}
}
//Down功能处理
void Downpross(){
if(flag==1){
flag1--;
if(flag1<0)
flag1=5;
}
}
//Func功能处理
void Funcpross(){
TR0=0; //停止计时
flag=1; //允许设置时间
}
//Enter功能处理
void Enterpross(){
flag=0; //清零,不允许设置时间
flag1=0;
if(hour>23)
hour=23;
if(minute>59)
minute=59;
if(second>59)
second=59;
TR0=1; //开始计时
}
//Back功能处理
void Backpross(){
//暂无功能
}
void Timer0() interrupt 1{
TH0=(65536-9174)/256; //重置
TL0=(65536-9174)%256;
t0++;
if(t0==100){
t0=0;
flag2=1;
}
}
复制代码
作者:
啤酒瓶子老大
时间:
2021-11-14 07:10
生搬硬套。哈哈。
作者:
啤酒瓶子老大
时间:
2021-11-14 11:18
坐沙发,等大佬解答。
作者:
wulin
时间:
2021-11-14 21:12
软件都是基于硬件条件编写的。楼主找的程序只适合普中的开发板,不能直接套用到这个板子上。这个截图根本看不清管脚标注,也就搞不清连接关系。乱猜没有实际意义。
作者:
188610329
时间:
2021-11-14 21:57
楼主的代码,让我想起前两天那个DS1302的帖子……,那个是38译码器的高低位不明。
你这个代码虽然和那个如出一辙。 但是从你的电路图看,你板子上压根没有38译码器阿……
作者:
wc86110
时间:
2021-11-15 06:40
买开发板得用它配套的程序这是共识,随便拿个程序来修改
作者:
18520649817
时间:
2021-12-13 00:07
为啥不用38译码器,难道你要直接用IO口吗
作者:
angmall
时间:
2021-12-13 09:49
楼主用天祥的单片机学习板 一个用的锁存器驱动位码,
找的程序只适合普中的开发板 一个用的38译码器驱动位码,
你程序直接移过去,绝对是跑不起来的。
作者:
Hephaestus
时间:
2021-12-13 11:32
三八译码器是用三根线扩展成八根线,主要更改在硬件上面,你不贴硬件的图贴软件真让人摸不到头脑。
作者:
uxs
时间:
2021-12-13 12:27
用多的端口来代替38译码器的所有输出管脚
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1