初学者上手的简单程序,把下面代码复制进keil代码窗口,烧进51hei开发板,看看结果吧
#include
#define uchar unsigned char
#define uint unsigned int
#define dp P0
char code DuanMa[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40}; //单个数码管显示数
char code fenjie[]={0,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f};
char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码管的位选择:从0到7.
sbit LATCH1=P2^6; // 控制数码管段的位
sbit LATCH2=P2^7; // 控制数码管位的位
void delay(unsigned int t)
{
while(--t);
}
void main()
{
int i,j,k;
while(1)
{
delay(5000);
for(i=0;i<7;i++) //段码
{
for(j=0;j<8;j++) //位码
{
for(k=0;k<10;k++) //调节k的值可调节扫描时间
{
dp=WeiMa[j]; //取位码
LATCH2=1;
LATCH2=0;
dp=DuanMa[i]; //取段码
LATCH1=1;
LATCH1=0;
delay(2500);
dp=fenjie[i]; //取段码
LATCH1=1;
LATCH1=0;
dp=WeiMa[7]; //取位码
LATCH2=1;
LATCH2=0;
delay(50);
dp=0; //取段码 清零 减小余晖影响
LATCH1=1;
LATCH1=0;
dp=WeiMa[j]; //取位码
LATCH2=1;
LATCH2=0;
delay(1000);
}
}
}
//闪烁8
for(k=0;k<10;k++)
{
dp=fenjie[7]; //取段码
LATCH1=1;
LATCH1=0;
dp=WeiMa[7]; //取位码
LATCH2=1;
LATCH2=0;
delay(6000);
delay(6000);
dp=0; //取段码
LATCH1=1;
LATCH1=0;
dp=WeiMa[7]; //取位码
LATCH2=1;
LATCH2=0;
delay(6000);
}
}
}
关键字:C51 动态扫描
引用地址:
一个好玩的C51动态扫描小程序
推荐阅读最新更新时间:2024-03-16 14:23
C51(DHT11)温湿度+LCD1602
前言:软件延时真的很坑,校园网真的很烂 直接上码 LCD1602部分 (1).LCD1602.C #include reg52.h #include LCD1602.h #include INTRINS.h sbit LCD_RS=P2^6; sbit LCD_RW=P2^5; sbit LCD_E=P2^7; #define LCD_DatrPort P0 //指令函数 void LCD_WeitrCommand(unsigned char Command) { LCD_RS=0;//0写指令,1写数据 LCD_RW=0;//write mode LCD_DatrPort=Command; LCD_E
[单片机]
掉电保护和看门狗复位C51程序
这个是一个硬件看门狗和用at24c02保存掉电数据的程序,希望对大家有所帮助已经测试通过的. #include reg51.h #include "IIC.h" #define ADDR 0x20 //存储地址 sbit led1=P2^7; //掉电现象 sbit led2=P2^6; //看门狗复位现象 sbit WDI=P2^5; //喂狗位 uint watch=100; //喂狗次数 uchar wbuf,rbuf; //写数据读数据变量 bit flag=0; //掉电标志 /*******外部中断,下降沿触发**************/ void intinit() { EA=1; EX0
[单片机]
C51---独立按键控制LED显示二进制
原理图 mian函数 通过按键1不断+1 LED显示二进制亮灭 因为LED一共8个 最高显示二进制1111 1111 即255 #include REGX52.H //0 num 65535 void Delay_ms(unsigned int num) //@12.000MHz { unsigned char i, j; while(num) { i = 2; j = 239; do { while (--j); } while (--i); num--; } } void main() { unsigned char LEDNum = 0; while(1) { if(P
[单片机]
pic数码管动态扫描显示程序
#include p IC .h //包含 单片机 内部资源预定义 __CONFIG(0x1832); //芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡 void delay(); //delay函数申明 void init(); //I/O口初始化函数申明 const char TABLE ={0xc0,0xf9,0xa4,0xb0,0x99,0x92}; //定义常数0-5的数据表格 void main() //主函数 { while(1) //死循环,让 数码管 持续点亮 {
[单片机]
C51非阻塞延时流水灯
#include reg52.h unsigned char counter=0; void delay()interrupt 1 using 1 { TL0|=0x00; TH0=0x4C; counter++; } main() { unsigned char i=1; TMOD=1; TR0=1; EA=1; ET0=1; TH0=0x4C; TL0=0x00; while(1) { if(counter==10) { counter=0; P1=~i; i =1; if(i==0) i=1; } } } 采用T0方式1定时,11.0592Mhz晶振,延时50ms。
[单片机]
Keil C51 总线外设操作问题的深入分析
阅读了《单片机与嵌入式系统应用》2005年第10期杂志《经验交流》栏目的一篇文章《Keil C5l对同一端口的连续读取方法》(原文)后,笔者认为该文并未就此问题进行深入准确的分析。文章中提到的两种解决方法并不直接和简单。笔者认为这并非是Keil C51中不能处理对一个端口进行连续读写的问题,而是对Keil C51的使用不够熟悉和设计不够细致的问题,因此特撰写本文。
本文中对原文提到的问题,提出了三种不同于原文的解决方法。每种方法都比原文中提到的方法更直接和简单,设计也更规范。(无意批评,请原文作者见谅)
1 问题回顾和分析
原文中提到:在实际工作中遇到对同一端口反复连续读取,Keil C5l编译并未达到预期的结果。原文作
[单片机]
C51全局初始化及精确延时程序,51单片机精确延时程序
/********************************************************************************************************* * Initialization Program * QiZhao,2007 * All Rights Reserved * File : initial.h * By : QiZhao * Contact :zq1987731@163.com * * Version : V2.1 γ * Corrector : QiZhao * Date : 2008.2.1 (Last modified) * * Remarks :
[单片机]
C51程序设计中的编程中的字节对齐问题
一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐,会在存取效率上带来损失。比如
[单片机]