C51 单片机代码问题

#include <reg52.h>
unsigned int counter;
unsigned char num;
unsigned char temp;
sbit duan=P3^3;//设定数码管段选通端,为的关闭数码管
sbit wei=P3^4;//设定数码管位选通端,为的关闭数码管

unsigned char code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //列位
unsigned char code Dispay[3][8]={
{0x00,0x36,0x49,0x41,0x22,0x14,0x08,0x00},//红心字符
{0x00,0x36,0x49,0x41,0x22,0x14,0x08,0x00},//红心字符
{0x00,0x36,0x49,0x41,0x22,0x14,0x08,0x00} //红心字符
};

void main(void) //主程序
{
duan=0;//关闭数码管
wei=0;
TMOD=0x01; //工作方式1
TH0=(65536-3000)/256; //初值50MS
TL0=(65536-3000)%256;
EA=1;
ET0=1; //开T0中断
TR0=1; //启T0
while(1)
{; }
}

void t0(void) interrupt 1 using 0
{
TH0=(65536-3000)/256;
TL0=(65536-3000)%256;
P2=table[num]; //P2读取列位值
P0=Dispay[temp][num]; //P0读取:数组-数字和字母
num++; //按数序
if(num==8) //每组8个BIT
{num=0;}
counter++; //计时加1

}

如何控制LED灯一个一个的点亮,另求《8x8点阵提取工具》一个,做等高人指教

第1个回答  推荐于2016-09-24
畔畔字模提取软件 :
http://www.willar.com/forum_view.asp?view_id=10887
下面是LED显示驱动程序:
**********************************************************************************************/
/************* 头文件定义*************************/
/**********************************************************************************************/
#include <AT89X51.h>
#include <intrins.h>
/**********************************************************************************************/
/************数组定义***********/
/**********************************************************************************************/
unsigned char code dis_code[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};
unsigned char code dis_code_1[11]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
unsigned char data dis_buf[8];
unsigned char data dis_index;
unsigned char data dis_digit;
/**********************************************************************************************/
/************延时子程序**********/
/**********************************************************************************************/
void Delay_Led8(unsigned char ms) {
unsigned char i;
while(ms--) {
for(i = 0; i < 120; i++);
}
}
/**********************************************************************************************/
/************显示时间***************/
/************入口参数有*************/
/**********************************************************************************************/
void Display_Time(unsigned char dat_hour,unsigned char dat_min,unsigned char dat_sec) {
P2=0x00;
ET0=0;
if ((dat_hour/10)==0)
dis_buf[0] = 0x00; // 时十位消隐
else
dis_buf[0] = dis_code[dat_hour/10]; // 时十位
dis_buf[1] = dis_code[dat_hour%10]; // 时个位
dis_buf[3] = dis_code[dat_min/10]; // 分十位
dis_buf[4] = dis_code[dat_min%10]; // 分个位
dis_buf[6] = dis_code[dat_sec/10]; // 秒十位
dis_buf[7] = dis_code[dat_sec%10]; // 秒个位
dis_buf[2] = 0x40; // 显示"-"
dis_buf[5] = 0x40; // 显示"-"
ET0=1;
Delay_Led8(300);
}
/**********************************************************************************************/
/*************初始化*************/
/**********************************************************************************************/
void Int_Port() {
P0 = 0xff;
P2 = 0xff;
TMOD = 0x11; // 定时器0, 1工作模式1, 16位定时方式
TH0 = 0xFC;
TL0 = 0x17;
IE = 0x8a; // 使能timer0,1 中断
dis_digit = 0xfe;
dis_index = 0;
}
/**********************************************************************************************/
/*定时器0中断服务程序, 用于数码管的动态扫描*/
/*dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量*/
/*dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,选通P2.0口数码管*/
/*显于缓冲区基地址*/
/**********************************************************************************************/
void timer0() interrupt 1 {
TH0 = 0xFC;
TL0 = 0x17;
P2 = 0xff; // 先关闭所有数码管
P0 = ~dis_buf[dis_index]; // 显示代码传送到P0口
P2 = ~dis_digit; //
dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管
dis_index++; //
dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
}
/**********************************************************************************************/

