历史上的今天
返回首页

历史上的今天

今天是:2025年12月07日(星期日)

正在发生

2022年12月07日 | Proteus入门单片机(4)例程分析

2022-12-07 来源:zhihu

硬件连接:


P1.0-P1.7连接led1到led8


P0.0-P0.7连接led9到led16


P2.1连接模式按键


P2.4连接加速按键


P2.5连接减速按键


P3.0-P3.7连接共阳极数码管


现象:


上电后led1到led16循环点亮(一瞬间只有一个在亮),此时数码管显示零


按下模式按键,数码管变为1,led点亮方式发生变化,一共有0-8九种模式


在每种模式下都可以加速减速,效果在其余模式保留,最快最慢无法判定


代码:


#include


unsigned char RunMode;

//**********************************System Fuction*************************************************

void Delay1ms(unsigned int count)

{

unsigned int i,j;

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

}


unsigned char code LEDDisplayCode[] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, //0~7

                                 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};


void Display(unsigned char Value)

{

P3 = LEDDisplayCode[Value];

}


void LEDFlash(unsigned char Count)

{

unsigned char i;

bit Flag;

for(i = 0; i {

Flag = !Flag;

if(Flag)

Display(RunMode);

else

Display(0x10);

Delay1ms(100);

}

Display(RunMode);

}


unsigned char GetKey(void)

{

unsigned char KeyTemp,CheckValue,Key = 0x00;

CheckValue = P2&0x32;

if(CheckValue==0x32)

return 0x00;

Delay1ms(10);

KeyTemp = P2&0x32;

if(KeyTemp==CheckValue)

return 0x00;


if(!(CheckValue&0x02))

Key|=0x01;

if(!(CheckValue&0x10))

Key|=0x02;

if(!(CheckValue&0x20))

Key|=0x04;

return Key;

}


unsigned int TimerCount,SystemSpeed,SystemSpeedIndex;

void InitialTimer2(void)

{

T2CON  = 0x00; //16 Bit Auto-Reload Mode

  TH2 = RCAP2H = 0xFC;  //重装值,初始值

TL2 = RCAP2L = 0x18;

ET2=1; //定时器 2 中断允许

TR2 = 1; //定时器 2 启动

EA=1;

}


unsigned int code SpeedCode[]={   1,   2,   3,   5,   8,  10,  14,  17,  20,  30,

40,  50,  60,  70,  80,  90, 100, 120, 140, 160,

180, 200, 300, 400, 500, 600, 700, 800, 900,1000};//30

void SetSpeed(unsigned char Speed)

{

SystemSpeed =SpeedCode[Speed];

}


void LEDShow(unsigned int LEDStatus)

{

P1 = ~(LEDStatus&0x00FF);

P0 = ~((LEDStatus>>8)&0x00FF);

}


void InitialCPU(void)

{

RunMode = 0x00;

TimerCount = 0;

SystemSpeedIndex = 10;


P1 = 0x00;

P0 = 0x00;

P2 = 0xFF;

P3 = 0x00;

Delay1ms(500);

P1 = 0xFF;

P0 = 0xFF;

P2 = 0xFF;

P3 = 0xFF;

SetSpeed(SystemSpeedIndex);

Display(RunMode);

}


//Mode 0

unsigned int LEDIndex = 0;

bit LEDDirection = 1,LEDFlag = 1;

void Mode_0(void)

{

LEDShow(0x0001< LEDIndex = (LEDIndex+1)%16;

}

//Mode 1

void Mode_1(void)

{

LEDShow(0x8000>>LEDIndex);

LEDIndex = (LEDIndex+1)%16;

}

//Mode 2

void Mode_2(void)

{

if(LEDDirection)

LEDShow(0x0001< else

LEDShow(0x8000>>LEDIndex);

if(LEDIndex==15)

LEDDirection = !LEDDirection;

   LEDIndex = (LEDIndex+1)%16;

}

//Mode 3

void Mode_3(void)

{

if(LEDDirection)

LEDShow(~(0x0001< else

LEDShow(~(0x8000>>LEDIndex));

if(LEDIndex==15)

LEDDirection = !LEDDirection;

   LEDIndex = (LEDIndex+1)%16;

}


//Mode 4

void Mode_4(void)

{

if(LEDDirection)

{

if(LEDFlag)

LEDShow(0xFFFE<     else

LEDShow(~(0x7FFF>>LEDIndex));

}

else

{

if(LEDFlag)

LEDShow(0x7FFF>>LEDIndex);

else

LEDShow(~(0xFFFE< }

if(LEDIndex==15)

{

LEDDirection = !LEDDirection;

if(LEDDirection) LEDFlag = !LEDFlag;

}

    LEDIndex = (LEDIndex+1)%16;

}


//Mode 5

void Mode_5(void)

{

if(LEDDirection)

LEDShow(0x000F< else

LEDShow(0xF000>>LEDIndex);

if(LEDIndex==15)

LEDDirection = !LEDDirection;

    LEDIndex = (LEDIndex+1)%16;

}


//Mode 6

void Mode_6(void)

{

if(LEDDirection)

LEDShow(~(0x000F< else

LEDShow(~(0xF000>>LEDIndex));

if(LEDIndex==15)

LEDDirection = !LEDDirection;

    LEDIndex = (LEDIndex+1)%16;

}


//Mode 7

void Mode_7(void)

{

if(LEDDirection)

LEDShow(0x003F< else

LEDShow(0xFC00>>LEDIndex);

if(LEDIndex==9)

LEDDirection = !LEDDirection;

    LEDIndex = (LEDIndex+1)%10;

}


//Mode 8

void Mode_8(void)

{

LEDShow(++LEDIndex);

}


void TimerEventRun(void)

{

if(RunMode==0x00)

{

Mode_0();

}

else if(RunMode ==0x01)

{

Mode_1();

}

else if(RunMode ==0x02)

{

Mode_2();

}

else if(RunMode ==0x03)

{

Mode_3();

}

else if(RunMode ==0x04)

{

Mode_4();

}

else if(RunMode ==0x05)

{

Mode_5();

}

else if(RunMode ==0x06)

{

Mode_6();

}

else if(RunMode ==0x07)

{

Mode_7();

}

else if(RunMode ==0x08)

{

Mode_8();

}

}


void Timer2(void) interrupt 5 using 3

{

TF2 = 0; //中断标志清除( Timer2 必须软件清标志!)

if(++TimerCount>=SystemSpeed)

{

TimerCount = 0;

TimerEventRun();

    }

}

unsigned char MusicIndex = 0;

void KeyDispose(unsigned char Key)

{

if(Key&0x01)

{

LEDDirection = 1;

LEDIndex = 0;

LEDFlag = 1;

RunMode = (RunMode+1)%9;

Display(RunMode);

}

if(Key&0x02)

{

if(SystemSpeedIndex>0)

{

--SystemSpeedIndex;

SetSpeed(SystemSpeedIndex);

}

else

{

LEDFlash(6);

}

}

if(Key&0x04)

{

if(SystemSpeedIndex<28)

{

++SystemSpeedIndex;

SetSpeed(SystemSpeedIndex);

}

else

{

LEDFlash(6);

}

}

}


//***********************************************************************************

main()

{

unsigned char Key;//定义一个局部变量

InitialCPU();

InitialTimer2();


while(1)

{

Key = GetKey();

if(Key!=0x00)

{

KeyDispose(Key);

}

}

}

如何阅读别人的代码:


1.复制到自己习惯的环境,改为自己习惯的方式,边读边添加注释


2.从主函数开始阅读(自上而下),因为自定义函数和变量都会在主函数被调用


解释:


看主程序可以知道上来先做了一些初始化,包括模式设置和定时器设置


在循环里,等待按键到来,按键按下后先调整模式,此时只有数码管产生变化,中断到了才会影响到led,速度的改变是通过改变中断次数实现的。


推荐阅读

史海拾趣

客益(Guestgood)公司的发展小趣事

机顶盒,全称为数字视频变换盒(Set Top Box,简称STB),是现代家庭娱乐中不可或缺的重要设备。它作为连接电视机与外部信号源的桥梁,主要功能在于接收数字电视信号,并将其转换成适合在电视机上播放的格式。机顶盒不仅能接收来自有线电缆、卫星天线、宽带网络及地面广播的信号,还具备强大的媒体处理能力和交互功能,极大地丰富了用户的观看体验。

从技术层面看,机顶盒经历了从模拟到数字的飞跃式发展。早期的机顶盒主要用于有线电视网络的信号解扰,而现代机顶盒则支持高清、甚至4K超高清视频内容的播放,为用户带来更为细腻的画面和震撼的音效。此外,机顶盒还集成了网络交互功能,用户可以通过机顶盒连接到互联网,享受在线购物、观看网络视频、玩游戏等多元化服务,使电视机从单向接收信息的设备转变为智能互动终端。

随着科技的进步,机顶盒的功能和应用场景也在不断扩展。例如,一些先进的机顶盒支持智能语音控制,用户可以通过语音指令搜索节目、调整设置,极大地提升了使用的便捷性。同时,机顶盒还具备存储功能,用户可以将喜欢的媒体文件存储在机顶盒中,随时通过电视屏幕进行观看,享受个性化的娱乐体验。

综上所述,机顶盒作为家庭娱乐的重要组成部分,不仅承载着传输和显示数字视频信号的基本功能,还通过不断的技术创新和应用拓展,为用户提供了更加丰富、便捷、智能的观影体验。随着技术的不断进步和市场的不断扩大,机顶盒将继续在家庭娱乐领域发挥重要作用。

CLANDELL公司的发展小趣事

随着公司规模的扩大,CLANDELL公司开始积极履行社会责任。公司不仅关注自身的经济效益,还积极参与公益事业和环保活动。同时,公司还注重员工的福利待遇和职业发展,为员工提供良好的工作环境和培训机会。这些举措不仅提升了CLANDELL公司的社会形象,也为公司的可持续发展注入了新的动力。

这五个故事只是CLANDELL公司发展过程中的一部分,它们展示了公司在电子行业中的崛起之路,也反映了公司不断追求卓越、勇于创新的精神风貌。

Alorium Technology公司的发展小趣事

在电子产品市场日益同质化的背景下,CLANDELL公司意识到技术创新的重要性。公司投入大量资源研发新型电子元件,通过优化设计和材料选择,成功推出了具有更高性能、更低能耗的电子产品。这一创新不仅提升了CLANDELL公司的市场竞争力,也为整个行业带来了技术进步的推动力。

GarrettCom公司的发展小趣事

转折:2006年,GarrettCom迎来了一个重要的转折点——收购变电站网络产品领导者DYMEC公司。这一收购不仅增强了GarrettCom在变电站自动化领域的实力,还为其带来了更多的技术资源和市场份额。

影响:通过整合DYMEC的技术和产品,GarrettCom进一步巩固了其在变电站网络通信技术方面的领先地位。公司的产品和解决方案被广泛应用于全球各地的变电站项目中,为电力系统的稳定运行提供了坚实的通信保障。

Aplus Integrated Circuits公司的发展小趣事

为了保持技术领先地位,Aplus Integrated Circuits公司注重产学研合作。公司与多所高校和研究机构建立了紧密的合作关系,共同开展科研项目和技术攻关。这种合作模式不仅为公司带来了源源不断的技术创新动力,还为公司培养了一批高素质的研发人才。

Elpida Memory公司的发展小趣事

尽管有政府的支持,但Elpida Memory的经营状况并未得到根本性的改善。在经历了多年的亏损和重组后,Elpida Memory最终于2012年被美国的美光科技(Micron Technology)收购。这一收购标志着Elpida Memory正式退出了日本半导体产业的舞台,但也为其未来的发展提供了新的机遇。

问答坊 | AI 解惑

LED数码管知识简介

replyreload += \',\' + 374455;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

Windows7与wince常用开发环境的兼容性问题

最近打算买台新电脑,想试试Windows7,不知道与wince的开发环境兼容性如何 我一般用到的软件有:PB5.0 EVC VS2005 VC++6.0 ADS1.2 Keil3…

查看全部问答>

关于TE2440-II 显示问题

TE2440-II的VGA是通过CH7026来把LCD信号转换成VGA信号的,我对比了下和阳初的BSP发现个问题,TE2440-II里找不到VGAinit,而且在KERNEL里的CFW.C文件中initdisplay函数中也没有关于VGA的初始化问题,请问TE2440-II的CH7026的控制程序在哪个地方啊(芯 ...…

查看全部问答>

求助

在微软的adocepbzip安装包的adocepb\\setup\\Data Access 3.1\\Program Files\\DataAccess31\\INCLUDE目录下,有这样两个文件adoce31.idl和adocec31.idl,在命令行中执行midl adoce31.idl和midl adocec31.idl即可生成.h文件. 为什么我的生不成啊 ...…

查看全部问答>

哪里有PowerPC开发培训

11月祥佑PowerPC嵌入式系统开发培训班 开始报名了 开课时间:2008年11月,为期三天。 上课地点:上海 课程教材:《PowerPC嵌入式开发系统实验教材》 收费标准: 4000元/人 注:本次开班7折优惠:2800元/人。(含讲义费,午餐费) 课程特点: ...…

查看全部问答>

力保产品质量 佛山发布LED筒灯联盟标准

 佛山本土的LED筒灯联盟标准近日在佛山市质监局发布。据悉,该标准由佛山市标准技术研究院、佛山市照明灯具协会、中山大学佛山研究院联合本土7家LED企业发起制定。   据悉,佛山是全国最大的筒灯生产基地,筒灯产量约占全国40%左右,目前已有120 ...…

查看全部问答>

Magafunction的用法

As design complexities increase, use of vendor-specific intellectual property (IP) blocks has become a common design methodology. Altera provides parameterizable megafunctions that are optimized for Altera device architectures. ...…

查看全部问答>

定时器0中断

本帖最后由 dontium 于 2015-1-23 13:29 编辑 我从EEWORLD网站上载了一些例子,学习2812。 没有电路板,只进行软件仿真。 其中一个定时器0中断,发现不进中断。 情况是这样的,观察定时器可以计数。 本来我定时器周期设为0XFFFFFFFF. 可是计 ...…

查看全部问答>

请教,在用IAR软件仿真单步运行程序时怎样才能使它不跳入中断?

请教,在用IAR软件单步运行程序时怎样才能使它不跳入中断?…

查看全部问答>

大家一起来讨论一哈16位计数器TAR的用法(针对169)

Q1:当Timer_A的捕获比较模块工作在捕获模式(即CAP = 1)时,TAR是里面的值表示什么含义?它是在对什么进行计数? Q2:TAR中的值写入CCRx后,TAR会自动清零吗?此时TAIFG的状态和TAR有关吗?…

查看全部问答>