注意:要在主程序里面写入Int_Port();这个初始程序。
这是写入数据:Display_Time(12,00,00);12点00分00秒。
我的数码管是共阳极的,如果你的是共阴极的,你改以下两个地方: P0 = dis_buf[dis_index]; P2 = dis_digit;本回答被提问者采纳
第2个回答  2009-08-01
你说的一个一个的亮,是不是让一个字上的LED一个一个的亮起,如果是这样的话,我想是用动态扫描可能不行,那样的话你要是能看出来灯一个一个的亮,那么字体就会闪烁,只能用静态的,可以先将列码选通,将段码一位一位的给,用数组,我能 想到的就这样了
第3个回答  2009-08-04
按8X8的段码自己写咯,让led有1和0就能亮或者灭咯……关键是数组
第4个回答  2009-07-31
直接找个字模提取软件,能提出16*16点阵的!

谁能帮我检查下,这个C51单片机的汇编语言有什么错误!
存在以下几个问题:1. 在按键的延时去抖动后,没有重新读取按键键值,即:L8: ACALL DELAY CJNE A,#0FFH,SAVE 这两条指令中间应插入:MOV A, P1,否则你用来比较的A还是第一次读到的A 2. 你在检测到按键按下后,没有等待键释放再去检测下一个按键。从你的程序中看,检测到按键按下后,蜂鸣...

89c52系列的c51单片机开发版刚买来的,烧入代码后没有写蜂
刚入手的89c52系列C51单片机开发版,尝试烧入代码后却并未实现预期功能,如蜂鸣器的激活。这反映出开发过程中的几个关键问题,需深入探讨。首先,硬件知识的缺失是入门单片机开发的一大障碍。对于蜂鸣器的接线位置、所连接的P口引脚等基本硬件配置,若不清楚,将直接影响到后续代码的正确性。因此,熟悉硬件原...

c51单片机程序编译时错误:error c236:‘——display’:different length...
count是uchar,还是uint?我猜想,你的count是uint。很可能问题在这里。

C51单片机里关于xbyte的问题
这个主要是在用C51的P0,P2口做外部扩展时使用,其中XBYTE [0x0002],P2口对应于地址高位,P0口对应于地址低位。--对。一般P2口用于控制信号,P0口作为数据通道。--P2 是地址高八位。--读、写控制信号分别在 P3.6 和 P3.7。假设我P2口和P0口接的外部扩展不是RAM,而是液晶屏要怎么理解?

C51 while()循环问题 下面这个while()循环是怎么跳出来的?
如果SendIic_Mlx()返回1,表示对方没有应答,也就是没有成功。所以就循环,直到所有b1,b2,b3,b4都 返回0,才说明这4个数据都发送成功了。数据完全正确,于是循环结束。当然这样的程序是“不健状”的,因为一旦IIC总线开路或总线器件故障,这就 是一个死循环,造成单片机无响应。应该采用定时,时间...

c51单片机排序问题
LJMP SORT ORG 50H DB 55H,66H,0AAH,44H,77H,22H,88H,00H,33H,55H,99H SORT: ;最简短、高效的排序程序.MOV B, #0AH ;第一轮排序时,比较0AH次.S1: MOV R0, #50H ;数据区的起始地址.CLR PSW.5 ;清除"交换"标志位.MOV R7, B S2: MOV A, @R0 ;取前一个数.INC R0 CLR...

C51代码功能不能实现,请高手帮忙看看
用keil编译,能否通过,通过后,烧录到开发板就看到运行效果对不对了。要仿真,更简单了,用proteus画一个仿真图,加载HEX代码,运行仿真,也能看运行效果。这样都做下来,自己就知道程序对不对了,而不是只写个程序就算学单片机啦。主程序要有while(1)主循环语句。最后一个while(!KEY);删掉。

C51单片机调试问题:*** error 65: access violation at C:0x0400...
你的代码 入口点 指定了吗》?在启动文件里!startUp.s 文件里,如果没有的话,程序只能从0x0开始执行啊!而在0x0都是NOP!你的 ORG 30H 说明第一条指令在 0x30处,但是你执行是从0x0开始的,故执行不到你的程序那里去!你把你的代码 改成 ORG 0H 试试 ...

单片机C51程序问题,实现了秒表功能,但是为什么在256秒后就归0了??我...
uchar i=0; 数据类型,改成 uint

单片机C51这个错在哪
以下是单片机实践团为您解答:1)请下载:C51FPS.LIB放到,目录:c:\\keil\\c51\\lib即可。2)问题分析:你包含了头文件stdio.h,里面有些实体是在这个C51FPS.LIB中的,我猜测的。3)为什么这么说呢,你的keil版本太老了(而且组件不全),一看就知道,建议使新版本的避免不必要的麻烦。4)还要请参考...

相似回答
大家正在搜